Шеллкоды, продолжение 0.

Jan 24, 2020 16:46


Помимо gcc, на винде, ес-но, есть свои средства для компиляции и т.д. Открываем Developer Command prompt от Студии, команда cl file.c /Fo также соберет объектник (и не сможет слинковать ехе, как отключить это я хз), а dumpbin /SECTION:.text /DISASM file.o , аналогично, выведет дизасм. Следует помнить, что сам cl.exe может создавать секцию с именем не .text , а какой-нибудь .text$mn .

Студийный компилятор поддерживает асм-вставки (для 32 бит), но вот беда, не поддерживает метки и переходы по ним. Что с этим делать, черт его знает, встречал решения высчитывать вручную адреса для прыжка, но это утомительно и глупо, и ес-но не дает возможность потом особо менять код. Как вариант - писать на чистом Асм и собирать с помощью другого ассемблера (ибо майкрософтовский Масм не умеет собирать чисто бинарные файлы, ему нужна точка входа и все такое). Берем Nasm (или что-то другое, фасм, uasm, poasm..), и конвертируем код. В случае с Nasm следует явно указывать битность ( [BITS 32] вначале ), и помнить, что там нет некоторых директив, скажем меток @@: , ptr и т.п.

Возьмем стандартный код поиска базы kernel32:

int GetKernel32()
{
__asm
  {
  mov eax, dword ptr fs:[30h]
  mov eax, dword ptr [eax+0ch]
  mov esi, dword ptr [eax+1ch]
  lodsd
  mov eax, dword ptr [eax+08h]
  }
}

Он соберется студией, но может работать через раз, т.к. на семерке найдет адрес kernelbase.. Короче, нужно немного оптимизировать, чтобы явно проверять , нашли ли мы адрес кернела или чего-то еще.

assume fs:nothing
mov ebx,fs:[TEB.Peb]
mov ebx,[ebx][PEB.Ldr]
mov ebx,[ebx][PEB_LDR_DATA.InLoadOrderModuleList]
mov esi,ebx ; esi - первый элемент кольцевого списка
@Nx: cmp [ebx][LDR_DATA_TABLE_ENTRY.DllBase],NULL
je @F
mov eax,[ebx][LDR_DATA_TABLE_ENTRY.BaseDllName][UNICODE_STRING.Buffer]
movzx ecx,[ebx][LDR_DATA_TABLE_ENTRY.BaseDllName][UNICODE_STRING._Length]

; здесь сравнивать, в еах будет строка с именем модуля, в есх длина
@@: mov ebx,[ebx][LIST_ENTRY.Flink]
cmp ebx,esi
jne @Nx
xor eax,eax
ret
@Fd: mov eax,[ebx][LDR_DATA_TABLE_ENTRY.DllBase]
ret

Переведем код в Nasm, заодно указав смещения, дабы не объявлять все эти структуры. Также следует помнить о прологе, эпилоге, сохранению регистров согласно stdcall (esi,edi,ebx):

[BITS 32]
push ebp
mov ebp,esp
push edi
mov ebx,dword [fs:30h]
mov ebx,dword [ebx+0Ch]
mov ebx,dword [ebx+0Ch]
mov edi,ebx
@Nx:
cmp dword [ebx+18h],0
je short @Fx
mov eax,dword [ebx+30h]
movzx ecx,word [ebx+2Ch]
;тут сравниваем строку, допишу потом
nop
@Fx:
mov ebx,dword [ebx]
cmp ebx,edi
jnz short @Nx
xor eax,eax
ret
@Fd:
MOV EAX,DWORD [EBX+18h]
pop edi
pop ebp
ret

asm, noob, заметки, visual studio, shellcode

Previous post Next post
Up