gpt4 book ai didi

c - 为什么作为函数参数给出的字符串地址在溢出 ret 地址后发生变化?

转载 作者:行者123 更新时间:2023-11-30 15:59:41 24 4
gpt4 key购买 nike

我想通过控制堆栈来利用 C 代码段的漏洞来实现教育目的。一个简单的基于堆栈的缓冲区溢出,用应该执行 shellcode 的地址覆盖返回地址。该代码是一个简单的函数,它接受一个缓冲区作为参数,并尝试将缓冲区转换为固定大小。 main 给出的参数是argv[1]。所以我认为,如果我找到了必须覆盖的确切内存量,那么我可以简单地给出一个由 \x90 (NOP 指令)组成的字符串作为输入,后跟 shellcode,最后是该缓冲区的地址。由于这是第一个参数,它的地址是 $ebp+8,您可以通过运行 gdb 找到它,在函数的开头设置一个断点,然后键入 i args 给出作为参数传递的字符串的地址。所以我发现,如果我覆盖 n 个字节,然后给出地址的值,那么这将完全覆盖返回地址。所以我有这样的输入:

perl -e print(\x90 x n-sizeof(shellcode) . shellcode . address)'

它不起作用,我试图理解为什么。我使用 gdb 运行该程序。我在 strcpy() 函数之前放置了一个断点。此时我有一个参数,它是一个指向我的输入的字符串指针,它的地址与我的字符串输入末尾给出的地址相同,我向前迈了 1 条指令。我检查了堆栈。我现在已经保存了 eip ($ebp + 4),其地址值在 argv[1] 末尾给出,其中是预期的行为(这意味着它不会覆盖第一个参数值 ret 地址之上的其他地址)。奇怪的是,现在 $ebp+8 的内容不是“地址”而是其他东西?但保存的eip内容是指向我利用该漏洞的字符串的地址。但ret addr似乎并没有执行该地址的内容。

最佳答案

堆栈帧的组织方式是 ABI 的一部分。 Linux 在 x86-64 上使用的 ABI 的描述是 here 。您会在那里找到您需要的一切(可能还有更多)。有关堆栈帧组织,请参阅第 3.2 节。

关于c - 为什么作为函数参数给出的字符串地址在溢出 ret 地址后发生变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8544669/

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