首页 > 其他分享 >CTFpwnAD世界dice_game题解wp

CTFpwnAD世界dice_game题解wp

时间:2023-12-13 13:31:56浏览次数:33  
标签:rand dice 题解 50 生成 game 种子 随机数 函数

惯例checksec一下

CTFpwnAD世界dice_game题解wp_伪随机数

看看main

首先seed函数用时间生成一个随机数,这个随机数做为srand函数的参数让srand函数生成一个种子。(这个种子会影响后面的rand函数生成结果,并且同样的种子会使rand函数生成同样的随机数,就是所谓的伪随机)

CTFpwnAD世界dice_game题解wp_题解wp_02

以及看到这里会有连续五十轮游戏。

sub_A20

CTFpwnAD世界dice_game题解wp_题解wp_03

这里就是每一轮游戏中具体发生的事了。用刚刚的种子生成一个随机数,而后和我们的输入的数比较,相等才能返回1,猜错了就寄寄了。

sub_B28

再看看如果我们连续赢50轮之后调用的这个函数会给我们什么东西。

CTFpwnAD世界dice_game题解wp_ADworld_04

直接给flag了。那要不然就是栈溢出返回到这个函数,要不就是连续赢下50轮游戏。

栈溢出的可能性

这题开了pie,而且输入点无法造成溢出,我检查过了。只能考虑连赢50轮了。

连赢50轮游戏

刚才说了,rand函数是伪随机的,只要种子相同,生成的随机数永远相同(windows和linux生成的随机数不一样)

那我们只要想办法设置程序的种子,然后用相同种子在自己的linux上面跑一次即可。

CTFpwnAD世界dice_game题解wp_伪随机数_05

CTFpwnAD世界dice_game题解wp_ADworld_06

在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下编译,跑一遍。

CTFpwnAD世界dice_game题解wp_伪随机数_07

全部复制粘贴进VSCODE。大伙一定要试试取靶机上跑一遍,一直跳"you win"的感觉太爽了,最后还打印flag更是爽上加爽。

CTFpwnAD世界dice_game题解wp_ADworld_08

标签:rand,dice,题解,50,生成,game,种子,随机数,函数
From: https://blog.51cto.com/u_16356440/8801841

相关文章

  • [ARC106F] Figures 题解
    题目链接点击打开链接题目解法这么神仙的推式子题看到生成树计数,第一反应是\(prufer\)序列考虑在\(prufer\)序列上搞这个东西可以得到\(ans=\sum\limits_{\sum\limits_{i=1}^nd_i=n-2}\binom{n-2}{d_1,d_2,...,d_n}\times\proda_i^{\underline{d_i+1}}\)考虑拆式子......
  • 问题解决
    howtomeasuressolutionsaddresstheimportanceofspeaking abilityandhowtodevelopit.Astherapid developmentofglobalization,itisofgreatnecessityforyoungstertoimproveourspeakingability.Howtoaddressthisproblem?Thefollowingsoluti......
  • AtCoder Beginner Contest 332 题解
    A-OnlineShopping题目链接AtcoderLuogu简要题意共有\(n\)件商品,第\(i\)件商品的价格为\(p_i\)日元,数量为\(q_i\)件。除了购买商品所需的的钱数,还要支付运费:如果所买商品的总价小于\(s\)日元,那么要支付运费\(k\)日元。问所需要的钱数是多少。简要思路模拟......
  • CF1610H Squid Game
    题意给定一棵树,以及\(m\)条路径。让你选出最少的点,使得对于每一条路径,都有一个点距离链上的点离端点更近。Sol考虑将每一条路径分为直链和曲链考虑。注意到所有的曲链最多对答案有\(1\)的贡献。考虑直链的情况。注意到一个很显然的东西。对于一个选择的点,如果她的上方......
  • cdr 小问题解决方案
    1,插件卸载不干净1.1:插件自带的卸载1.2:点击cdr文件夹,选择路径CorelDRAWGraphicsSuiteX8\Draw\plugins64,删除其中所有的"*.cpg"文件(如果你安装了其他插件,这里也会有其他插件的cpg文件,请仔细辨认。或者直接全部删了,到时再安装一下你需要保留的插件)。 2,cdr矩形,对象属性无法更......
  • 【POJ 2418】Hardwood Species 题解(映射)
    描述阔叶树是一种植物群,具有宽阔的叶子,结出果实或坚果,通常在冬天休眠。美国的温带气候造就了数百种阔叶树种的森林,这些树种具有某些生物特征。例如,虽然橡树、枫树和樱桃都是硬木树,但它们是不同的物种。所有硬木树种加起来占美国树木的40%。另一方面,软木,或针叶树,从拉丁语的意思是......
  • luogu P9753题解
    题意描述有一个字符串,请你求出有多少个字串可以经过若干次,使它变成空串其中每次操作可以从字符串中删除两个相邻的相同字符,操作后剩余字符串会拼接在一起。##思路1可以枚举左端点,再枚举右端点,一边枚举一边判断是否合法时间复杂度$O(n^2)$空间复杂度$O(n)$##思......
  • ARC166 B Make Multiples 题解
    LinkARC166BMakeMultiplesQuestion给出\(N\)个整数,\(A_1...A_N\),还有三个数\(a,b,c\)我们可以给\(A_i\)加上\(1\)需要使得数组\(A\)满足,存在一个数是\(a\)的倍数,一个数是\(b\)的倍数,一个数是\(c\)的倍数求最少的操作次数Solution考虑对于每个数的操作......
  • CF1901 D Yet Another Monster Fight 题解
    LinkCF1901DYetAnotherMonsterFightQuestion现在给你一堆怪物,你拥有法术(一个法术可以连续攻击这n个所有怪物),你可以选择任意一个怪物作为法术的第一个攻击目标(伤害为\(x\)),然后除了第一个攻击目标可以任意,其他攻击目标只能为曾经攻击目标的相邻怪物。然后伤害依次递减,\(x......
  • CF1764H Doremy's Paint 2 题解
    题目链接先断环成链,由于对于多组询问不好一起处理,我们先考虑单组询问的处理方式。一个很暴力的想法是每次模拟题目要求的操作并且最后数颜色,我们这是在通过下标进行操作最后再数颜色,而很多对于下标的操作都是不必要的,考虑直接枚举颜色进行判定。对于每种颜色,它对于最后答案有贡......