gpt4 book ai didi

C格式字符串漏洞: How many bytes does %x read from the stack?

转载 作者:行者123 更新时间:2023-11-30 20:11:16 25 4
gpt4 key购买 nike

我的疑问如下:假设 Ubuntu 14.04 32 位和 x_86 intelatom cpu 格式 %x 从堆栈中读取多少字节?我知道我可以使用以下方法读取堆栈中的内容:

formatstring="%x";
printf(formatstring);

当我输入更多时 %x在格式字符串中,从堆栈中读取更多数据。自 %x需要4 bytes ,每 %x应该读 4 bytes从堆栈中,例如如果第一个 %x读取地址 0x0 写入的内容2nd将读取地址 0x4 中的内容等等..(显然这些数字只是为了让我更容易解释)。这个假设正确吗?自从我尝试在练习中计算 var 的地址 known_address + (numberof %x untill_the_var_value_is_printed )* 4 以来,似乎就没有这样的情况了。我发现了一个错误的地址。

最佳答案

就C标准而言,这个问题没有意义。

%x 格式说明符需要一个 unsigned int 类型的相应参数。 (unsigned intint 作为参数或多或少可以互换,只要值在两种类型的可表示范围内即可。)标准没有明确说明这一点,但它没有定义行为。

如果特定编译器生成的代码将unsigned int参数传递给堆栈上的可变参数函数(C 标准没有这个术语)使用),则 printf 可能会从堆栈中为每个 %x 说明符读取 sizeof (unsigned int) 字节。在其他实现中,它可能会尝试从寄存器或其他地方读取参数。此外,sizeof (unsigned int) 可能因一种实现而异。原则上,它甚至可能随编译时优化级别的不同而变化。

如果您想了解 printf("%x") 之类的实际行为,您需要指定您正在使用的特定实现,包括目标操作系统和硬件以及您正在使用的编译器。 “32 位 Linux”还不够具体。由于不需要 C 实现来对此进行记录,因此可能很难获取详细信息。

关于C格式字符串漏洞: How many bytes does %x read from the stack?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41273046/

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