漏洞利用:EIP 拒绝跳转堆栈,尽管它是可执行的

信息安全 linux 开发 缓冲区溢出 C 逆向工程
2021-09-09 01:04:52

我用 C 语言编写了一个BOF 可利用的程序

TL;DR - 我的有效负载(NOP-sled + shellcode + 返回地址)覆盖 EIP,但我无法将 EIP 设置为指向我的有效负载的地址,尽管我可以将 EIP 设置为堆栈地址范围之外的任何其他位置。Stack 似乎是可执行的,并且我熟悉的 proections 已关闭。

我使用 De bruijin 模式发送了一个有效载荷ragg2,并找到了覆盖 EIP 的偏移量。然后我用 NOP-sled 创建了一个有效负载,然后是 shellcode,在覆盖 EIP 的偏移处,我写了我的 NOP-sled 中间的地址。

所以有效载荷看起来像这样: NOP-sled + Shellcode + Address somewhere at the middle of my NOP-Sled (Little Endian).

发生了一些奇怪的事情,我无法利用该程序:在段错误之后,EIP 不在我在有效载荷末尾使用的地址,EIP 之后就像 600 个地址。但是,当我将有效负载末尾的地址更改为其他内容时,例如“AABB”(0x42424141)或 0xd4d4 fd ff(而不是 0xd4d4 ff ff,它是我的 shellcode 中间的地址,little-endian)工作得很好,EIP 在我提供的地址。

nx保护已关闭,ASLR已禁用,已Selinux禁用,内存页面似乎是可执行的,并且 ELF"-fno-stack-protector -z execstack"在 GCC 上使用编译。

也在 gdb 和任何调试器之外尝试过。

可能是什么问题?为什么它拒绝跳转到堆栈上的地址?

关于二进制的信息:

havecode true
pic      false
canary   false
nx       false
crypto   false
va       true
intrp    /lib/ld-linux.so.2
bintype  elf
class    ELF32
lang     c
arch     x86
bits     32
machine  Intel 80386
os       linux
minopsz  1
maxopsz  16
pcalign  0
subsys   linux
endian   little
stripped false
static   false
linenum  true
lsyms    true
relocs   true
rpath    NONE
binsz    6162

堆栈信息:

sys 132K 0xfffdd000 - 0xffffe000 s -rwx [stack] [stack] ; map._stack_._rwx

编辑: 您可以在此处找到更多详细信息,包括命令和 shellcode 本身:http: //pastebin.com/HYbByNSE

1个回答

根据您发布的有效负载,您似乎希望 EIP 跳转到 0xffffd4d4。在运行程序之前在该地址 (0xffffd4d4) 设置断点。这样你就可以知道程序执行是否达到了 0xffffd4d4。

也许 Shellcode 有问题,你的程序可能在 shellcode 中途出现段错误。当我刚开始时,我遇到了很多类似的问题。

PS。在您的问题中,您提到了 0xd4d4ffff。请检查。因为如果要跳转到 0xd4d4ffff,则需要将 EIP 替换为 \xff\xff\xd4\xd4 而不是 \xd4\xd4\xff\xff。