HackCTF는 여러 해킹 기법들을 공부할 수 있는 워게임 사이트로 주소는 https://ctf.j0n9hyun.xyz/이다.
HackCTF
Do you wanna be a God? If so, Challenge!
ctf.j0n9hyun.xyz
오늘 풀어볼 문제는 HackCTF에 있는 포너블 분야의 문제로
문제 이름은 Poet 이다.
문제를 보면 다음과 같다.
아무런 설명이 없으니 실행 파일을 다운 받고 실행시켜 보자.
실행시켜보니 한 줄의 시와 시인 이름을 입력 받고, 점수를 알려준다.
1,000,000 점의 점수를 획득해야 한다고 알려주며, 계속 입력 받는 것을 반복한다.
일단 잘 모르겠으니 checksec으로 보안기법을 확인한 후 IDA Pro로 열어보도록 하자.
NX-bit 보안 기법이 걸려 있어, 스택에서 코드 실행이 불가능해 보인다.
RELRO는 Partial이라고 나온다. (아직, RELRO 기법은 공부하지 않아서 정확한 의미는 모르겠다.)
IDA Pro로 확인해보자.
중요한 코드들만 분석해 보면 다음과 같다.
main line 4 : puts(s); 로 s에 들어있는 문자열을 출력함. ( 우리는 2018년~~ 라는 내용을 담고 있다.)
main line 5 : while(1)로 무한 반복문 실행
main line 7 : get_poem 함수 실행
해당 함수는 poem(전역변수)에 시에 대한 내용을 입력받고, dword_6024E0(전역변수)에 0을 대입한다.
main line 8 : get_author 함수 실행
해당 함수는 byte_400C38 문자열(이 시의 저자는 누구 입니까?)을 출력하고, gets로 unk_6024A0(전역변수)에 저자를 입력 받는다.
main line 9 : rate_poem 함수 실행
dest에 시 내용을 복사하고, 문장을 단어로 쪼개서(띄어쓰기 단위로) ESPR, eat, sleep, pwn, repeat, CTF, capture, flag란 단어가 있는지 확인하고 있으면 dword_6024E0에 100씩 더한다.
이후에 return시 시 내용과 dword_6024E0 값을 출력한다.
main line 10 : dword_6024E0이 1,000,000이면 break를 통해서 반복문을 빠져 나옴.
main line 12 : 1,000,000이 아니면 asc_400D78 를 출력함. (점수가 부족하다는 내용에 해당함)
main line 14 : reward 함수 실행
flag에 대한 내용을 받아서 시 내용과 점수 그리고 flag를 출력해주고 종료하는 함수이다.
정리를 해보자면, 특정 문자가 들어갈 때마다 100점씩 받게 되고,
1,000,000점을 넘기면 flag 값이 출력된다.
핵심은 점수를 1,000,000점으로 만드는 것이다.
특정 문자를 10,000번 넣는 방법이 제일 먼저 떠올랐지만
그런 방법을 원하는 것은 아닐 것이다.
dword_6024E0의 값을 1,000,000으로 바꿔주면 될 것 같아서 구조를 살펴보고 있었는데,
unk_6024A0와 64바이트 격차를 가지고 있었다.
즉, author를 입력할 때 BOF를 발생시켜 점수에 해당하는
dword_6024E0의 값을 1,000,000으로 덮어주면 쉽게 해결될 것 같다.
구조
unk_6024A0
(64바이트)
-----------------------------
dword_6024E0
이를 바탕으로 페이로드를 작성했다.
from pwn import*
p = remote("ctf.j0n9hyun.xyz", 3012)
p.recvuntil("> ")
p.sendline("a")
p.recvuntil("> ")
payload = "A"*64 + p64(1000000)
p.send(payload)
p.interactive()
시 내용에는 그냥 아무 문자를 넣어주고, 저자 이름에 64바이트를 아무 문자로 채우고 이어서 64비트 리틀엔디안 방식으로 패킹해서 1,000,000의 값을 점수 영역에 넣는 문자열을 넣어주었다.
실행 결과
이렇게 문제가 해결된다!!!
'Wargame > Pwnable' 카테고리의 다른 글
[포너블] 드림핵(Dreamhack) basic_exploitation_002 문제 풀이 | FSB (0) | 2021.01.13 |
---|---|
[포너블] HackCTF RTL_World 문제 풀이 | RTL 기법 | IDA, 칼리 리눅스 사용 (4) | 2021.01.12 |
[포너블] 드림핵(Dreamhack) basic_exploitation_001 문제 풀이 | BOF 문제, 페이로드 작성 (1) | 2021.01.08 |
[포너블] HackCTF Basic_BOF #2 문제 풀이 | IDA pro, Pwntools 사용 (1) | 2021.01.07 |
[포너블] 드림핵(Dreamhack) basic_exploitation_000 문제 풀이 | 페이로드 작성, 쉘 코드 (1) | 2021.01.07 |