1. Mitigation
Partial RELRO와 NX enabled인거 말고는 특별한 것은 없다.
2. 문제 확인
프로그램을 실행시키면 한 줄의 시를 쓰라고 입력을 받고 저자를 묻는다. 입력하고 난 후 시의 내용과 점수를 출력하고 1000000점을 획득하라고 한다. IDA로 분석 해보자.
main 함수 영역을 보면 get_poem, get_author, rate_poem 그리고 puts와 reward 함수가 있다. get_poem 함수부터 차례로 하나씩 보자.
먼저 get_poem 함수는 시의 내용을 입력받는 부분이다. 내용을 입력바고 dword_6024E0 부분을 0으로 초기화 시키고 입력 값을 리턴한다.
get_author 함수는 저자를 입력을 받고 리턴한다.
rate_poem 영역은 get_poem 함수에서 입력받은 내용을 dest에 복사하고 dest는 " \n"기준으로 자르고 s1에 넣어준다.
s1이 ESPR || eat || sleep || pwn || repeat || CTF || capture || flag 문자열과 하나라도 일치한다면 dword_6024E0에 100 씩 더해준다. 그리고 루프가 다돌면 printf 함수로 출력해주고 리턴한다. reward() 함수는 플래그를 출력해주는 부분이다.
get_author 에서 입력을 받는 unk_6024A0은 전역 변수이고 dword_6024E0도 전역 변수이다. 그렇다면 두 전역 변수의 거리만큼 입력해주고 dword_6024E0을 1000000으로 덮어주면 플래그 값을 얻을 수 있을 것 이다.
exploit
from pwn import *
p = remote('ctf.j0n9hyun.xyz', 3012)
e = ELF('./poet')
payload = 'A'*64
payload += p64(1000000)
p.sendlineafter('>', 'AAA')
p.sendlineafter('>', payload)
p.interactive()
'Wargame > HackCTF' 카테고리의 다른 글
Random Key (0) | 2021.03.21 |
---|---|
Strncmp (0) | 2021.03.19 |
RTL_Core (0) | 2021.03.19 |
Handray (0) | 2021.03.18 |
Reversing Me (0) | 2021.03.18 |
댓글