【问题标题】:Exploiting Printf Vulnerability in C利用 C 中的 Printf 漏洞
【发布时间】:2017-10-16 18:17:19
【问题描述】:

作为作业的一部分,我希望利用下面共享的 C 代码中的 printf() 漏洞。应该是这样的,当我用字符串运行代码时(例如./format“foo”),我应该用其他东西改变“X等于1”中的“1”。我相信我需要更改 X 变量的值,但如果您有不同的想法,请随时分享。代码如下:

#include <stdio.h>
#include <stdlib.h>
int main (int argc, char **argv)
{
    int *p;
    int x = 1;
    p=&x;
    printf("x=%d, sizeof(x): %zu, %x = %p, sizeof((p):%zu,&p = %p, \n", x, sizeof(x), &x, sizeof(p),&p);
    printf(argv[1]);
    printf("\nX equals: %d \n", x);
    return 0;
}

【问题讨论】:

  • 我不明白你想利用什么。 printf 调用没有足够的参数,并且某些参数的格式说明符类型错误。为什么有人会发布这样的代码供你利用?
  • 不太清楚你所说的“利用”是什么意思,你可能使用了不正确的格式说明符。大多数时候它会打印废话而不是格式化变量,尽管它会在技术上调用 ub 并且可能不会产生预期的效果。
  • 当我在终端上传递一个字符串(例如 ./format "foo")时,我通常只能对 printf(argv[1]) 行的输出进行更改。但由于printf(argv[1]) 并不是一种完全安全的打印方式,因此可以通过使用"%n...""%s%s%s...." 等字符串来利用它(例如,您可以使用这些字符串读取内存等)。我需要做的是更改 X 变量,但我找不到合适的字符串来更改变量。
  • 你已经有一个漏洞,因为你没有在printf(argv[1]);之前检查argc
  • 我发现存在一个漏洞,因为格式字符串与printf("x=%d, sizeof(x): %zu, %x = %p, sizeof((p):%zu,&amp;p = %p, \n", x, sizeof(x), &amp;x, sizeof(p),&amp;p); %n 用于插入代码的行中的实际参数不匹配。这是可行的,因为不匹配。试图弄清楚如何在不获得segmentation error 11 的情况下使用%n。 @mfro

标签: c security


【解决方案1】:

您可以找到相当不错的信息 (Format string attack),了解在未正确使用验证时打印中的漏洞。

我玩了一下,运行程序时是这样的:

./format "Bob %x %x %x %x %x %x %x %x%n" 

将导致以下打印:

x=1, sizeof(x): 4, &x = 0x7fffa9c36e14, sizeof((p):8,&p = 0x7fffa9c36e18,
Bob 81688000 81464ab0 3 81688048 3 a9c36f08 400410 a9c36f00
X equals: 59

如果您将%n 替换为%x,您将能够看到变量x 的地址。因为%x 从进程内存读取,%n 写入进程内存,所以我能够更改x 内部的数据(59 是打印时最多%n 的字符数)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    • 2017-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多