[exploit writing] 2_쉘코드로 점프 (1) First

우리는 첫 번째에서 취약점을 찾고, 이를 이용해 공격을 수행하는 공격 코드를 만드는 연습을 했다. 또한 ESP를 이용해 버퍼의 시작 부분을 임의로 가리키도록 해 공격자가 원하는 행동을 하도록 만들었다. 'JMP ESP'를 사용하는 것은 의심할 여지없이 완벽한 시나리오였다.

하지만 이것이 모든 상황에 적용되지는 않는다. 이번 장에서는 쉘코드를 실행시키거나 점프할 수 있는 몇 가지 다른 방법에 대해 다루고, 또한 버퍼의 크기가 작을 때 적용할 수 있는 차선책에 대해 알아볼 예정이다.

1. 쉘코드를 실행시킬 수 있는 몇 가지 방법

1) JMP or CALL 

: 공격자는 쉘코드의 주소를 가진 레지스터를 기본적으로 사용하며, 그 주소를 EIP에 넣어 공격을 하게 된다. (첫번째 참고) 그렇기 때문에 공격자는 애플리케이션이 실행될 때 로딩되는 DLL들 중 하나의 레지스터로 점프 하거나 Call 하는 기계어를 찾아야 한다. 또한 특정 메모리 주소로 EIP를 덮어쓰는 대신 특정 레지스터로 점프 하는 주소를 EIP에 주입할 필요가 있다.

2) pop/return 

: 만약 스택의 꼭대기에 있는 값이 공격자가 생성한 버퍼 내에 있는 주소를 가리키지 않지만, 쉘코드를 가리키는 주소가 스택 안에 존재하는 것을 본다면, pop/ret 또는 pop/pop/ret(해당 명령이 스택의 어느 위치에 존재하느냐에 따라 pop의 개수가 달라진다)와 같은 명령을 EIP로 주입함으로써 쉘코드를 로드할 수 있게 된다.

3) PUSH return 

: 이것은 'CALL register' 기술과 약간의 차이점만 보이는 방식이다. 만약 공격자가 어디에서도 'JMP register' 또는 'CALL register' 기계어를 찾을 수 없다면 그냥 스택에 주소를 입력하고 ret 처리를 해 주면 된다. 기본적으로 ret이 뒤따라 오는 'PUSH register' 명령을 찾으려 노력해야 한다. 이러한 순서를 가지는 기계어를 찾고, 이 순서에 따라 수행하는 주소를 찾은 뒤, 그 다음 EIP를 해당 주소로 덮어쓰는 기법이다.

4) JMP [reg+offset] 

: 만약 쉘코드를 포함하는 버퍼를 지시하는 레지스터가 있지만 그것이 쉘코드의 시작 위치를 가리키지는 않는다고 가정해 보자. 공격자는 레지스터로 가기 위해 필요한 바이트의 덧셈 연산을 하고, 해당 레지스터로 점프를 시켜 주는 OS 또는 애플리케이션에 포함된 DLL 파일 중 하나에서 기계어(명령)을 찾을 수 있다. 본문의 내용 중 JMP [reg]+[offset] 부분에서 자세히 다루겠다.

5) blind return 

: 지난번 글에서 현재 스택 위치를 가리키는 ESP에 대해 설명했다. RET 명령은 스택의 끝에서 4바이트만큼 'pop' 해주고, ESP에 해당 주소를 입력시켜 준다. 그러므로 공격자가 RET 명령을 수행하는 주소로 EIP를 덮어쓰게 되면, ESP에 저장된 내용을 EIP에 주입하는 결과를 효과를 누릴 수 있다.

6) 버퍼 용량 

만약 공격자가 이용할 수 있는 버퍼 용량이 (1) 제한되어 있다는 사실과 발견한다면(EIP를 덮어 쓴 후에), 하지만 EIP를 덮어쓰기 전에는 (2) 어느 정도의 용량을 확보할 수 있다면, 공격자는 제한된 용량을 가지는 버퍼에서 (1) 여유 있는 용량을 가지는 버퍼 (1) 에 대해 '점프 code'를 수행할 수 있을 것이다.

7) SEH

: 모든 애플리케이션은 OS에 의해 제공되는 예외 처리기를 기본적으로 가지고 있다. 그래서, 만약 애플리케이션 자신이 예외 처리를 사용하지 않는다 하더라도, 공격자는 SEH 핸들러를 자신이 원하는 주소로 덮어쓰고, 쉘코드로 점프를 수행하도록 할 수 있다. SEH를 사용하면 다양한 윈도우 플랫폼에 응용 가능한 공격 코드를 생성할 수 있지만, SEH를 공격 코드 작성에 사용하기 전에 추가로 몇 가지 사항을 더 이해해야 한다. 자세한 내용은 다음에 다룰 예정이다.

이번에는 그냥 소개 차원으로 여러가지 방법들을 제시해보았고
다음 게시글에는 하나씩 실행해볼 것이다.

출처 : Exploit writing by Corelan

댓글

이 블로그의 인기 게시물

윈도우 설치에서 파티션 설정 오류(NTFS)

[exploit writing] 1_스택 기반 오버플로우 (1) First

하둡 설치 오류 정리