티스토리 뷰

SYSTEM/bof

LEVEL8 (orge -> troll) : check argc

Notchicken 2013. 7. 19. 13:31

troll.c

#include <stdio.h>

#include <stdlib.h>

 

extern char **environ;

 

main(int argc, char *argv[])

{

char buffer[40];

int i;

 

// here is changed

if(argc != 2){

printf("argc must be two!\n");

exit(0);

}

 

// egghunter

for(i=0; environ[i]; i++)

memset(environ[i], 0, strlen(environ[i]));

 

if(argv[1][47] != '\xbf')

{

printf("stack is still your friend.\n");

exit(0);

}

 

// check the length of argument

if(strlen(argv[1]) > 48){

printf("argument is too long!\n");

exit(0);

}

 

strcpy(buffer, argv[1]);

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

 

// buffer hunter

memset(buffer, 0, 40);

 

// one more!

memset(argv[1], 0, strlen(argv[1]));

}

 

trollargv[1]의 메모리 또한 비워버렸다.

그래서, orge처럼 실행파일 이름을 변경해 argv[0]을 이용해 풀어보기로 했다.

 

우선, troll을 복사한 Troll의 이름을 16byte 쉘코드로 변경 한 뒤, argv[0]의 주소값을 찾아보았다.

argv[0]의 주소 : bffffc16

 

troll의 이름을 똑같이 16byte 쉘코드로 변경 한 뒤, bufferSFPnop로 채우고 retargv[0]의 주소를 넣어 공격하였다.

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