티스토리 뷰

vampire.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 is still your friend.\n");

exit(0);

}

 

// here is changed!

if(argv[1][46] == '\xff')

{

printf("but it's not forever\n");

exit(0);

}

 

strcpy(buffer, argv[1]);

printf("%s\n", buffer);

}

 

vampire의 경우에는 \bf\xff를 검사하였다.

어떻게 할까 고민하고 있는데 기성오빠가 argv[2]nop를 많이 넣고 쉘코드를 넣어서 \xff\xfe 지점을 리턴으로 하는게 어떻냐고 해서 시도를 했지만 계속 실패하였다.

왜 그럴까 생각을 하다가 argv[2]argv[3]보다 낮은주소에 위치한다는 것을 깨달았다.

그렇다면 argv[3]nop를 많이 넣어 argv[2]에 쉘코드를 넣고 argv[2]의 주소를 낮춰 argv[2]의 주소가 \xbf\xfe 로 시작할 때 retargv[2]의 주소로 바꿔 리턴하게 하면 되지 않을까 ? 라는 생각을 하게 되었고 공격을 하였다.

 

먼저, argv[2]의 주소가 \xbf\xfe가 될 때까지 argv[3]nop를 늘려가면서 넣어보았다.

nop70000개 넣었을 때 argv[2]의 주소가 bffeeb14로 바뀌는 것을 볼 수 있었다.

argv[2]의 주소 : bffeeb14

 

ret에 아까 찾은 argv[2]의 주소를 넣고 argv[2]에 쉘코드를 넣은 뒤 argv[3]에 똑같이 nop70000개 넣었더니 성공했다.

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