[exploit writing] 1_스택 기반 오버플로우 (7)
목표
JMP opcode를 찾아야 한다.*JMP opcode는 어셈블리에서 점프하는 명령어이다.
과정
1. 우리는 'JMP ESP'의 opcode가 무엇인지 이해할 필요가 있다. 이를 확인하기 위해 먼저 Easy RM to MP3를 실행하고, Windbg로 attach 해보자.2. 프로세스를 선택하고 OK를 누르면 해당 어플리케이션에 의해 로딩된 모든 dll들을 보여준다. 또한 프로세스에 디버거를 attach 하자마자 어플리케이션이 break 된다. 여기까지 완료된 후 Windbg 명령 라인에서 a(assemble) 명령을 입력하고, 그 다음으로 'JMP ESP'를 입력해 본다.
3. 다시 엔터 키를 누르고, 'JMP ESP'를 입력하기 전에 보았던 주소와 함께 u를 입력해 본다. 결과적으로 아래와 같이 7c90120e 옆에 ffe4를 볼 수 있는데, 이것은 'JMP ESP'의 opcode이다.
4. 이제 우리는 로딩된 dll들 중 하나에서 이 opcode를 찾을 필요가 있다. Windbg 창의 윗 부분에서 Easy RM to MP3에 속하는 dll을 나타내는 라인들을 찾는다.
5. 아래의 easy RM to MP3 converter파일에 있는 dll을 하나씩 확인하면서 우리가 원하는 opcode가 있는지 찾아보자.
(중간 과정은 생략하고 MSRMCcodec00.dll에서 찾은 결과를 가지고 진행하겠다.)
6. MSRMCcodec00.dll의 시작과 끝 주소를 입력해 값들을 알아보자.
7. 우리가 활용할 주소를 선택할 때 null 바이트가 들어가 있지 않은 주소가 필요하다. 앞서
도 말했지만 null 바이트는 종단 문자열이기 때문에 null 바이트 이후의 코드는 쓸모 없는 것이 되기 때문이다.
8. 앞에서 JMP ESP 주소가 null 바이트를 가지고 있으면 안 된다고 언급했다. 하지만 어떤 경우에는 null 바이트로 시작하는 주소를 사용해도 괜찮을 때가 있다. little endian 방식으로 인하여 만약 해당 주소가 null 바이트로 시작하더라도 EIP 레지스터에서는 마지막 바이트가 될 수도 있다. (ex) 00 11 22 33 -> 33 22 11 00)
9. 만약 EIP를 덮어 쓴 후 특정 payload를 보내지 않는다면 (그래서 만약 쉘코드가 EIP가 덮어 써지기 전에 삽입되면, 그것은 레지스터를 통해 접근이 가능하다) 이것은 제대로 작동할 것이다. 여기서는 쉘코드를 정상적으로 작동시키기 위해 EIP를 덮어쓴 후 페이로드를 사용할 것이다. 그러므로 그 주소는 null 바이트를 가지고 있어서는 안 된다.
10. 만약 EIP를 덮어 쓴 후 특정 payload를 보내지 않는다면 (그래서 만약 쉘코드가 EIP가 덮어 써지기 전에 삽입되면, 그것은 레지스터를 통해 접근이 가능하다) 이것은 제대로 작동할 것이다. 여기서는 쉘코드를 정상적으로 작동시키기 위해 EIP를 덮어쓴 후 페이로드를 사용할 것이다. 그러므로 그 주소는 null 바이트를 가지고 있어서는 안 된다.
11. 위에서 나온 결과를 가지고 주소를 결정할 것이다. 목록 중에서 01d6f23a 를 사용해 보자. 우선 이 주소가 'JMP ESP'를 가지고 있는지 먼저 확인해보자.
12. 만약 EIP를 0x01d6f23a로 덮어쓸 경우 JMP ESP가 실행될 것이다. ESP는 쉘코드를 가지고 있어 우리의 목적을 달성케 하는 explolit을 가지게 된다. 'NOP & break' 쉘코드로 테스트를 해보자.
출처 : Exploit Writing By Corelan
댓글
댓글 쓰기