Try to be the expert.

Ainsetin's Hacking & PS & Math

Hacking/HackCTF

HackCTF poet Write-up

Ainsetin 2020. 1. 7. 09:34

이번엔 시인이 되는 건가보다. 한번 풀어보자.

 

 

문제 풀이 시작! 우선 checksec부터....

 

 

전 문제처럼 NX bit가 걸려 있다. 바이너리 IDA로 까보자!!

 

main()의 핵심 부분

흠... 내가 시를 작성하고 이름을 입력하면 점수를 주는가보다.... 한번 세부적인 함수를 살펴보자!

 

get_poem()

이 부분은 poem이라는 전역 변수에 입력을 받는 곳이다.

 

get_author()

이 부분은 시인의 이름을 받는 곳이다. 그렇게 의미는 없다.

 

rate_poem()

이 부분이 중요하다. 왜냐하면 점수에 직결되기 때문이다. strtok으로 띄어쓰기나 \n을 인식해 한 단어씩 비교하는데, 그 문자열이 나와있는 8개의 단어 중 하나이면 100점을 추가한다. 그런데.....

 

dest는 410h라 큰 것 같지만 10진수로 바꾸면 1000000점에는 입력 만으로 절대 도달할 수 없다는 것을 알 수 있다.

 

그러면 다른 생각을 해봐야 하는데.... 우리는 지금까지 stack을 gdb로 까서 직접 변조하는 것을 꾸준히 공부해왔다. 그것을 이용하면 이 문제를 풀 수 있지 않을까?

 

dword_6024E0의 위치는 당연히 0x6024E0이고, 그 값은 buffer overflow를 이용해 변조할 수 있을 것이다. 그러면 buffer의 위치부터 알아보자.

 

get_author()

방금 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