我用 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