Перемещение пространства виртуальной памяти программы Linux x86_64 для облегчения исследования ROP

Программирование, ориентированное на возврат, — это метод, используемый для обхода защиты стека DEP или NX. Я играю с шеллкодированием ROP в x86_64 Linux.

Проблема в том, что пространство памяти моей программы и разделяемых библиотек, по-видимому, постоянно размещается в более низких адресах памяти.

cat /proc/26327/maps
7fdc62ff9000-7fdc63196000 r-xp 00000000 08:03 5317651                    /lib64/libc-2.19.so

12-байтовый адрес памяти мешает мне загружать шеллкод ROP, потому что 0 в адресе памяти завершают функцию strcpy, которую я переполняю.

У меня есть полный контроль над системой и исполняемым файлом. Есть ли способ заставить общие библиотеки загружаться по более высоким адресам памяти, чтобы я мог избежать 0 в адресном пространстве?


person pseudo    schedule 12.12.2014    source источник
comment
Адреса вашей программы и ее разделяемых библиотек будут выровнены по страницам. Некоторые из младших разрядов их адресов БУДУТ равны нулю.   -  person John Bollinger    schedule 12.12.2014
comment
@JohnBollinger: ROP-гаджеты, вероятно, не будут выровнены ...   -  person EOF    schedule 12.12.2014
comment
@EOF, возможно, так, но вопрос в адресе загрузки разделяемых библиотек. Но если бы был способ сделать это, то это был бы модифицированный динамический компоновщик.   -  person John Bollinger    schedule 12.12.2014
comment
@JohnBollinger: Нет, речь идет об адресах ROP-гаджетов, закодированных в шеллкоде, не содержащих '\0' байт.   -  person EOF    schedule 12.12.2014
comment
@EOF, возможно, это то, чего он на самом деле хочет, но он попросил указать способ принудительной загрузки общих библиотек по более высоким адресам памяти. Я не вижу, как интерпретировать это, кроме как вопрос об адресе загрузки библиотек.   -  person John Bollinger    schedule 12.12.2014
comment
Ничего страшного, если младшие биты равны 0. Как сказал @EOF, гаджеты не будут выровнены.   -  person pseudo    schedule 12.12.2014
comment
Я также нашел этот документ. Кажется, что адреса преднамеренно отображаются низко и этот процесс называется сопоставлением адресов ASCII-брони, если это действительно преднамеренная защита, может быть, есть опция sysctl, чтобы отключить ее?   -  person pseudo    schedule 12.12.2014


Ответы (1)


Это более фундаментально:
Когда AMD изобрела x86-64, они сделали канонические адреса обязательными. Хотя у вас теоретически есть 64-битное адресное пространство, современные процессоры x86-64 не раскрывают его полностью. Мой процессор, например, говорит мне, что у него есть cat /proc/cpuinfo: address sizes : 39 bits physical, 48 bits virtual. Поскольку верхняя половина виртуальных адресов зарезервирована для ядра, вы не можете избавиться от верхнего нулевого байта в пользовательском пространстве.

person EOF    schedule 12.12.2014
comment
Это разочаровывает, но спасибо за информацию! Я просто изменю его и пока буду использовать memcpy. - person pseudo; 12.12.2014