为什么ESP在跟随EIP地址后填充空字节?

时间:2015-05-19 00:50:17

标签: buffer-overflow

我正在关注Corelan关于缓冲区溢出的教程(https://www.corelan.be/index.php/2009/07/19/exploit-writing-tutorial-part-1-stack-based-overflows/),并编写了以下代码:

my $file= "crash.m3u";  
my $junk= "\x41" x 26063;  
my $eip = pack('V', 0x000ff710);  
my $shellcode = "\x90" x 25;  

$shellcode = $shellcode."\xcc";  
$shellcode = $shellcode."\x90" x 25;  

open($FILE, ">$file");  
print $FILE $junk.$eip.$shellcode;  

close($FILE);  

代码基本上溢出缓冲区,以便用地址0x000ff710覆盖EIP。我期待堆栈包含编写的shell-code \ x90,以及\ xcc。

我在Immunity Debugger中打开代码,看到EIP和ESP都指向0x000ff710。由于我的脚本的下一部分是shellcode,我自然希望在堆栈上看到shell代码。相反,我看到一堆空字节,即序列00 00 00 01 00 00 ...等,然后最终跟随一大堆A。 Corelan解释为“000ff730 [在我的情况下为0x000f710]包含一个空字节,这是一个字符串终止符...所以你看到的A来自缓冲区的第一部分...我们从未达到我们开始编写数据的程度在覆盖EIP之后......“。

有人可以解释空字节的来源吗?此外,我的代码中的shellcode,NOP和中断在哪里,转到?

2 个答案:

答案 0 :(得分:1)

  

有人可以解释空字节的来源吗?

0x000ff710对它们负责(好吧,它)。实际上,0x000ff710被映射到内存中,因为pack函数确保你正在写一个地址,这是一个无符号长的32位= 4字节= 0x00,0x0f,0xf7,0x10

如您所见,第一个字节(0x00)为NULL。

  

此外,我的代码中的shellcode,NOP和中断在哪里,转到?

您的代码基本上是一个perl脚本,它将生成一个名为crash.m3u的.m3u文件。你可以通过将26063 junky'A'(0x41)添加到文件的开头(紧跟open之后)来创建它,并将.运算符连接到该运算符(通常是用于连接的运算符)很多语言)地址,这里是0x000ff710。最后,你连接到你的shellcode(一堆带有int 3int 0xcc的NOP,为你的调试器设置一个断点。)

您的代码“打印”到文件crash.m3u。如果您不熟悉写入文件的概念,我建议您打开一个shell并键入以下命令:

echo "that's some text"

echo "that's some text in a file" > myfile

前者将输出消息标准输出,而后者将其输出到文件。

print $FILE $junk.$eip.$shellcode;将您的shellcode“打印”到文件$ FILE。

答案 1 :(得分:0)

0x000ff710 contains null byte.

The program will get data until find 0x00.

0x90 and 0xcc which follow 0x00 will never be read by the program.

So you will never find shellcode such as 90 90 90 90 90 90 90 90... in your code.