이번에 풀이할 문제는 TamuCTF의 Handshake 문제다. 솔직히 이 문제를 처음 봤을 때 TCP의 handshake가 생각이 나서 네트워크, 소켓 관련이 아닐까하고 좀 쫄았었다.
pancake 문제와 마찬가지로 handshake 파일 하나만 주어져 있었다.
문제 파일을 실행해보면 secret handshake가 뭔지 물어보고 입력을 받는다. 그 다음 입력 값이 맞지 않다면 "입력 값이 맞지 않아, 너는 여기오면 안돼"라는 문구를 출력한다.
checksec 명령어로 보호기법을 확인해보니 NX bit만 걸려 있었다. 이 문제 역시 stack overflow 취약점일 가능성이 있는 것 같다.
ida로 main 함수를 확인해보니 vuln 함수를 호출하고 lose 함수를 호출하는 것을 볼 수 있다.
왠지 취약해 보이는 vuln 함수를 살펴봤다.
입력을 vuln 함수에서 받는거 같은데, 문제는 입력 함수가 gets라는 점이다.
lose 함수 역시 살펴봤다.
lose 함수는 "That isn't correct...."를 출력해주는 역할을 한다.
입력 값 검증 로직이 안보이는 것을 봐서 무슨 값을 입력해도 lose 함수를 호출해 "That isn't correct...."를 출력해준다.
하지만 입력 값을 gets라는 bof에 취약한 함수로 받기 때문에 stack overflow를 통한 ret 변조로 실행 흐름을 바꿀 수 있다.
마침 win이라는 flag를 읽어주는 함수가 존재하기 때문에 gets를 통해 stack overflow를 일으켜 ret를 win의 주소로 변조하면 될 것 같다.
gdb와 계산기를 통해 gets 함수를 통해 입력 받은 값이 저장되는 주소와 ret 값이 존재하는 주소의 차가 44라는 것을 확인했으므로 44byte만큼 더미 값을 입력하고 win 함수의 주소를 추가로 입력해준다면 flag를 얻을 수 있을 것이다.
win의 주소는 0x080491c2라는 것을 확인했고 aslr도 걸려있지 않다는 것을 확인했으니 이대로 exploit 하면 될 것 같다.
from pwn import *
payload = b'A' * 44 + p32(0x080491c2) # payload
p = remote("localhost", 4444) # 서버 접속
#p = process("./handshake") 로컬
p.sendline(payload) # payload 전송
p.interactive()
'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 - Pancake (0) | 2021.04.25 |
PlaidCTF - Plaidflix (0) | 2021.04.20 |