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