鱼C论坛

 找回密码
 立即注册
查看: 103|回复: 3

[技术交流] 2024网鼎杯模拟测试\pwn

[复制链接]
发表于 2024-11-1 19:39:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
题目:发现一个可疑的网络通道,不确定是否存在安全问题,请根据提供的源码附件内容,对目标地址进行测试。
源代码见附件。


程序的漏洞在哪里呢?

提示:这道题考察数据类型/范围溢出


pwn1.zip

491 Bytes, 下载次数: 0

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-11-1 19:39:53 | 显示全部楼层
要找出程序中的漏洞,首先需要查看源码附件。根据你的提示,这道题目考察的是数据类型或范围溢出问题。通常,这类问题可能出现在以下几个方面:

1. **整数溢出**:当一个整数运算的结果超出了其数据类型的表示范围时,就会发生溢出。这可能导致意外的行为或安全漏洞。

2. **缓冲区溢出**:当程序试图写入超出缓冲区大小的数据时,可能会覆盖其他内存区域,导致程序崩溃或被攻击者利用。

3. **类型转换错误**:不正确的类型转换可能导致数据截断或溢出。

要具体分析漏洞,需要查看源码中是否有类似的操作:

- 检查所有涉及整数运算的地方,看看是否有可能的溢出。
- 查看所有涉及内存操作的地方,确保没有超出分配的内存范围。
- 确认所有类型转换都是安全的。

如果你能提供源码的具体部分,我可以帮助你更详细地分析。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-1 19:44:31 | 显示全部楼层
程序源代码:
#include <stdio.h>
#include <stdlib.h>

int main() {
        char flag[32];
        FILE* f = fopen("flag", "r");
        if (f == NULL) {
                puts("flag not found");
                return 1;
        }
        fgets(flag, 32, f);
        fclose(f);

        setvbuf(stdout, 0, 2, 0);
        setvbuf(stdin, 0, 2, 0);
        printf("Input: ");
        char buffer[16];
        fgets(buffer, 16, stdin);
        int val = atoi(buffer);
        if (val < 0) {
                puts("Error: no negative numbers allowed!");
                return 1;
        }
        int doubled = 2 * val;
        printf("Doubled: %i\n", doubled);
        if (doubled == -100) {
                puts(flag);
        }
}

请问 FishC AI 小助理,漏洞在哪里?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-1 19:44:44 | 显示全部楼层
检测点11.1 发表于 2024-11-01 19:44
程序源代码:
#include
#include

int main() { ...


在你提供的代码中,漏洞主要出现在整数溢出和缓冲区溢出方面。以下是详细分析:

1. **缓冲区溢出**:
   - 在 `fgets(flag, 32, f);` 和 `fgets(buffer, 16, stdin);` 中,`flag` 和 `buffer` 都是单个字符变量,但 `fgets` 期望的是一个字符数组。这会导致缓冲区溢出,因为 `fgets` 会尝试写入超过一个字符的内容。

2. **整数溢出**:
   - 在 `int doubled = 2 * val;` 中,如果 `val` 是一个足够大的正整数,`2 * val` 可能会导致整数溢出,变成一个负数。
   - 由于 `doubled` 是一个整数,`doubled == -100` 可能会在溢出时成立,从而输出 `flag`。

要利用这个漏洞,攻击者可以输入一个大于 `INT_MAX / 2` 的正整数,使得 `2 * val` 溢出并等于 `-100`。这样就可以绕过负数检查并输出 `flag

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 18:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表