黑客挑战 - 定位代码中的漏洞

2023-11-29

我的朋友最近完成了一项黑客挑战并将其发送给我(二进制文件和源代码)。在向他寻求建议之前我想先在这里问一下,因为我想自己做:)

我一直在经历它,但我正在努力寻找漏洞。

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

static void usage(const char *argv0) {
    printf("Build your own string!\n");
    printf("\n");
    printf("Usage:\n");
    printf("  %s length command...\n", argv0);
    printf("\n");
    printf("Each command consist of a single character followed by it's index.\n");
    printf("\n");
    printf("Example:\n");
    printf("  %s 11 h0 e1 l2 l3 o4 w6 o7 r8 l9 d10\n", argv0);
    exit(1);
}

int main(int argc, char **argv) {
    char *buffer;
    unsigned short buffersize, i, index, length;

    if (argc < 2) usage(argv[0]);

    length = atoi(argv[1]);
    if (length <= 0) {
            fprintf(stderr, "bad length\n");
            return 1;
    }

    buffersize = length + 1;
    buffer = alloca(buffersize);
    memset(buffer, ' ', buffersize);
    buffer[buffersize - 1] = 0;

    for (i = 2; i < argc; i++) {
            if (strlen(argv[i]) < 2) {
                    fprintf(stderr, "bad command \"%s\"\n", argv[i]);
                    return 1;
            }

            index = atoi(argv[i] + 1);
            if (index >= length) {
                    fprintf(stderr, "bad index in command \"%s\"\n", argv[i]);
                    return 1;
            }

            buffer[index] = argv[i][0];
    }

    printf("%s\n", buffer);
    return 0;
}

我认为该漏洞存在于short int 和alloca 的使用中。

进入./app 65535 65535可能会导致段错误,但我实际上无法覆盖任何内容,因为缓冲区只会设置为最大值 65535 或者它会循环。这让我觉得我无法覆盖 EIP 来注入 shellcode。

谁能帮我看看哪里可以看吗?

Thanks!


实际上,该漏洞在于您可以在分配的缓冲区中的任意偏移处存储字符alloca,但测试是在length而不是size。传递参数65535 and a1调用未定义的行为:size作为价值0因为算术环绕 ifunsigned short有 16 位。

您可以尝试传递第一个参数 65535 以及具有增加偏移量的后续参数,这将使值超出 65535 的末尾buffer,可能会覆盖返回地址main并导致崩溃:

myprog 65535 a3 a7 a15 a19 a23 a27 a31 a35 a39 a43 a47 a51 a55 a59 a63 ...

根据实际的局部变量布局,所需的偏移量可能大于17,但应该小于80.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

黑客挑战 - 定位代码中的漏洞 的相关文章

  • 在 C++ 中分割大文件

    我正在尝试编写一个程序 该程序接受一个大文件 任何类型 并将其分成许多较小的 块 我想我已经有了基本的想法 但由于某种原因我无法创建超过 12 kb 的块大小 我知道谷歌等上有一些解决方案 但我更感兴趣的是了解这个限制的根源是什么 然后实际
  • 处理 fanart.tv Web 服务响应 JSON 和 C#

    我正在尝试使用 fanart tv Webservice API 但有几个问题 我正在使用 Json Net Newtonsoft Json 并通过其他 Web 服务将 JSON 响应直接反序列化为 C 对象 这里的问题是元素名称正在更改
  • Linux TUN/TAP:无法从 TAP 设备读回数据

    问题是关于如何正确配置想要使用 Tun Tap 模块的 Linux 主机 My Goal 利用现有的路由软件 以下为APP1和APP2 但拦截并修改其发送和接收的所有消息 由Mediator完成 我的场景 Ubuntu 10 04 Mach
  • TextBox 焦点的 WinForms 事件?

    我想添加一个偶数TextBox当它有焦点时 我知道我可以用一个简单的方法来做到这一点textbox1 Focus并检查布尔值 但我不想那样做 我想这样做 this tGID Focus new System EventHandler thi
  • 获取从属性构造函数内部应用到哪个属性的成员?

    我有一个自定义属性 在自定义属性的构造函数内 我想将属性的属性值设置为属性所应用到的属性的类型 是否有某种方式可以访问该属性所应用到的成员从我的属性类内部 可以从 NET 4 5 using CallerMemberName Somethi
  • 为什么密码错误会导致“填充无效且无法删除”?

    我需要一些简单的字符串加密 所以我编写了以下代码 有很多 灵感 来自here http www codeproject com KB security DotNetCrypto aspx create and initialize a cr
  • 在 C# 中将位从 ulong 复制到 long

    所以看来 NET 性能计数器类型 http msdn microsoft com en us library system diagnostics performancecounter aspx有一个恼人的问题 它暴露了long对于计数器
  • 为什么 std::allocator 在 C++17 中丢失成员类型/函数?

    一边看着std 分配器 http en cppreference com w cpp memory allocator 我看到成员 value type pointer const pointer reference const refer
  • 单元测试失败,异常代码为 c0000005

    我正在尝试使用本机单元测试项目在 Visual Studios 2012 中创建单元测试 这是我的测试 TEST METHOD CalculationsRoundTests int result Calculations Round 1 0
  • C# 创建数组的数组

    我正在尝试创建一个将使用重复数据的数组数组 如下所示 int list1 new int 4 1 2 3 4 int list2 new int 4 5 6 7 8 int list3 new int 4 1 3 2 1 int list4
  • C# using 语句、SQL 和 SqlConnection

    使用 using 语句 C SQL 可以吗 private static void CreateCommand string queryString string connectionString using SqlConnection c
  • 如何排列表格中的项目 - MVC3 视图 (Index.cshtml)

    我想使用 ASP NET MVC3 显示特定类型食品样本中存在的不同类型维生素的含量 如何在我的视图 Index cshtml 中显示它 an example 这些是我的代码 table tr th th foreach var m in
  • UWP 无法在两个应用程序之间创建本地主机连接

    我正在尝试在两个 UWP 应用程序之间设置 TCP 连接 当服务器和客户端在同一个应用程序中运行时 它可以正常工作 但是 当我将服务器部分移动到一个应用程序并将客户端部分移动到另一个应用程序时 ConnectAsync 会引发异常 服务器未
  • 过期时自动重新填充缓存

    我当前缓存方法调用的结果 缓存代码遵循标准模式 如果存在 则使用缓存中的项目 否则计算结果 在返回之前将其缓存以供将来调用 我想保护客户端代码免受缓存未命中的影响 例如 当项目过期时 我正在考虑生成一个线程来等待缓存对象的生命周期 然后运行
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • 无法使用 Ninject 将依赖项注入到从 Angular 服务调用的 ASP.NET Web API 控制器中

    我将 Ninject 与 ASP NET MVC 4 一起使用 我正在使用存储库 并希望进行构造函数注入以将存储库传递给其中一个控制器 这是实现 StatTracker 接口的上下文对象 EntityFramework public cla
  • 运行代码首先迁移更新数据库时出错

    我在迁移到数据库时遇到问题 并且似乎找不到我遇到的错误的答案 System MissingMethodException Method not found System Data Entity Migrations Builders Tab
  • 同时从多个流中捕获、最佳方法以及如何减少 CPU 使用率

    我目前正在编写一个应用程序 该应用程序将捕获大量 RTSP 流 在我的例子中为 12 个 并将其显示在 QT 小部件上 当我超过大约 6 7 个流时 问题就会出现 CPU 使用率激增并且出现明显的卡顿 我认为它不是 QT 绘制函数的原因是因
  • boost::program_options:带有固定和可变标记的参数?

    是否可以在 boost program options 中使用此类参数 program p1 123 p2 234 p3 345 p12 678 即 是否可以使用第一个标记指定参数名称 例如 p 后跟一个数字 是动态的吗 我想避免这种情况
  • 如何创建向后兼容 Windows 7 的缩放和尺寸更改每显示器 DPI 感知应用程序?

    我是 WPF 和 DPI 感知 API 的新手 正在编写一个在 Windows 7 8 1 和 10 中运行的应用程序 我使用具有不同每个显示器 DPI 设置的多个显示器 并且有兴趣将我的应用程序制作为跨桌面配置尽可能兼容 我已经知道可以将

随机推荐

  • ES6 将一些函数导入为对象

    动作 js export const setX gt export const setY gt export const setT gt 一些组件 js import setX setY setT from actions export c
  • 触摸事件延迟

    我们在 AppStore 有一个应用程序半身像 A 幽灵我们有一个问题 当您点击屏幕时 我们使用 CALayer 来查找动画期间所有视图的位置 如果您点击其中一个 我们就会开始一个骰子序列 但是 存在明显的延迟 似乎触摸已被缓冲 并且我们收
  • Firestore限制

    Firestore 提供 50000 个文档读取操作作为其免费捆绑包的一部分 但是 在我的应用程序中 客户端正在获取包含价格数据的集合 价格数据是随着时间的推移而创建的 因此 从特定时间戳开始 客户端最多可以读取 1000 个文档 每个文档
  • 如何从 MVC 中的 Javascript 代码将值传递到控制器

    实际上我有一个这样的场景 我通过 Javascript 获取 GridView 中检查记录的值 现在我需要将这些值发送到控制器以删除这些记录
  • 从 UIDatePicker 中删除“今天”条目

    在 iOS SDK 中使用 UIDatePicker 时 当前日期始终有一个 今天 条目 这在大多数情况下很有用 但在我需要它的地方 它却相当令人困惑 有没有办法 a 禁用 今天 条目 改为使用常规日期 并且有所有条目看起来都一样 甚至更好
  • 以编程方式检查进程是否正在后台运行

    2个问题 1 是否有任何Linux Posix API可以知道进程是否已被调用为后台进程 linux gt myprogram 代码可以吗myprogram检测到它已被调用在后台运行 通过 2 是否有任何Linux Posix API可以使
  • 尝试渲染到多个纹理以实现延迟渲染。但所有纹理都是平等的

    所以我试图在opengl中实现延迟渲染 为此 我创建了一个 FBO 它渲染 3 个纹理 一个用于位置 一个用于正常 一个用于材质信息 但是由于我尚未完成 因此第三个纹理只是片段的最终颜色 最后一个深度缓冲区用于稍后实现阴影 然后 该纹理被传
  • 从 Silverlight 重定向到另一个页面

    在 Silverlight 页面中 我想重定向到同一网站中的另一个 aspx 页面 并使用 POST 方法发送一些附加标头信息 有什么想法如何实施吗 任何样品表示赞赏 我使用的是 VSTS2008 Net 3 5 Silverlight 2
  • AWS Elastic Beanstalk 给出“无法将主机名“db”翻译为地址”错误

    我一直在尝试部署由 Django Postgresql 和 Nginx 组成的 docker 当我这样做时效果很好 sudo docker compose up However when deploy it on AWS EB it giv
  • 条件运算符中的“错误:需要左值作为赋值的左操作数”

    我是 C 新手 今天我学会了 运算符是 if else 语句的短类型 但是 当我执行这段代码时 int b int x b 3 lt 2 x 12 x 34 我收到错误 错误 需要左值作为赋值的左操作数 我不明白为什么会这样 我的想法是 程
  • 无法使用 golang 解码 XML,始终为空结构

    我正在尝试使用 golang 解码 XML 但以下代码给出了一个空结构 有人可以帮忙吗 当我运行以下代码时 我总是得到 packet 附源码 package main import fmt encoding xml io ioutil ty
  • Android - 构建支持附加组件的应用程序

    在 NET 上 我可以使用 反射 在运行时加载 DLL 库 这允许我为我的应用程序构建一些附加组件 在Android上 有什么方法可以执行类似的操作吗 我想制作一个附加组件 安装后可以从我的 Android 应用程序调用 我的第一个想法是建
  • android:如何使用触摸和拖动创建不同的“屏幕”和它们之间的导航?

    我可以创建与主屏幕上相同类型的导航吗 也就是说 我想要可以使用触摸和拖动在不同的屏幕之间导航 我还没有看到任何相关内容 所以是时候问一下了 哦 我正在谈论 Android 的应用程序 没有任何内置内容 但您可以使用 ViewFlipper
  • 为什么当我打开 H2 控制台时,从 Java 添加的表不可见?

    我在Java中使用H2嵌入式数据库 在创建数据库并添加一些表和数据后 它被保存为我计算机目录中的文件 但是每当我使用 H2 控制台打开此文件时 它根本不显示任何表格 为什么桌子不在那里 我在我的 java 代码中使用这个 URL jdbc
  • Java QueryDsl代码生成不生成Q类

    我正在制作一个 Spring 项目 其中我使用 QueryDsl 作为实体 我从几个月前开始接手这个项目 其中我已经有 1 个生成的类 QUser 现在我创建了一个名为 Permission 的新实体 并修改了 User 实体 当我构建项目
  • 在 Dymola 中编译大型数组

    请考虑以下小型 Modelica 模型和功能 model VectorizeDemo parameter Integer na 5 final parameter Integer nb 2 na final parameter Real a
  • 如何将数组分割成块,但让它一个接一个地填充每个数组

    我使用这个函数来创建数组块 function chunkArray myArray chunk size let results while myArray length results push myArray splice 0 chun
  • iOS5 的 Json 解析器示例

    我在 iOS5 中创建了一个应用程序 我想在网络服务器上存储和检索数据 为此我想使用 JSON 解析器 我使用了 ray wenderlich 为 ios4 提供的演示 我听说ios 5 有一些现成的框架 那么有人对此有任何想法吗 我正在使
  • 将下拉列表的值传递到文本框

    我的视图中有一个下拉列表 一个提交按钮和一个文本框 我想在单击提交按钮或 dropdownlist 的 onChange 事件时将 dropdownlist 的选定值传递到文本框 我怎样才能实现这个目标 我解决如下 div Html Dro
  • 黑客挑战 - 定位代码中的漏洞

    我的朋友最近完成了一项黑客挑战并将其发送给我 二进制文件和源代码 在向他寻求建议之前我想先在这里问一下 因为我想自己做 我一直在经历它 但我正在努力寻找漏洞 include