我应该如何到达我的 shellcode?

逆向工程 视窗 x86 缓冲区溢出
2021-06-13 15:42:07

我正在尝试利用我在opensecuritytraining.info 上找到的这个小程序但是,不知何故,我被困在了这一点上。我所做的是创建一个从程序中读取的文件。这是我为此使用的代码:

#!/usr/bin/env python

import struct

mystring = b"\xCC"*1096# junk
nSEH = b"\xeb\x06\x90\x90"
SEH  = struct.pack("<L", 0x004011B6)
opcode = "\xe9\xdf\xf6\xff\xff"

mystring += nSEH + SEH + ("\x90"*16) + opcode
fileName='C:\hellothere.bin'

with open(fileName, 'wb') as fb:
    fb.write(bytearray(mystring))
fb.close()

所以,我被困在用 覆盖缓冲区的这一点上\xCC,但我的问题是,当我放置另一个跳转代码时,CC's 覆盖了保存的EIP寄存器。我可以进一步向后跳到我的 shell 代码发生的地方吗?

我的意思是原则上这应该可以对漏洞利用代码本身进行一些调整或调整。

任何的想法 ?

锻炼

2个回答

就屏幕截图所描述的而言,我可以说您走在正确的轨道上。您已经正确地覆盖了指向 NextSEHSE Handler指针

一些解释:

异常注册记录结构

typedef struct _EXCEPTION_REGISTRATION_RECORD
{
   struct _EXCEPTION_REGISTRATION_RECORD *Next;
   PEXCEPTION_ROUTINE                     Handler;
} EXCEPTION_REGISTRATION_RECORD, *PEXCEPTION_REGISTRATION_RECORD;

每当调用具有异常处理机制的新函数时,都会将EXCEPTION_REGISTRATION_RECORD添加到堆栈中。其中*Next是指向Previous EXCEPTION_REGISTRATION_RECORD的指针Handler是指向Exception handler的函数指针

FS:0寄存器总是指向第一个EXCEPTION_REGISTRATION_RECORD一旦EXCEPTION_REGISTRATION_RECORD被压入堆栈,FS:0寄存器将被设置为指向新的EXCEPTION_REGISTRATION_RECORD一条记录将被设置为指向FS:0寄存器的先前值这将维护 SEH 链的链接列表。

异常处理器结构

typedef EXCEPTION_DISPOSITION (*ExceptionHandler) (
    IN PEXCEPTION_RECORD ExceptionRecord,
    IN ULONG64 EstablisherFrame,
    IN OUT PCONTEXT ContextRecord,
    IN OUT PDISPATCHER_CONTEXT DispatcherContext
);

当异常发生时,系统异常调度器例程启动并设置它自己的堆栈框架。ExceptionHandler的结构被压入堆栈。

在 SEH 覆盖场景中,攻击者是幸运的,因为系统异常调度程序例程在调用ExceptionHandler函数之前创建者帧值放在[ESP+8]的堆栈中

建立者是指向NextSEH记录的指针攻击者可以通过用任意内存地址覆盖NextSEH记录来控制它

注意: Attacker 还没有覆盖ResponderFrame然而,攻击者已经覆盖了栈上的NextSEH指针。

一次,您传递异常System Exception Dispatcher将控制权传递给SE 处理程序并执行异常处理代码。

剥削策略:

  1. 攻击者将使用后向跳转覆盖NextSEH使用POP/POP/RET序列的地址覆盖SE Handler
  2. 一旦异常发生,由于异常调度例程序言NextSEH的地址将被放置在[ESP+8]的堆栈中
  3. 一旦异常被传递,异常调度程序例程会将控制权传递给SE Handler
  4. SE处理器将执行POP / POP / RET序列,将POP的地址NextSEHEIP因此,获得代码执行。

如果答案中有错误,请接受我的歉意,并请帮助改进答案,以便对社区成员有用。

谢谢。

是的,您可以简单地向后跳。控制流应该到达你的 NOP 垫,你可以在那里编码你的蹦床。