0

在创建这篇文章之前,我尝试并阅读了所有以前的问答,但他们似乎没有回答我的确切问题。

我也指的是下面链接上的指南,但我错过了一些重要的东西。

https://www.corelan.be/index.php/2009/07/19/exploit-writing-tutorial-part-1-stack-based-overflows/

这是我到目前为止所做的,程序中存在缓冲区溢出,我计算出 EIP 和 EBP 的偏移量(使用 msf 工具)。分别是 267 和 263。

该程序要求我输入“42”作为第一个输入,然后它会提示另一个问题,我可以在其中给出 A*264 以溢出缓冲区。下面是我正在使用的有效负载,它包括字符串 42、一堆 NOP 雪橇(精确为 263)、保留 EBP 值、要在 EIP 和我的 shellcode 上覆盖的 ESP 内存偏移量(0xbffff480)。

http://pastebin.com/g4kK2pC8

执行上述操作后,在 gdb 中,当我看到 ESP 和 EIP 的值相同时,即 0xbffff480

这是我放置 shellcode 的地方,EIP 指向这个。但是,为什么我的 shellcode 没有被执行?它因“程序收到信号 SIGSEGV,分段错误”而失败。

我不确定我哪里出错了。所以我将 EIP 指向/覆盖到 ESP 值的想法是错误的?或者与我的shellcode有关?我如何编写一个简单的 shellcode/payload 来打印一些东西,或者只是检查是否正在执行?

更新:

我使用 checksec.sh 脚本检查二进制文件是否启用了 NX,下面是我得到的输出。

RELRO           STACK CANARY      NX            PIE             RPATH      RUNPATH      FILE
Partial RELRO   No canary found   NX enabled    No PIE          No RPATH   No RUNPATH   output

这是否意味着我无法运行我的 shellcode?我只需要专注于逃避/绕过 NX?- 部分 RELRO 有什么不同吗?

4

2 回答 2

1

编辑:我刚刚注意到你的 checksec 输出,所以你需要编译:

gcc -z execstack

不查看调试器中的内存是很困难的,但问题可能是你的 shellcode 需要更多的空间来解码自己。

编码的 shellcode(我看到您正在使用 msfencode 执行此操作)需要在预期的有效负载(在您的情况下为 linux/x86/exec)可以运行之前就位进行解码。解码过程通常会覆盖它之前的一部分内存空间,因此如果没有足够的可写空间发生这种情况,就会出现问题(即分段错误)。所以在下面的例子中,我们会看到解码器覆盖了 0x00000008 以上的内存(如果这看起来不像你的缓冲区,因为我无法从我所在的位置看到 pastebin)。

0x0400001C 41 41 41 41 
0x04000018 41 41 41 41
0x04000014 41 41 41 41
0x04000010 41 41 41 41
0x0400000C 55 55 55 55 <-- Return address
0x04000008 12 34 56 78 <-- Start of shellcode
0x04000004 90 12 34 56 
0x04000000 78 90 12 34

尝试在你的 shellcode 前加上一个中断(“\xCC”),然后在 GDB 中逐步检查 shellcode 以查看它发生了什么。

然后,您可以尝试在返回地址和 shellcode 的开头之间添加一些 NOP(“\x90”)。我建议从 32 开始。

如果这看起来像问题,请告诉我。

于 2014-07-08T10:18:04.157 回答
1

您应该按照以下步骤创建一个有效的漏洞利用: 1- 使用 pattern_create/offset.rb 确定偏移量 2- 使用诸如“BBBB”之类的任何内容覆盖 eip 3- 在提示之后放置一些 NOP 4- 在NOPs 5-在程序中搜索“jmp esp”或“call esp”等命令(可以阅读这篇文章:https ://www.corelan.be/index.php/2009/07/23/writing- buffer-overflow-exploits-a-quick-and-basic-tutorial-part-2/ ) 6-用命令的地址覆盖 eip 7-繁荣!执行的shellcode

于 2015-05-08T12:17:06.163 回答