Шеллкоды и т.д. Часть 0

Jan 24, 2020 16:22

Никаких особых объяснений здесь не будет, так как я пишу больше для себя, кому интересно - спрашивайте в коментах или ищите в гугле.

Допустим, есть самая простая Сишная функция

int mul (int a, int b) {
  return a * b;
}

Открываем командную строку GNU (линукс компилятор), и пишем gcc -m32 file.c
Появится 32 битный объектный файл. Далее делаем так: objdump -j .text -d file.o -M intel
Будет выхлоп примерно такого формата:

file.o: file format pe-i386
Disassembly of section .text:
00000000 :
0:   55           push ebp
1:   89 e5        mov ebp,esp
3:   8b 45 08     mov eax,DWORD PTR [ebp+0x8]
6:   0f af 45 0c  imul eax,DWORD PTR [ebp+0xc]
a:   5d           pop ebp
b:   c3           ret

Этот байткод копируем (нужно написать скрипт для автоматизации), как unsigned char массив. Короче говоря, в коде это будет выглядеть так:
unsigned char sxmul[] = "\x55\x89\xe5\x8b\x45\x08\x0f\xaf\x45\x0c\x5d\xc3";

int main()
{
int (*pfunc)();//int mul (int a, int b)

pfunc = (int (*)())sxmul;

printf("%d\n",pfunc(3,9));
return 0;
}

Компилировать и запускать это лучше в Code::blocks (все тот же gcc), т.к. в других компиляторах такой фокус не пройдет, и придется явно выделять память через VirtuAlloc, делать ее исполняемой, копировать туда ШК и запускать. Ниже пример на Масм.

.data
pmul db 055h,089h,0e5h,08bh,045h,008h,00fh,0afh,045h,00ch,05dh,0c3h ; простое умножение Х на У

.code
start:

invoke VirtualAlloc,0,4096,MEM_COMMIT, PAGE_EXECUTE_READWRITE ;выделить память для исполнения
.if !eax
jmp @ex
.endif
mov esi,offset pmul ;адрес шеллкода
mov ecx,sizeof pmul ;его размер
mov edi,eax ;адрес, куда копировать (т.е. выделенная память)

rep movsb ;копируем шк, т.к. исполнять что-то в data сложно и не нужно

push 3 ;тестируем , передавая два аргументы для умножения
push 9
call eax ;Не call dword ptr [eax] !
@ex:
exit
end start

asm, noob, #include, заметки, masm32, shellcode, c

Previous post Next post
Up