题目地址:dice_game
从这篇开始就正式进入高手进阶区,一些简单的知识点我这里就不会再重复赘述了,请有需要的同学看前面的章节。
废话不多,看看题目

题目没什么提示,只是知道这个题目的来源是:XCTF 4th-QCTF-2018
下载附件,看看情况,照例做下保护机制检查
root@mypwn:/ctf/work/python/dice_game# checksec dice_game
[*] '/ctf/work/python/dice_game/dice_game'
Arch: amd64-64-little
RELRO: Full RELRO
Stack: No canary found
NX: NX enabled
PIE: PIE enabled
打开了各种限制条件,作为难度为1的题目,感觉有点吓唬人哩!
没事,先做下反编译

高手进阶区的题目,我会先对反编译之后的c语言代码做下命名修改,方便同学们可以快速理解,要不然v1、v2这种变量函数命名对于复杂题目的快速判断会造成不小的干扰。
下面我就直接把我已经修改好命名的c语言代码贴出来,这个程序主要有三个函数,我按照函数的意义进行了重命名,分别是main, go_game, get_flag。
先看下main函数:
__int64 __fastcall main(__int64 a1, char **a2, char **a3)
{
char szName[55]; // [rsp+0h] [rbp-50h]
char nResultGame; // [rsp+37h] [rbp-19h]
ssize_t nLenName; // [rsp+38h] [rbp-18h]
unsigned int seed[2]; // [rsp+40h] [rbp-10h]
unsigned int nRound; // [rsp+4Ch] [rbp-4h]
memset(szName, 0, 0x30uLL);
*(_QWORD *)seed = time(0LL);
printf("Welcome, let me know your name: ", a2);
fflush(stdout);
nLenName = read(0, szName, 0x50uLL);
if ( nLenName <= 49 )
szName[nLenName - 1] = 0;
printf("Hi, %s. Le

本文是攻防世界CTF writeup系列的高手进阶篇,解析dice_game题目。通过分析C语言代码,发现需利用栈内溢出覆盖伪随机数种子。通过构造payload并利用Python脚本,成功解决题目,涉及知识点包括栈溢出和伪随机数处理。
最低0.47元/天 解锁文章
626

被折叠的 条评论
为什么被折叠?



