Не могу понять, как работает мой шелл-код.Shellcode для Windows OS (не Linux!), Чтобы открыть calc.exe - PullRequest
0 голосов
/ 28 января 2019

У меня есть шелл-код.Он открывает калькулятор в моей программе переполнения буфера.

0:  eb 16                   jmp    0x18
2:  5b                      pop    ebx
3:  31 c0                   xor    eax,eax
5:  50                      push   eax
6:  53                      push   ebx
7:  bb 4d 11 86 7c          mov    ebx,0x7c86114d
c:  ff d3                   call   ebx
e:  31 c0                   xor    eax,eax
10: 50                      push   eax
11: bb ea cd 81 7c          mov    ebx,0x7c81cdea
16: ff d3                   call   ebx
18: e8 e5 ff ff ff          call   0x2
1d: 63 61 6c                arpl   WORD PTR [ecx+0x6c],sp
20: 63 2e                   arpl   WORD PTR [esi],bp
22: 65 78 65                gs js  0x8a
25: 00 90 90 90 90 90       add    BYTE PTR [eax-0x6f6f6f70],dl
2b: 90                      nop
2c: 90                      nop
2d: 90                      nop
2e: 90                      nop
2f: 90                      nop

Помимо основного вопроса «Что этот шеллкод делает построчно», меня особенно интересует:

  1. Операция jmp, почему и где прыгает моя программа?
  2. Материал arpl, я вижу его впервые, и Google мне мало помогает ... То же самое с операцией GS

1 Ответ

0 голосов
/ 28 января 2019

jmp 0x18 - это относительный переход к смещению 0x18, что практически является концом вашего кода.Затем он вызывает адрес 0x2 (опять же, относительный).Этот вызов помещает «адрес возврата» в стек, так что он может быть извлечен из него, давая вам подсказку об адресе, в котором выполняется этот относительный шелл-код.И действительно, pop ebx со смещением 0x2 получает адрес из стека.

Я сказал, что 0x18 - это конец кода, потому что строки после него являются байтами данных, а не кодами операций asm.Вот почему вы видите arpl.Если вы посмотрите на шестнадцатеричные значения байтов, вы увидите:

calc.exe\0 ==> 0x63 0x61 0x63 0x6c 0x2e 0x65 0x78 0x65 0x00

Отредактировано:

Полный поток шелл-кодаis:

  1. jmp 0x18 - переход к последней инструкции кода шеллкода
  2. call 0x2 - возврат к смещению 2 и сохранение адреса смещения 0x1D в стеке
  3. pop ebx - ebx: = адрес из стека, который является адресом строки "calc.exe"
  4. xor eax,eax - общий код операции для обнуления регистра: eax: =0
  5. push eax - введите значение 0 в качестве второго аргумента для вызова будущей функции
  6. push ebx - нажмите указатель на «calc.exe» в качестве первого аргумента для будущеговызов функции
  7. mov ebx,0x7c86114d - ebx будет фиксированным адресом (вероятно, WinExec)
  8. call ebx - вызов функции: WinExec ("calc.exe", 0)
  9. xor eax,eax - снова eax: = 0
  10. push eax - введите значение 0 в качестве первого аргумента для будущего вызова функции
  11. mov ebx,0x7c81cdea - ebx будет фиксированнымадрес (возможно, бывшийит)
  12. call ebx - вызвать функцию: exit (0)
...