jmp 0x18
- это относительный переход к смещению 0x18, что практически является концом вашего кода.Затем он вызывает адрес 0x2 (опять же, относительный).Этот вызов помещает «адрес возврата» в стек, так что он может быть извлечен из него, давая вам подсказку об адресе, в котором выполняется этот относительный шелл-код.И действительно, pop ebx
со смещением 0x2 получает адрес из стека.
Я сказал, что 0x18 - это конец кода, потому что строки после него являются байтами данных, а не кодами операций asm.Вот почему вы видите arpl
.Если вы посмотрите на шестнадцатеричные значения байтов, вы увидите:
calc.exe\0 ==> 0x63 0x61 0x63 0x6c 0x2e 0x65 0x78 0x65 0x00
Отредактировано:
Полный поток шелл-кодаis:
jmp 0x18
- переход к последней инструкции кода шеллкода call 0x2
- возврат к смещению 2 и сохранение адреса смещения 0x1D в стеке pop ebx
- ebx: = адрес из стека, который является адресом строки "calc.exe" xor eax,eax
- общий код операции для обнуления регистра: eax: =0 push eax
- введите значение 0 в качестве второго аргумента для вызова будущей функции push ebx
- нажмите указатель на «calc.exe» в качестве первого аргумента для будущеговызов функции mov ebx,0x7c86114d
- ebx будет фиксированным адресом (вероятно, WinExec) call ebx
- вызов функции: WinExec ("calc.exe", 0) xor eax,eax
- снова eax: = 0 push eax
- введите значение 0 в качестве первого аргумента для будущего вызова функции mov ebx,0x7c81cdea
- ebx будет фиксированнымадрес (возможно, бывшийит) call ebx
- вызвать функцию: exit (0)