gpt4 book ai didi

c - 打印出堆栈给出了奇怪的定位

转载 作者:太空宇宙 更新时间:2023-11-04 02:30:09 24 4
gpt4 key购买 nike

我目前正在尝试了解 C 中的字符串格式化漏洞,但要做到这一点,我必须了解内存堆栈的一些奇怪(至少对我而言)行为。

我有一个程序

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

int main(int argc, char *argv[]) {
char buffer[200];
char key[] = "secret";

printf("Location of key: %p\n", key);
printf("Location of buffer: %p\n", &buffer);

strcpy(buffer, argv[1]);
printf(buffer);
printf("\n");
return 0;
}

我调用

./form AAAA.BBBE.%08x.%08x.%08x.%08x.%08x.%08x.%08x.%08x.%08x

我希望得到类似的东西

... .41414141.42424245。 ...

但是我明白了

... .41414141.4242422e.30252e45。 ...(B 和 E 之间有一些字符)。

这里发生了什么?

我禁用了 ASLR 和堆栈保护并使用 -m32 标志编译它。

最佳答案

我认为你的输出很好。 x86 是 little-endian - 数字的最低有效字节在内存中的地址较小,因此 1000 ( 0x3E8 ) 存储为 E8 03 , 不是 03 E8 (那将是大端)。

让我们假设编译器将所有参数传递给 printf through stack 和 variadic arguments 应该从顶部到末端放置在堆栈上(在 x86 上意味着“从低地址到高地址”)。

所以,在调用 printf 之前我们的堆栈会像这样:

<return address><something>AAAA.BBBE.%08x.%<something>
^ - head of the stack

或者,如果我们用十六进制拼写每个字节:

<return address><something>414141412e424242452e253038782e25<something>
^ - head of the stack A A A A . B B B E . % 0 8 x . %

然后你问printf采取很多未签名的int s 来自堆栈(大概是 32 位)并以十六进制打印它们,用点分隔。它会跳过 <return address>和堆栈帧的一些其他细节,并从堆栈中的某个随机点开始 buffer 之前(因为 buffer 在父级的栈帧中)。假设在某个时候它采用以下 block 作为 4 字节 int :

<return address><something>414141412e424242452e253038782e25<something>
^ - head of the stack A A A A . B B B E . % 0 8 x . %
^^^^^^^^

也就是说,我们的int在内存中是用四个字节表示的。它们的值是,从地址最小的字节开始:41 41 41 2e .由于 x86 是小端字节序,2e是最高有效字节,这意味着该序列被解释为 0x2e414141并打印出来。

现在,如果我们查看您的输出:

41414141.4242422e.30252e45

我们看到有三个int小号:0x41414141 (在内存中存储为41 41 41 41),0x4242422e (在内存中存储为 2e 42 42 42,因为最低有效字节具有最小地址)和 0x30252e45 (在内存中存储为 45 2e 25 30)。也就是说,在那种情况下 printf读取以下字节:

number one |number two |number three|
41 41 41 41|2e 42 42 42|45 2e 25 30 |
A A A A |. B B B |E . % 0 |

这对我来说看起来完全正确 - 它是 buffer 的开始正如预期的那样。

关于c - 打印出堆栈给出了奇怪的定位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44457581/

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