티스토리 뷰
assassin.c
#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);
}
assassin은 ret의 주소가 \xbf와 \x40으로 시작하면 안됬고, buffer와 sfp를 비워버렸다.
rtl을 이용하되 \x40과 \xbf로 시작하지 않는 부분으로 rtl을 해보기로 했다.
\x40과 \xbf로 시작하지 않는 부분을 찾아보던중 return 함수를 찾을 수 있었다.
그래서 ret에 ret주소를 넣는 방법으로 rtl을 해보기로 했다.
먼저, gdb를 이용하여 ret 주소를 찾아보았다.
ret 주소 : 0x804851e
buffer와 sfp 44byte는 nop로 채운 뒤, ret에 ret 주소를 넣고 system함수의 주소와 nop 4byte 그리고 /bin/sh의 주소를 넣기로 했다.
그러면, ret에서 ret로 리턴하게 되고 system 함 수로 다시 한번 리턴하여 성공할 수 있다.
system 함수의 주소: 0x40058ae0
/bin/sh의 주소 : 0x400fbff9
'SYSTEM > bof' 카테고리의 다른 글
LEVEL17 (zombie_assassin -> succubus) : function calls (0) | 2013.08.27 |
---|---|
LEVEL16 (assassin -> zombie_assassin) : fake ebp (0) | 2013.08.23 |
LEVEL14 (bugbear -> giant) : RTL2, only execve (1) | 2013.07.19 |
LEVEL13 (darkknight -> bugbear) : RTL1 (0) | 2013.07.19 |
LEVEL12 (golem -> darkknight) : sfp (0) | 2013.07.19 |
- Total
- Today
- Yesterday