【问题标题】:Format string vulnerabiltiy, overwrite variable [closed]格式化字符串漏洞,覆盖变量[关闭]
【发布时间】:2018-05-07 08:50:57
【问题描述】:

我已经用谷歌搜索并阅读了不同的论文,但找不到解决方案。

我编写了一个小 c 程序,我想在其中覆盖函数的参数。

void test(int test) {
    printf("%x %x %x %x %x %x %x %x\n");
    printf("%x %x %x %x %x %x %x %n\n");
    printf("%x %x %x %x %x %x %x %x\n");
    if (test == 1) {
        printf("BOO\n");
    } else {
        printf("YEE\n");
    }

}

int main() {
    int a = 1;
    test(a);
    return 0;
}

如果我使用此设置运行程序,程序的输出如下:

fff6c602 f7d61138 5658b559 0 0 fff6b698 5658b5f4 1
Segmentation fault

1 是函数的参数,我想覆盖它。但是正如你所看到的,如果我使用 %n 覆盖它,程序就会崩溃,尽管我正确设置了 printf 指针。

有人知道,为什么会这样吗?

【问题讨论】:

  • 未定义的行为。对于任何进一步的解释,您必须查看具体的实现,包括编译器和 C 库、处理器架构和可能的操作系统。
  • 请注意,%n 需要有一个参数是指向 int 的指针1 不是int * 类型的正确值,它是int。最简单的解决方法是传入int *test
  • @AnttiHaapala 感谢您提供这些信息!我按照您的建议更改了功能,但没有改变任何结果:(
  • edit您的问题添加新代码

标签: c string security printf format-string


【解决方案1】:

来自man - printf(3)

%n
到目前为止写入的字符数存储在整数中 由 *int(或变体)指针参数指示。没有论据是 转换。

现在你要做的是写一些东西到地址0x1,这肯定会导致 SIGSEGV。
如果你想覆盖函数的参数,你需要找到指向%n的参数的指针。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-31
    • 1970-01-01
    • 2011-12-01
    • 2014-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多