在创建这篇文章之前,我尝试并阅读了之前的所有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上。
执行上述操作后,在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是否有任何区别?
答案 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已执行