저희가 지금까지 사용했던 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 에 공격을 해봅시다.
클리어 !
'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 |