Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Linux ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 238

Автор Роббинс ΠΡ€Π½ΠΎΠ»ΡŒΠ΄

Linux ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… - img_29.jpeg

Рис. 15.1. АдрСсноС пространство Linux/Unix, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ области

ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π²ΡˆΠΈΠΌ эту схСму, Π±Ρ‹Π» Electric Fence. Electric Fence являСтся вставляСмым замСститСлСм для

malloc()
ΠΈ Π΄Ρ€. Он Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° ΠΌΠ½ΠΎΠ³ΠΈΡ… систСмах Unix ΠΈ GNU/Linux; ΠΎΠ½ доступСн с FTP Π°Ρ€Ρ…ΠΈΠ²Π° Π΅Π³ΠΎ Π°Π²Ρ‚ΠΎΡ€ΠΎΠ². [178] Он поставляСтся Ρ‚Π°ΠΊΠΆΠ΅ со ΠΌΠ½ΠΎΠ³ΠΈΠΌΠΈ дистрибутивами GNU/Linux, хотя, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Π°ΠΌ придСтся Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Сю явным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΡ€ΠΈ установкС систСмы.

ПослС ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с Electric Fence любой доступ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ памяти Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚

SIGSEGV
. Electric Fence Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ использования ΡƒΠΆΠ΅ освобоТдСнной памяти. Π’ΠΎΡ‚ простая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, которая ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΠ±Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹.

1 Β /* ch15-badmem1.с --- ΠΏΠ»ΠΎΡ…ΠΎ обращаСтся с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ */

2

3Β  #include <stdio.h>

4Β  #include <stdlib.h>

5

6Β  int main(int argc, char **argv)

7Β  {

8Β  Β char *p;

9Β  Β int i;

10

11Β  p = malloc(30);

12

13 Β strcpy(p, "not 30 bytes");

14Β  printf("p = <%s>\n", p);

15

16Β  if (argc ==2) {

17Β Β  if (strcmp(argv[1], "-b") == 0)

18Β Β Β  p[42] = 'a'; /* ΠΊΠΎΡΠ½ΡƒΡ‚ΡŒΡΡ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ */

19Β Β  else if (strcmp(argv[1], "-f") == 0) {

20Β Β Β  free(p); /* ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π·Π°Ρ‚Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅ */

21Β Β Β  p[0] = 'b';

22Β Β  }

23Β  }

24

25  /* освобоТдСниС (p); */

26

27Β  return 0;

28 }

Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° осущСствляСт ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ ΠΎΠΏΡ†ΠΈΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ вСсти сСбя ΠΏΠ»ΠΎΡ…ΠΎ:

-b
Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ доступ ΠΊ памяти Π·Π° Π΅Π΅ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌΠΈ страницами, Π°
-f
пытаСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½Π½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ. (Π‘Ρ‚Ρ€ΠΎΠΊΠΈ 18 ΠΈ 21 ΡΠ²Π»ΡΡŽΡ‚ΡΡ соотвСтствСнно опасными.) ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π±Π΅Π· ΠΎΠΏΡ†ΠΈΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ освобоТдаСтся (строка 25), Electric Fence Π½Π΅ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ этот случай.

Одним ΠΈΠ· способов использования Electric Fence, способом, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… систСмах Unix ΠΈ GNU/Linux, являСтся статичСская ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠ° с Π½ΠΈΠΌ вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π—Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π° ΠΈΠ· ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ°. (ДокумСнтация Electric Fence явно ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Electric Fence Π½Π΅ слСдуСт ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Π°Ρ‚ΡŒ с Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΌ Ρ„Π°ΠΉΠ»ΠΎΠΌ Π³ΠΎΡ‚ΠΎΠ²ΠΎΠ³ΠΎ издСлия.) Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ сСанс дСмонстрируСт эту ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ ΠΈ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ происходит для ΠΎΠ±Π΅ΠΈΡ… ΠΎΠΏΡ†ΠΈΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки:

$ <b>cc -g ch15-badmem1.c -lefence -ΠΎ ch15-badmem1</b> /* ΠžΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ; ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠ° статичСская */

$ <b>gdb ch15-badmem1</b> /* Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΈΠ· ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ° */

GNU gdb 5.3

...

(gdb) <b>run -b</b> /* ΠŸΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ†ΠΈΡŽ -b */

Starting program: /home/arnold/progex/code/ch15/ch15-badmem1 -b

[New Thread 8192 (LWP 28021)]

Electric Fence 2.2.0 Copyright (C) 1987-1999 Bruce Perens &lt;[email protected]&gt;

p = &lt;not 30 bytes&gt;

Program received signal SIGSBGV, Segmentation fault.

SIGSBGV: GDB prints where

[Switching to Thread 8192 (LWP 28021)]

0x080485b6 in main (argc=2, argv=0xbffff8a4) at ch15-badmem1.c:18

18 p[42] = 'a'; /* ΠΊΠΎΡΠ½ΡƒΡ‚ΡŒΡΡ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ */

(gdb) <b>run -f</b> /* Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ†ΠΈΡŽ -f */

The program being debugged has been started already.

Start it from the beginning? (y or n) <b>y</b> /* Π”Π° */

Starting program: /home/arnold/progex/code/ch15/ch15-badmem1 -f

[New Thread 8192 (LWP 28024)]

Electric Fence 2.2.0 Copyright (C) 1987-1999 Bruce Perens &lt;[email protected]&gt;

p = &lt;not 30 bytes&gt;

Program received signal SIGSEGV, Segmentation fault. /* Π‘Π½ΠΎΠ²Π° SIGSEGV */

[Switching to Thread 8192 (LWP 28024)]

0x080485e8 in main (argc=2, argv=0xbffff8a4) at ch15-badmem1.c:21

21 p[0] = 'b';

На систСмах, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ раздСляСмыС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ окруТСния

LD_PRELOAD
(Π² Ρ‚ΠΎΠΌ числС ΠΈ Π½Π° GNU/Linux), Π²Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ явным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ
efence
. ВмСсто этого сцСнарий ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ
ef
ΠΎΡ€Π³Π°Π½ΠΈΠ·ΡƒΠ΅Ρ‚ запуск ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ настройкой.

Π₯отя ΠΌΡ‹ Π½Π΅ описали ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ, GNU/Linux (ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ систСмы Unix) ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ раздСляСмыС (shared) Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, особыС вСрсии Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ хранятся Π² ΠΎΠ΄Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ Π½Π° дискС, вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ исполняСмый Ρ„Π°ΠΉΠ» ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. РаздСляСмыС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ экономят дисковоС пространство ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΡΠΈΡΡ‚Π΅ΠΌΠ½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ всС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ раздСляСмыС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ копию Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π² памяти. ΠŸΠ»Π°Ρ‚ΠΎΠΉ Π·Π° это являСтся Π·Π°ΠΌΠ΅Π΄Π»Π΅Π½ΠΈΠ΅ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΈ Ρ€Π°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ ΠΊ Π΄Ρ€ΡƒΠ³Ρƒ ΠΏΡ€Π΅ΠΆΠ΄Π΅, Ρ‡Π΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° смоТСт Π½Π°Ρ‡Π°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. (ΠžΠ±Ρ‹Ρ‡Π½ΠΎ это ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎ для вас, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.)

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ окруТСния

LD_PRELOAD
заставляСт систСмный Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ исполняСмыС Ρ„Π°ΠΉΠ»Ρ‹ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ) ΡΠ²ΡΠ·Π°Ρ‚ΡŒΡΡ со ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ Π΄ΠΎ стандартных Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ. Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΉ
ef
ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ эту ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ для связывания Π½Π°Π±ΠΎΡ€Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ
malloc()
Π² Electric Fence. [179] Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, повторная ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠ° Π΄Π°ΠΆΠ΅ Π½Π΅ Π½ΡƒΠΆΠ½Π°. Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ дСмонстрируСт
ef
: