pwnable.kr—blackjack

解题思路

万万没想到这个题突破点在这里,我本想不看别人的writeup 独立做出这个题目的,但还是败给了自己,加油!

1.先在服务器玩一下这个游戏,然后去看游戏的源代码;是一个不难理解的21点游戏

2.查看游戏的源代码,了解游戏的实现

3.关键代码所在:line721—line734

int betting() //Asks user amount to bet
{printf("\n\nEnter Bet: $");scanf("%d", &bet);if (bet > cash) //If player tries to bet more money than player has{printf("\nYou cannot bet more money than you have.");printf("\nEnter Bet: ");scanf("%d", &bet);return bet;}else return bet;
} // End Function

这个函数是游戏的过程中,保证玩家压的赌注是小于他所拥有的本钱的。可以看到,如果bet(赌注)>cash(玩家此时的本钱),那么要求玩家重新输入。但是!!!玩家再次输入的时候,没有循环判断!!!直接将第二次输入的bet值return了。那么我们就可以将押金压上1000,000,然后赢一次就赢了1000,000,然后就可以得到flag了。(当然输了也没关系啊,大不了从头再来)

so easy………………………………………………………………..

我遇到的问题

1.我的第一个思路

首先我在看游戏源码的时候,感觉这个游戏的规则很乱,就怀疑会不会存在一些逻辑漏洞,我可以根据这个判断逻辑更好的赢钱。

游戏的大致逻辑如下:

判断玩家==21:玩家赢

判断玩家>21:玩家输

判断玩家\<21&&玩家选择Hit:玩家加上随机数;dealer加上随机数;接着如果dealer==21,玩家输;如果dealer>21,则玩家赢,这个时候其实玩家也可能>21了,只不过先判断了dealer输;

判断玩家\<21&&玩家选择Stay:这个时候相当于玩家半等死;不断执行dealer()(当然dealer函数中表示如果total>17就不再add了);这时先比较玩家和dealer的大小,然后再判断dealer是否超过了21…..(这个游戏规则);

然而并没有什么卵用…………..只是想吐槽一下这个游戏规则,虽然这个规则在看似不合理中却也还是比较合理的,玩家和dealer都有占便宜的机会…….

2.我的第二个思路:

玩了很久的这个游戏,我突然想到这里用到的是随机数,于是着重看了源代码中的srand()和rand(),并试图从这上边找到突破点。

令我开心的是,我写了下边一段代码来寻找伪随机数中的问题:

#include<time.h>
#include<stdio.h>
void func();
int main()
{int i=0;func();printf("simple seed:\n");srand((unsigned)time(NULL));for(i=0;i<200;i++){printf("%d ",(rand()%13)+1);}printf("\n");for(i=0;i<20;i++){if(i%4==0){func();}}return 0;
}
void func()
{int i=0;printf("func random:\n");srand((unsigned)time(NULL));for(i=0;i<200;i++){printf("%d ",(rand()%13+1));}printf("\n");
}

我发现,当我多次重复下边这部分时,产生相同的伪随机数

srand((unsigned)time(NULL));
rand()%13+1;

于是我开心的以为这个题目中,如果我能预知双方下一张牌是什么的话,1000,000当然不在话下,可以一夜暴富了。

但是我对游戏代码进行输出测试的时候,发现并不是我想象的那样啊。它们为什么产生的伪随机数列不同呢?可是我的测试代码却相同呢?于是查阅资料并且重新对我的代码进行修改测试后得到这样结论:

srand((unsigned)time(NULL))是取当前时间作为时间种子的,但是cpu执行一段简单的代码或者一个for循环的时间太短了,以至于time(NULL)获得的当前时间是一样的,所以才会产生相同的伪随机数列。然而,由于游戏当中,玩家的操作以及选择都需要时间,所以每次的时间种子都是不一样的。out

我在测试代码中加了几个sleep(),发现事实确实如此….经过一段时间后,它们不再产生相同的随机数列了。

收获

1.sleep()的用法:执行挂起一段时间;在VC中使用头文件(windows.h),sleep的首字母大写,参数单位是毫秒;在gcc编译器中,linux环境下(unistd.h),首字母不大写,参数单位是秒。

2.常见的srand()的用法:srand((unsigned)time(NULL));srand(time(0))(前一种的缩写);srand((int)getpid())(使用当前程序的ID来作为初始化种子,因此在同一个程序中这个种子是固定的)

3.别打我……英语中spade(黑桃)heart(桃心)club(梅花)diamond(方块)

4.system(“cls”)和system(“pause”):system()作用是调用系统命令;声明与stdlib.h,形式为int system(char* cmd),执行cmd中的命令;cmd中”cls”的作用清除屏幕的输出;”pause”是暂停。

疑惑

1.在asktitile函数中玩家输入N,程序有友好的退出界面;但是在askover中的N,程序闪退,没有输出期望的内容?

2.发现如果不输入bet值的话,在enter bet:后边直接输入H或S,赌注是我上一次的赌注,而且程序是可以继续运行的?

pwnable.kr---blackjack相关推荐

  1. pwnable.kr之Toddler‘s Bottle 9~16题知识点记录

    文章目录 第九题 mistake 总结 答案: 第十题 shellshock env指令 bash指令 解题 第十一题 coin1 findall(pattern, string, flags=0) ...

  2. pwnable.kr lotto题解

    ssh lotto@pwnable.kr -p2222 (pw:guest) 题目源码: #include <stdio.h> #include <stdlib.h> #inc ...

  3. 简单易懂的 pwnable.kr 第六题[random]Writeupt

    简单易懂的 pwnable.kr 第六题[random]Writeupt 题目地址: http://pwnable.kr/play.php 题目: peak小知识 异或^ 据有如下几种性质: 2. 恒 ...

  4. 简单易懂的 pwnable.kr 第三题[bof]Writeupt

    简单易懂的 pwnable.kr 第三题[bof]Writeupt 题目地址:http://pwnable.kr/play.php 点开题目发现: 他给了提示覆盖,并且给了两个网址.分别打开,第一个给 ...

  5. 简单易懂的 pwnable.kr 第二题[collision]Writeupt

    简单易懂的 pwnable.kr 第二题[collision]Writeupt 题目地址:http://pwnable.kr/play.php 题目如下: 和第一题一样,题目给了我们一个ssh远程登录 ...

  6. 简单易懂的 pwnable.kr 第一题[fd]Writeupt

    简单易懂的 pwnable.kr 第一题[fd]Writeupt 题目地址http://pwnable.kr/play.php 题目 题目中给出了ssh远程登录的地址以及登录密码我们先连接,输入密码: ...

  7. 【pwnable.kr】passcode

    pwnable从入门到放弃,第六题. ssh passcode@pwnable.kr -p2222 (pw:guest) 完全是'&'的锅. #include <stdio.h> ...

  8. pwnable.kr passcode

    题目来自pwnable.kr 里面的思路是通过学习别人的文章获得的,作为个人的学习记录一下 题目是这样的 passcode SSH连接一下 看看有什么文件 可以看到有三个文件,其中 flag 只对创建 ...

  9. pwnable kr 之 passcode

    http://pwnable.kr/playproc.php?no=18 首先,需要对got表的一个基础认识 这里对got表和plt表进行一个简单的介绍 https://blog.csdn.net/q ...

  10. pwnable.kr - passcode

    这个题考查的是GOT表覆写 先来说说做题的思路和方法,看到源代码 void login(){int passcode1;int passcode2;printf("enter passcod ...

最新文章

  1. 往事并不如烟@武汉 --- 和同事们一起'诈金花’
  2. MD5算法了解(JAVA实现)
  3. NGUI 3.5教程(六)Font字体
  4. Python中的GIL和深浅拷贝
  5. SPRO事务码里如何开发一个新的customizing activity
  6. 与Min_25筛有关的一些模板
  7. eclipse 导入maven项目_解决Eclipse导入JAVA WEB项目错误的问题
  8. C语言——冒泡排序法
  9. WordPress主题modown6.2+erphpdown11.7
  10. mysql优化有哪些着手点_mysql的优化总结
  11. windows下,linux下elasticsearch安装插件marvel插件的步骤
  12. excel比对两列数据
  13. 极客君教你破解隔壁妹子的wifi密码,成功率高达90%
  14. Android自定义控件--圆形进度条(中间有图diao)
  15. 凭证录入模板-检查核算项目研发项目是否录入
  16. Android多线程下载
  17. 二项式反演(广义容斥定理)学习笔记
  18. seo策略_调整移动用户的SEO策略
  19. 考据党伤不起 - 东京首都大学发表《新世纪福音战士: Q》解说
  20. 微信小程序+vant的自定义tabBar

热门文章

  1. 好片推荐---《WALL·E》(又名《机器人瓦力》
  2. 使用DOS的导出Oracle的dmp文件
  3. Android仿手机QQ空间动态评论,自动定位到输入框
  4. 公司该如何创建适合自己的区块链产品、联盟链、私链
  5. 崩坏三服务器维护,崩坏3登录过程所遇问题解决方法汇总
  6. Opencv4(C++)实战案例1:将朦胧的图像变清晰(去雾)
  7. 使用Python创建excel文件成功后报错打不开
  8. Sublime text代码补全插件(支持Javascript、JQuery、Bootstrap框架)
  9. 号外!2021考研政治肖1000大幅修订?你的肖1000Anki牌组笔记已出炉!
  10. vsCode git 操作提示 Permission denied, please try again