gpt4 book ai didi

c - 如何使用 formatstring 打印出字符串?

转载 作者:行者123 更新时间:2023-11-30 14:23:39 26 4
gpt4 key购买 nike

我正在阅读有关格式字符串漏洞的教程,以了解如何更安全地进行编码。到目前为止我编写的程序如下:

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

int main(int argc, char *argv[]) {
char text[100];
strcpy(text, argv[1]);

printf(text);
}

我是这样运行的:

>>> ./foo $(ruby -e 'print "AAAA" + "%08x."*9 + "%x"')
AAAAffe466f4.00000001.f763b1c9.ffe458df.ffe458de.00000000.ffe459c4.ffe45964.00000000.41414141

我可以在末尾看到“41414141”,这是字符串开头的 AAAA。但是,当我像这样使用“%s”时:

>>> ./foo $(ruby -e 'print "AAAA" + "%08x."*9 + "%s"')

我遇到了段错误。谁能指出我正确的方向?

最佳答案

问题是,此时,您在堆栈上达到了原始 AAAA;但是,%s 说明符需要一个指向字符串的指针,即您的 AAAA 的地址。对于您想要执行的操作,没有格式字符串说明符,因为在正常的执行过程中,您不会将字符串直接粘贴为 printf() 的参数;一种想法是 %c%c%c%c 至少将数据打印为字符而不是十六进制值,但这也不起作用,因为 C 中参数的最小大小是 < strong>int 甚至 %c 说明符也适用于 int 大小的参数内存区域。

关于c - 如何使用 formatstring 打印出字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12657246/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com