我将EIP指向ESP地址并成功将我的shellcode放入ESP中,但我得到了一个SIGSEGV,Segmentation故障

时间:2014-07-06 15:26:52

标签: binary gdb buffer-overflow nomachine-nx

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

我也指的是以下链接指南,但我遗漏了一些至关重要的内容。

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值,ESP内存偏移量(0xbffff480)将被覆盖在EIP和我的shellcode上。

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是否有任何区别?

2 个答案:

答案 0 :(得分: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

尝试使用中断(“\ xCC”)预先添加shellcode,然后逐步执行GDB中的shellcode以查看其发生的情况。

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

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

答案 1 :(得分:1)

您应该按照以下步骤创建有效的漏洞: 1-使用pattern_create / offset.rb确定偏移量 2-用“BBBB”之类的东西覆盖eip 3-提示后放一些NOP 4-在NOP之后放置shellcode 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已执行