缓冲区溢出的地址中为NULL字符

时间:2011-08-16 15:28:39

标签: buffer-overflow null-character

我正在尝试重现缓冲区溢出。我尝试传入的地址中有两个空的十六进制字符(即0x00547e00)。之后还有4个字节(即0x11111111和0x22222222)。如果我使用gdb传递它们,它会在写入我想要的内存时跳过空字符(即1111547e 22221111 2222 ####)。是否有一个我可以传递的角色,这不是一个空字符,但不影响我的地址?

我想到的一个解决方案就是找到一些已经归零的内存,让第一个地址指向它,然后用垃圾覆盖直到找到零内存,然后我覆盖它。这只适用于我有2个字节的内存,但是,我试图通过6。

1 个答案:

答案 0 :(得分:2)

如果你试图避免使用shellcode中的零,那么有很多方法可以解决这个问题。几乎每个shellcode编写教程都会这样做。

现在覆盖地址的最后部分将会很棘手,具体取决于使用何种缓冲区溢出。

在基于 memcpy 的基础上,\ 0字符没问题,但是(你的问题很模糊,我不得不写这个)你很可能无法输入这些字符串到stdin键盘/在命令行上,所以你需要输入其他来源的数据,例如管道:./buffercrash < exploit.txt 使用 strcpy ,除了最后一个之外,你不能有\ 0个字符,因为它也会终止目标字符串,这意味着你可以完美地将最重要的字节设置为\ 0。现在你的问题仍然是最不重要的字节:如果它是一个堆栈地址,你可能会幸运地添加一些额外的环境变量,以便你的目标地址相应地改变。如果它只是shellcode的地址,你只需在地址上添加+1,然后在shell代码前插入另一个填充字符。

所以这一切都取决于上下文以及你究竟想要做什么,但是一旦你有一个缓冲区溢出漏洞,\ 0可能会停止直接的方法,但有一些创造力,很可能会有一些东西可以即使没有\ 0字符也能实现。