티스토리 뷰

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);

}

 

assassinret의 주소가 \xbf\x40으로 시작하면 안됬고, buffersfp를 비워버렸다.

rtl을 이용하되 \x40\xbf로 시작하지 않는 부분으로 rtl을 해보기로 했다.

\x40\xbf로 시작하지 않는 부분을 찾아보던중 return 함수를 찾을 수 있었다.

그래서 retret주소를 넣는 방법으로 rtl을 해보기로 했다.

 

먼저, gdb를 이용하여 ret 주소를 찾아보았다.

ret 주소 : 0x804851e

 

 

 

 

buffersfp 44bytenop로 채운 뒤, retret 주소를 넣고 system함수의 주소와 nop 4byte 그리고 /bin/sh의 주소를 넣기로 했다.

그러면, ret에서 ret로 리턴하게 되고 system 함 수로 다시 한번 리턴하여 성공할 수 있다.

 

 

 

 

 

system 함수의 주소: 0x40058ae0

/bin/sh의 주소 : 0x400fbff9

 

 

댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday