.dtors выглядит перезаписываемым, но пытается записать segfault

Вам не нужно ничто специальное; с тех пор xclip работы stdin, просто

ssh remotehost xclip < myconf.conf

Почему это должно было бы быть изменено с sed? ssh очевидно для данных, когда он не используется в качестве терминала и наиболее часто используемый в конвейерах такой как

tar cfz - somedir | ssh remotehost 'cd destdir; tar xfz -'`
9
25.02.2011, 04:59
2 ответа

Те разделы отмечены GNU_RELRO (перемещения только для чтения), что означает, что, как только динамический загрузчик договорился (во время загрузки, нет никаких ленивых перемещений там), все перемещения, он отмечает те разделы, только для чтения. Обратите внимание что большая часть .got.plt находится на другой странице, не проходит лечение.

Вы видите сценарий компоновщика с ld --verbose, при поиске RELRO, Вы найдете что-то подобным:

.got            : { *(.got) }
. = DATA_SEGMENT_RELRO_END (12, .);
.got.plt        : { *(.got.plt) }

что означает, что разделы RELRO заканчивают 12 байтов в .got.plt (указатели на динамические функции компоновщика уже разрешены, так может быть отмечен только для чтения).

Укрепленный хинду проект имеет некоторую документацию о RELRO по http://www.gentoo.at/proj/en/hardened/hardened-toolchain.xml#RELRO.

5
27.01.2020, 20:07

Я могу сказать, почему это перестало работать, хотя я на самом деле не знаю, какая часть системы ответственна. В то время как .dtors отмечен перезаписываемый в двоичном файле, он похож на него (наряду с .ctors, ПОЛУЧЕННЫЙ, и несколько других вещей), отображаются в отдельную, неперезаписываемую страницу в памяти. В моей системе, .dtors становится помещенным в 0x8049f14:

$ readelf -S test
  [17] .ctors            PROGBITS        08049f0c 000f0c 000008 00  WA  0   0  4
  [18] .dtors            PROGBITS        08049f14 000f14 000008 00  WA  0   0  4
  [19] .jcr              PROGBITS        08049f1c 000f1c 000004 00  WA  0   0  4
  [20] .dynamic          DYNAMIC         08049f20 000f20 0000d0 08  WA  6   0  4
  [21] .got              PROGBITS        08049ff0 000ff0 000004 04  WA  0   0  4
  [22] .got.plt          PROGBITS        08049ff4 000ff4 00001c 04  WA  0   0  4
  [23] .data             PROGBITS        0804a010 001010 000008 00  WA  0   0  4
  [24] .bss              NOBITS          0804a018 001018 000008 00  WA  0   0  4

Если я выполняю исполняемый файл и проверку /proc/PID/maps, Я вижу:

08048000-08049000 r-xp 00000000 08:02 163678     /tmp/test
08049000-0804a000 r--p 00000000 08:02 163678     /tmp/test
0804a000-0804b000 rw-p 00001000 08:02 163678     /tmp/test

.data/.bss все еще перезаписываемы на их собственной странице, но других в 0x8049000-0x804a000 не. Я предполагаю, что это - средство защиты в ядре (когда Вы сказали, "было перемещение к .dtors только для чтения, plt, получено в последнее время"), но я не знаю конкретно, что это назвало (OpenBSD имеет названный W^X чего-то очень похожего; Linux имеет PaX, но не встроенный в большинство ядер),

Можно обойти его с mprotect, который позволяет Вам изменить атрибуты в оперативной памяти страницы:

mprotect((void*)0x8049000, 4096, PROT_WRITE);

С этим моя тестовая программа не отказывает, но если я пытаюсь перезаписать сигнальную метку конца .dtors (0x8049f18) с адресом другой функции все еще не выполняется та функция; та первая часть не может выяснить.

Надо надеяться, кто-то еще знает то, что ответственно за то, что сделало страницу только для чтения, и почему изменение .dtors кажется, ничего не делает в моей системе

5
27.01.2020, 20:07
  • 1
    Если Linux OP с PaX mprotect не может сделать исполняемую страницу перезаписываемой или сделать исполняемый файл страницы, который был перезаписываем прежде, если та опция не отключена с paxctl -m. –  stribika 25.02.2011, 15:23
  • 2
    @stribika, хороший для знания –  Michael Mrozek♦ 25.02.2011, 17:12

Теги

Похожие вопросы