이번엔 시인이 되는 건가보다. 한번 풀어보자.
문제 풀이 시작! 우선 checksec부터....
전 문제처럼 NX bit가 걸려 있다. 바이너리 IDA로 까보자!!
흠... 내가 시를 작성하고 이름을 입력하면 점수를 주는가보다.... 한번 세부적인 함수를 살펴보자!
이 부분은 poem이라는 전역 변수에 입력을 받는 곳이다.
이 부분은 시인의 이름을 받는 곳이다. 그렇게 의미는 없다.
이 부분이 중요하다. 왜냐하면 점수에 직결되기 때문이다. strtok으로 띄어쓰기나 \n을 인식해 한 단어씩 비교하는데, 그 문자열이 나와있는 8개의 단어 중 하나이면 100점을 추가한다. 그런데.....
dest는 410h라 큰 것 같지만 10진수로 바꾸면 1000000점에는 입력 만으로 절대 도달할 수 없다는 것을 알 수 있다.
그러면 다른 생각을 해봐야 하는데.... 우리는 지금까지 stack을 gdb로 까서 직접 변조하는 것을 꾸준히 공부해왔다. 그것을 이용하면 이 문제를 풀 수 있지 않을까?
dword_6024E0의 위치는 당연히 0x6024E0이고, 그 값은 buffer overflow를 이용해 변조할 수 있을 것이다. 그러면 buffer의 위치부터 알아보자.
방금 author를 입력받는 곳에서 unk_6024A0가 있었는데, 보니까 0x6024E0과 거리가 가깝다... 따라서 우리는 이 gets에서 BOF를 일으키면 될 것 같다. offset은 총 64byte이므로 dummy를 64byte 채우고 내가 원하는 정수를 넣으면 될 것 같다.
어떤 값을 집어넣어야 되므로 poet과 author를 전부 사용하여 풀기 위해 poet에는 키워드 하나를 적어 100점을 얻고, author에서 999900으로 변조하면 될 것이다.
exploit 과정은 다음과 같다.
poet에 키워드 아무거나 하나 입력 -> author에서 dword_6024E0 변조
exploit code는 다음과 같다.
실행시켜보면....!
flag를 획득할 수 있다.
'Hacking > HackCTF' 카테고리의 다른 글
HackCTF Random Key Write-up (0) | 2020.01.07 |
---|---|
HackCTF 1996 Write-up (0) | 2020.01.07 |
HackCTF g++ pwn Write-up (0) | 2020.01.07 |
HackCTF RTL_World Write-up (0) | 2020.01.06 |
HackCTF Yes or no Write-up (0) | 2020.01.06 |