8月8号pwn学习
今天先看了一点东西再做的题,还把做完做的题步骤给加上了,见昨日学习博客。
https://www.anquanke.com/post/id/85138
题目:guess_num
题目描述:菜鸡在玩一个猜数字的游戏,但他无论如何都赢不了,你能帮助他么
解题思路:一个新的题型,老规矩
1.checksec
保护机制好像都有。
2.file文件
64位文件
3.ida分析文件
在编译后发现,需要每一次都输入正确的数字,才会跳转到sub_C3E函数得到flag。
而在验证的代码里,我们发现,每一次都要与随机生成的数字相同,才会正确,所以一每一次去猜测基本是不可能的,这个时候要把目标投向随机数生成机制,在linuxc中,需要有一种子seed,和一个种子初始化函数srand(),他可以对相同的seed进行初始化,避免随机序列始终一致,以及一个随机数生成函数rand(),而seed不变的话,生成的数也不会变,这是突破口。详见https://blog.csdn.net/qq_41199502/article/details/80726780
而查看了内存地址,发现要求输入的name和seed值是在一起的。那么这个时候我们就可以用gets覆盖掉seed的值,使随机数列变为我们想要的,得到flag
4.解法一
解法一是用c语言,用我们指定的seed查看得到的随机序列,代码如下图所示,机制为上文中提到的rand()和srand()函数
得到随机序列
然后远程连接,输入超过0x30(namev8地址)-0x10(seed地址)长度的字符串,我选择的是bbbb来覆盖seed,得到结果
5.解法二
而在解法二中,则是在exp中直接调用c的库函数生成随机序列,这里涉及到的知识:
Python使用Ctypes与C/C++ DLL文件通信过程介绍及实例分析