Hackcon Mini 2017 Pwnable WriteUp
0. Introduce
분명 10시쯤인가 ctf가 안열려있길레 자고일어나서하려고 7시에 일어났더니 끝나있던 ctf.. ㅋㅋㅋㅋㅋ 그래도 포너블 문제만 풀어보려고 접속했는데 문제가 생각보다 쉽고 은근 재밌어서 다풀었습니다. 푸는건 1시간정도 걸린거같은데 익스정리하는게 좀 오래걸리네요..
요세 최근 ctf몇개 풀어보면 rand함수에대해서 많이 나오는거같아요. 이번 코게2017문제도 rand문제가 있던거같은데.. 빨리 라업이 나왔으면 좋겠네요..
ctf - http://hackcon.in/
Challenges
포너블문제는 이렇게 3문제가 나왔다.
1) Random
- Vulnerability
소스는 정말 단순하다.(64-bit binary) rand함수로 생성한 난수와 입력값이 같으면 cat flag로 flag를 출력해준다.
- Exploit
사실 seed값이 time(0)이기때문에 똑같은 프로그램을 만들어 seed를 time(0)으로 주고 출력하면 flag를 얻을 수 있는데, 실제 대회서버는 응답이 너무느려서 (외국이라 그런가..) 그게 안됬다. 하지만 친절히 seed값을 출력해주므로 seed를 입력해서 flag를 얻었다.
(https://github.com/LYoungJoo/CTF-Write-Up/blob/master/2017_Hackcon_Minipwn%20Write%20Up/Random.c)
- Flag
2) Game Of Integers - Part 1
- Vulnerability
마찬가지로 소스는 매우 단순하다. Nx와 Stack Canary가 걸려있지만 신경쓰지 않아도 된다.
취약점은 &v6부터 원하는 위치에 원하는 값을 쓸 수 있는것이다.
- Exploit
ret을 덮어씌우면 되는데, 고맙게도 프로그램안에 run_me라는 system("cat flag");를 해주는 함수가 있다.
v6부터 dummy(96) + ret(4)형식으로 ret을 조작할 수 있는데 이문제에서는 dummy값이 필요없고 바로 ret을 조작할 수 있다.
- Flag
3) Game Of Integers - Part 2
- Vulnerability
이 문제는 전문제랑 비슷한데 더 좋아졌다. v8부터 원하는 위치에 원하는 만큼 쓸 수 있도록 바뀌었다.
하지만 run_me를 확인해보면 다음과같이 cat flag가 없어진걸 볼 수 있다.
뭔가 다른방식으로 풀라는거 같다.
- Exploit
처음에는 그냥 got overwrite로 풀려고 보니까 plt에 fflush, puts, system, scanf밖에 없었다. 바이너리에 %s가 없는지라 scanf로 값을 쓸 수도 없었다. 그래서 ROP로 풀어보려고 가젯들을 확인해보니 아무리봐도 쓸만한 가젯들이 없었다.. 그래서 삽질을 조금 하다가 plt에 system함수가 있는걸 보고 설마 바이너리에 cat flag가 있겠어... 했는데 진짜 있었다.
run_me함수를 어셈으로 확인해보면 발견할 수 있다.. 그래서 RTL로 풀었다. (주의할 점이라면 패킹을 안하고 정수형태로 값을 줘야한다.)
- Flag