Разделы презентаций


ВВПД ЛЕКЦИЯ

Содержание

x86 Little-endian (от младшего к старшему)0123 → 0123`0000 (big-endian)3210 → 3210’0000 (little-endian)

Слайды и текст этой презентации

Слайд 1


Слайд 3x86
Little-endian (от младшего к старшему)
0123 → 0123`0000 (big-endian)
3210 → 3210’0000

(little-endian)

x86	Little-endian (от младшего к старшему)0123 → 0123`0000 (big-endian)3210 → 3210’0000 (little-endian)

Слайд 4Little-endian (от младшего к старшему)
Запись обратная арабским цифрам
Сохраняет значение при

увеличении размера
Пример
0123 → 0123`0000 (big-endian)
3210 → 3210’0000 (little-endian)

Little-endian (от младшего к старшему)Запись обратная арабским цифрамСохраняет значение при увеличении размераПример0123 → 0123`0000 (big-endian)3210 → 3210’0000

Слайд 5Режимы работы процессора
Real mode
Сразу после включения
16-битный набор инструкций
Общее адресное пространство

~1 Мб

Protected mode
Переключается вручную
Ring 0-1
Виртуальная память
32-битный набор инструкций

Режимы работы процессораReal modeСразу после включения16-битный набор инструкцийОбщее адресное пространство ~1 МбProtected modeПереключается вручнуюRing 0-1Виртуальная память32-битный набор

Слайд 6Разделение привелегий
Ring 0 – kernel mode
Ring 1 – не

используется
Ring 2 – не используется
Ring 3 – user mode
Ring -1

– Hypervisor mode
Ring -2 – SMM – system management mode
Разделение привелегийRing 0 – kernel mode Ring 1 – не используетсяRing 2 – не используетсяRing 3 –

Слайд 7Регистры
EAX
EBX
ECX - Счетчик в циклах
EDX
ESI - Источник в операциях работы

с памятью и строками
EDI - Назначение в операциях работы с

памятью и строками
EBP - Указатель на базу фрейма
ESP - Указатель стека
EIP – указатель на текущую инструкцию
РегистрыEAXEBXECX - Счетчик в циклахEDXESI - Источник в операциях работы с памятью и строкамиEDI - Назначение в

Слайд 8Регистры

Регистры

Слайд 9Типы данных
Bytes – 8 бит. Пример: AL, AH, BL, CL
Word

– 16 бит. Пример: AX, BX, CX
Double word – 32

бита. Пример: EAX, EBX, ECX
Quad word – 64 бита. В x86 нету GPR способного вместить 64 бита, однако два регистра вполне справиться с этой задачей, обычно это пара EDX:EAX. 64-х битные значения используются в x86 не часто но например инструкция RDTSC записывает 64-бита в EDX:EAX.

Типы данныхBytes – 8 бит. Пример: AL, AH, BL, CLWord – 16 бит. Пример: AX, BX, CXDouble

Слайд 11Работа с данными
Литерал в регистр
Регистр в регистр
Литерал в память
Регистр в

память и наоборот
Из памяти в память

Работа с даннымиЛитерал в регистрРегистр в регистрЛитерал в памятьРегистр в память и наоборотИз памяти в память

Слайд 12Формат записи (синтаксис)
Intel
операция приемник, источник
mov eax, ebx ; eax =

ebx
mov eax, [ebx] ; eax = *ebx
mov ecx, AABBCC99h ;

ecx=0xAABBCC99

AT&T

операция(размер) источник, приемник
movl %ebx, %eax ; %-префикс регистра
movl (%ebx), %eax
movl $0xAABBCC99, %eax ; $ - префикс для литералов
Суффикс для типов данных – movl – long, movb – byte…

Формат записи (синтаксис)Intelоперация приемник, источникmov eax, ebx ; eax = ebxmov eax, [ebx] ; eax = *ebxmov

Слайд 13Перемещение данных
01: mov dword ptr [eax], 1
; установить

значение по адресу EAX в 1
02: mov ecx,

[eax]
; установить ECX в значение по адресу EAX
03: mov [eax], ebx
; установить значение по адресу EAX в EBX
04: mov [esi+34h], eax
; установит значение по адресу (ESI+34) в EAX
05: mov eax, [esi+34h]
; установить EAX в значение по адресу (EAX+34)
06: mov edx, [ecx+eax]
; установить EDX в значение по адресу (ECX+EAX)

01: *eax = 1;
02: ecx = *eax;
03: *eax = ebx;
04: *(esi+34) = eax;
05: eax = *(esi+34);
06: edx = *(ecx+eax);

Перемещение данных01: mov  dword ptr [eax], 1 ; установить значение по адресу EAX в 1 02:

Слайд 14Доступ к полям структур
> dt _TEB
ntdll!_TEB
+0x000 NtTib :

_NT_TIB
+0x01c EnvironmentPointer : Ptr32 Void
+0x020 ClientId : _CLIENT_ID

+0x028 ActiveRpcHandle : Ptr32 Void
+0x02c ThreadLocalStoragePointer : Ptr32 Void
+0x030 ProcessEnvironmentBlock : Ptr32 _PEB
...

[base[*counter] + offset]
mov eax, fs:[0x18]
; load _TEB of current thread
mov ebx, [eax + 30h]
; load prt to PEB to EAX

Доступ к полям структур> dt _TEB ntdll!_TEB +0x000 NtTib : _NT_TIB +0x01c EnvironmentPointer : Ptr32 Void +0x020

Слайд 15Арифметические операции (кратко)
01: add esp, 14h

; esp = esp + 0x14
02: sub

ecx, eax ; ecx = ecx - eax
03: sub esp, 0Ch ; esp = esp - 0xC
04: inc ecx ; ecx = ecx + 1
05: dec edi ; edi = edi - 1
06: or eax, 0FFFFFFFFh ; eax = eax | 0xFFFFFFFF
07: and ecx, 7 ; ecx = ecx & 7
08: xor eax, eax ; eax = eax ^ eax
09: not edi ; edi = !edi
Арифметические операции (кратко)01: add  esp, 14h     ; esp = esp + 0x14

Слайд 16Стек
FILO – First In Last Out
РАСТЕТ С ВЕРХУ ВНИЗ!!! ОТ

СТАРШИХ АРЕСОВ К МЛАДШИМ!!!
Хранение локальных переменных
Сохранение состояния работы программы
Push -

положить данные на стек
Pop - взять данные со стека
ESP – указатель на текущей адрес стека
СтекFILO – First In Last OutРАСТЕТ С ВЕРХУ ВНИЗ!!! ОТ СТАРШИХ АРЕСОВ К МЛАДШИМ!!!Хранение локальных переменныхСохранение состояния

Слайд 17Стек в работе
EAX = 0; ESP = 0xFFEF
pop EAX;
EAX

= 0x000000AF; ESP = 0xFFF3

EAX = 0xBADBAD; ESP = 0xFFEF
push

EAX;
EAX = 0xBADBAD; ESP = 0xFFEB
Стек в работеEAX = 0; ESP = 0xFFEFpop EAX; EAX = 0x000000AF; ESP = 0xFFF3EAX = 0xBADBAD;

Слайд 18Большой блок памяти на стеке
sub esp, 0x28 ; выделяем на

стеке 0x28 байт
mov [esp + 0x28], eax
mov [esp + 0x24],

0x55555444

add esp, 0x28 ; освободили выделенную ранее память
Большой блок памяти на стекеsub esp, 0x28 	; выделяем на стеке 0x28 байтmov [esp + 0x28], eaxmov

Слайд 19Инструкция CALL

Что делает:
Сохраняет на стеке адрес следующий за ним инструкции
Уменьшает

значение ESP на DWORD
Выставляет регистр EIP в значение переданное

в качестве аргумента (выполняет безусловный переход)

Что не делает:
Не регламентирует передачу аргументов в функцию
Не регламентируют освобождение ресурсов после завершения работы функции
Не регламентирует неизменность регистров в процессе работы функции
Инструкция CALLЧто делает:Сохраняет на стеке адрес следующий за ним инструкцииУменьшает значение ESP на DWORD Выставляет регистр EIP

Слайд 20Конвенция вызова
Как передавать аргументы в функцию
Как возвращать результат выполнения
Как освобождать

занятые ресурсы

Конвенция вызоваКак передавать аргументы в функциюКак возвращать результат выполненияКак освобождать занятые ресурсы

Слайд 21Конвенции вызова

Конвенции вызова

Слайд 22Пример cdecl
push dword 0x44 ; кладем последний аргумент на стек
push

dword 0x33 ; кладем первый аргумент на стек
call sum ; sum(51,

68)
add esp, 8 ; удаляем аргументы со стека
test eax, eax ; ??
jz exit
….
Пример cdeclpush dword 0x44 	; кладем последний аргумент на стекpush dword 0x33 	; кладем первый аргумент на

Слайд 23Стековый кадр (stack frame)
Область на стеке, формируемая для каждой процедуры
Содержит

в себе:
Аргументы процедуры
Локальные переменные
Служебная информация
Точное содержание и схема размещения

зависят от архитектуры
Формируется в начале работы каждой процедуры
Стековый кадр (stack frame)Область на стеке, формируемая для каждой процедурыСодержит в себе:Аргументы процедурыЛокальные переменныеСлужебная информация Точное содержание

Слайд 24Стековый кадр (stack frame)
int foobar(int a, int b, int

c){
int xx = a + 2;
int

yy = b + 3;
int zz = c + 4;
int sum = xx + yy + zz;
return xx * yy * zz + sum;
}

int main(){
return foobar(77, 88, 99);
}

_foobar:
push ebp
mov ebp, esp
sub esp, 16


; math code here


; mov esp, ebp
; pop ebp
leave
ret

Стековый кадр (stack frame) int foobar(int a, int b, int c){  int xx = a +

Слайд 25Стековый кадр (stack frame)
int foobar(int a, int b, int

c){
int arr[3];
arr[0] = a + 2;
arr[1] = b

+ 3;
arr[2] = c + 4;
int sum = a + b + c;
return a * b * c + sum;
}

int main(){
return foobar(77, 88, 99);
}

_foobar:
push ebp
mov ebp, esp
sub esp, 16


; math code here


; mov esp, ebp
; pop ebp
leave
ret

Стековый кадр (stack frame) int foobar(int a, int b, int c){  int arr[3];arr[0] = a +

Слайд 26Стековый кадр (stack frame)
int* foobar(int* a, int size, int

inc) {
int arr[3];
for(int i=0; i

a[i] + inc;}
return arr;
}

int main(){
int a[] = {1, 2, 3};
return foobar(a, 3, 99);
}

_foobar:
push ebp
mov ebp, esp
sub esp, 16


; math code here


; mov esp, ebp
; pop ebp
leave
ret

Стековый кадр (stack frame) int* foobar(int* a, int size, int inc) {  int arr[3];for(int i=0; i

Слайд 27Стековый кадр (stack frame)
int* foobar(int* a, int size, int

inc) {
int arr[3];
for(int i=0; i

a[i] + inc;}
return arr;
}

int main(){
int a[] = {1, 2, 3, 4, 5};
return foobar(a, 5, 99);
}

_foobar:
push ebp
mov ebp, esp
sub esp, 16


; math code here


; mov esp, ebp
; pop ebp
leave
ret

Стековый кадр (stack frame) int* foobar(int* a, int size, int inc) {  int arr[3];for(int i=0; i

Слайд 28Уязвимость переполнение буфера на стеке
Описана впервые в 1996 году

в статье “Smashing stack for fun and profit”*
Эксплуатация уязвимости сводится

к выстраиванию определенного порядка данных на стеке
При удачной эксплуатации позволяет злоумышленнику исполнить произвольный код на атакуемой машине**
!До сих пор встречается в ПО!***

* В журнале Phrack (www.phrack.org)
** Уязвимость класса RCE (remote code execution)
*** CVE-2017-11882

Уязвимость переполнение буфера на стеке Описана впервые в 1996 году в статье “Smashing stack for fun and

Слайд 29Уязвимость переполнение буфера на стеке
Узнать адрес уязвимого буфера в

памяти
Узнать размер буфера
Переписать адрес возврата на адрес начала буфера
Написать

Подобрать шеллкод*
Передать шеллкод в качестве аргумента уязвимой функции

Profit!


void vuln(int str_len, char* str){
char buf[110];
for(int i = 0; i < str_len; i++){
buf[i] = str[i];
}
return;
}

int main(int argc, char* argv[]){
printf("I feel evil!\n");
vuln(strlen(shellcode)+1, shellcode);
printf("All is ok!\n");
return 0;
}

*https://www.exploit-db.com

Уязвимость переполнение буфера на стеке Узнать адрес уязвимого буфера в памятиУзнать размер буфераПереписать адрес возврата на адрес

Слайд 30Шеллкод (shellcode)
набор инструкций машинного кода
базонезависимый (PIC - position independent code)
не

содержит нулевых байт

code_start: jmp load_data setup_parameters: pop ebp

xor ecx,ecx push ecx ; ExitThread() exitcode push ecx ; SW_HIDE mov cl,(cmd_end-api_hashes) ; limit of 255 bytes per command inc byte ptr[ebp+ecx] lea eax,[ebp+(cmd_string-api_hashes)] push eax ; WinExec command string

get_k32_base: mov cl,30h mov eax,fs:[ecx] mov eax,[eax+0ch] mov esi,[eax+1ch] lodsd mov ebx,[eax+08h] push edx ; Operation = "open" push eax ; hwnd = NULL mov eax, 0x7ca41150 ; SHELL32.ShellExecuteA call eax

Шеллкод (shellcode)набор инструкций машинного кодабазонезависимый (PIC - position independent code)не содержит нулевых байтcode_start:   jmp load_data

Слайд 31Механизмы защиты
StackGuard
Non-exec stack (DEP)
ASLR

Механизмы защитыStackGuardNon-exec stack (DEP)ASLR

Слайд 32Источники:
https://habr.com/company/smart_soft/blog/234239/
https://en.wikibooks.org/wiki/X86_Disassembly/Calling_Conventions
http://www.codenet.ru/progr/asm/overflow.php
http://kmb.ufoctf.ru/hackerdom/bin/buffer_overflow/main.html
https://www.thezdi.com/blog/2018/9/04/announcing-pwn2own-tokyo-for-2018

Источники:https://habr.com/company/smart_soft/blog/234239/https://en.wikibooks.org/wiki/X86_Disassembly/Calling_Conventionshttp://www.codenet.ru/progr/asm/overflow.phphttp://kmb.ufoctf.ru/hackerdom/bin/buffer_overflow/main.htmlhttps://www.thezdi.com/blog/2018/9/04/announcing-pwn2own-tokyo-for-2018

Обратная связь

Если не удалось найти и скачать доклад-презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое TheSlide.ru?

Это сайт презентации, докладов, проектов в PowerPoint. Здесь удобно  хранить и делиться своими презентациями с другими пользователями.


Для правообладателей

Яндекс.Метрика