惯例checksec一下
看看main
首先seed函数用时间生成一个随机数,这个随机数做为srand函数的参数让srand函数生成一个种子。(这个种子会影响后面的rand函数生成结果,并且同样的种子会使rand函数生成同样的随机数,就是所谓的伪随机)
以及看到这里会有连续五十轮游戏。
sub_A20
这里就是每一轮游戏中具体发生的事了。用刚刚的种子生成一个随机数,而后和我们的输入的数比较,相等才能返回1,猜错了就寄寄了。
sub_B28
再看看如果我们连续赢50轮之后调用的这个函数会给我们什么东西。
直接给flag了。那要不然就是栈溢出返回到这个函数,要不就是连续赢下50轮游戏。
栈溢出的可能性
这题开了pie,而且输入点无法造成溢出,我检查过了。只能考虑连赢50轮了。
连赢50轮游戏
刚才说了,rand函数是伪随机的,只要种子相同,生成的随机数永远相同(windows和linux生成的随机数不一样)
那我们只要想办法设置程序的种子,然后用相同种子在自己的linux上面跑一次即可。
在main函数中输入点buf虽然不能造成溢出,但是可以覆盖到seed的值,咱直接随便取一个数,覆盖掉seed即可。
我选的是b'\x00'
。我的c程序如下
#include<stdio.h>
#include<stdlib.h>
int main()
{
srand(0);
for(int i = 1;i < 51; i++)
{
printf("io.recvuntil(b'/50')\nio.sendline(b'%d')\n",rand()%6+1);
}
return 0;
}
顺便还帮我把python爆破脚本的格式写好了,岂不美哉。
这里提一嘴linux下跑c的最原始的方法
1.vim创建一个文件,在里面编辑好c程序。
2.然后把该文件后缀改成.c
3.使用命令gcc srand.c
编译,默认生成的是a.out可执行ELF文件
4.使用命令./a.out
跑程序
放在linux下编译,跑一遍。
全部复制粘贴进VSCODE。大伙一定要试试取靶机上跑一遍,一直跳"you win"的感觉太爽了,最后还打印flag更是爽上加爽。
标签:rand,dice,题解,50,生成,game,种子,随机数,函数 From: https://blog.51cto.com/u_16356440/8801841