查看了国外网友Hansoo1018的WriteUp,在此谢谢这位网友。
源代码中的select_menu()函数出现问题
问题出现在红色部分
select_menu()函数以递归方式调用。
如果要在屏幕上再次显示菜单,通常使用while语句或者其他代码完成。递归代码具有更清晰的特点,但是递归迭代越多,堆栈内存就越多。我试图在函数结束时调用Tail Call(Tail Recutsion),但实际上是在用GDB分析之后浪费了堆栈内存。如果是这样,可以一直降低堆栈。它随机接收地址,地址不是堆栈地址。更重要的是,这里创建的内存分配函数使我运行了特权。他需要你写一个shellcode。
1、获取堆栈区域的地址(反复重复)
2、堆叠堆栈并降低地址。低于我们获得的堆栈区域的地址。
3、进行另一次内存分配并将shellcode放入其中(记住你收到的shellcode的地址)。
4、将shellcode的地址放在刚刚收到的堆栈区域的地址中。由于它可以写入4096个字节,因此可以用1024个地址覆盖。
5、当你运行exit时,递归返回堆栈,shell代码地址在中间被覆盖,shellcode执行。
在迭代过程中自然降低了获取堆栈区域的地址。
重复迭代,直到接收的地址大于当前的EBP地址。
然后一直运行下去。
我一再使用255个数组。在这种情况下,我创建了一个删除255次重复的函数。(你可以继续重复)
上传shellcode
提升shell代码的部分
然后它用堆栈区地址覆盖shellcode地址和利用。
Stacking旁边的值是当前的EBP值。
Clear也运行了好几次
终于覆盖了ret地址的堆栈区域的地址。
此时,如果按F5退出,可以最终获取shell权限。