String-Lengths-hard
题目简介
这题除了PIE以外,对输入还存在额外的校验,具体是什么需要我们去分析
漏洞点分析
首先依然是chencksec,可以看到除了cananry全部开启,大概率和PIE的那题一样,需要触发后门函数
拖到IDA里看一下果不其然,有熟悉的win_authed,并且溢出点在challenge中
所以漏洞点和PIEs类似,劫持控制流到win函数
漏洞点利用
首先看objdump看win函数的地址,最后两个字节是0x2142,然后依然是要返回到校验逻辑的后面,选择0x215e
偷个懒,具体的操作方法就不放图了,可以参考PIE那一题的WpPIEs-hard题解
之后看偏移地址,IDA里看到最后dest距离rbp0x50个字节,所以offset=0x50+0x8=88
注意:这里的buf是malloc申请到的堆上的空间,不能看buf的地址,要从后面memcpy的操作,看出最后是把输入复制到位于栈上的dest处
最后,最关键的地方来了,challenge会调用strlen函数对我们的输入长度存在校验,不能超过43,但光垃圾数据填充就要88个,显然不行
这里卡了很久,直到看到对strlen函数的一个说明:
The strlen() function calculates the length of the string pointed to by s, excluding the terminating null byte (‘\0’).
翻译一下就是这个函数会计算字符串的长度,直到遇到终止字节,即0x00
很好,那思路就应该是用0x00作为垃圾数据填充88字节即可,这样一看这题一下子就变得简单了,之前还卡了一个下午
也算是长了个教训,还是基础不扎实,对这些库函数还是停留在用的层面,不了解深层的实现机制……
最终的利用脚本如下
1 | |
然后去flag.txt里找就行了