CTF入门—PWN:random

Hash-CTF PWN入门题random

Part1:编译

正常操作:die查看为64位,拖进IDA,按下神奇的F5,找到主函数。

image-20201216205307413

我们看到了一个重要函数gets(),这是一个对输入没有限制的危险函数。代码很直白,就是以seed[0]为种子生成随机数,每次对随机数模6加1,一共验证十次。众所周知,rand()函数是一个伪随机函数,只要我们控制了种子我们就可以“猜”出来它的值。

Part2:介绍随机函数的相关知识

image-20201216235800488

根据C++的文档我们可以知道,rand()是一个伪随机数生成器,srand()对于相同的种子会将rand()函数初始化为相同序列,每调用一次rand(),就从序列中取出下一个数字(注:这里才用的是一种线性同余或线性递归的方式实现的),所以我们只要让程序按照已知的一个随机数种子运行,我们就可以推知它的结果。

想要调用dll中的rand()和srand()函数需要一个python的外部函数库——ctypes。ctypes是python的一个外部库,提供了与 C 兼容的数据类型,并允许调用 DLL 或共享库中的函数。可使用该模块以纯 Python 形式对这些库进行封装。这里使用该库,用来调用srand()和rand()函数。在 Linux 下,必须使用 包含 文件扩展名的文件名来导入共享库,可以使用 LoadLibrary()导入库。

Part3:代码实现

image-20201217183745875

由反编译代码可知,gets()输入距离seed[2]相差0x20字段,随便填充一下,再选择一个数字覆盖seed[],这里我选择了”1“,调用ctypes库中的cdll.Loadlibrary('libc.so,6')创建一个CDLL对象,在通过对象调用srand(1),循环十次调用elf.rand()。执行sub_C3E9(),于是我们就获得了权限。

提示:脚本代码采用python3语法编写,请结合实际情况修改。

 

相关资料:

1.伪随机数生成器(维基百科)

2.ctype库(python标准文档)

posted @ 2020-12-20 20:10  Silence_Forest  阅读(1032)  评论(0编辑  收藏  举报