возврат в libc работает в gdb, но не в одиночку - PullRequest
1 голос
/ 14 ноября 2010

Я пытаюсь вернуться к libc trick со следующим простым кодом:

#define SYSTEM_CALL_ADDR 0xb7ec5e50  /*my system call addr*/
#define EXIT_CALL_ADDR  0xb7ebbb80   /*my exit call addr*/
char shell[] = "/bin/sh";

int main(){
 int* p; 
 p = (int*)&p + 2;
 *p = SYSTEM_CALL_ADDR;

 p = (int*)&p + 3;
 *p = EXIT_CALL_ADDR;

 p = (int*)&p + 4;
 *p = shell;

 return 1;
}

Интересно, что когда я запускаю эту программу, она заканчивается "Ошибка сегментации", но если я отлаживаю ее с помощью gdb и запускаюшаг за шагом, все нормально, порождая оболочку и затем выходя из программы.Кто-нибудь встречал эту ситуацию?или кто-нибудь может подсказать, пожалуйста, как это исправить?Сперва спасибоЯ использую ядро ​​ArchLinux: 2.6.33, gcc 4.5.0.

Ответы [ 3 ]

3 голосов
/ 14 ноября 2010

GDB отключает некоторые методы уменьшения эксплойтов из-за переполнения буфера, такие как ProPolice и рандомизация расположения адресного пространства (ASLR).

1 голос
/ 14 ноября 2010

gdb устанавливает ADDR_NO_RANDOMIZE индивидуальность (2) для облегчения отладки.

0 голосов
/ 14 ноября 2010

Сбой происходит из-за того, что ваше объявление переменной 'p' выделяет в вашем стеке только достаточно места для одного (int *) указателя, но затем вы помещаете значения в (& p + 2) и т. Д.-knows-что.Он ведет себя по-разному с GDB или без него, потому что часть «кто знает, что» может быть не критичной в одной среде, но критичной в другой.

Возможно, вы сможете «исправить» свою программу, убедившись, чтопространство, которое вы собираетесь выбросить, не является чем-то критичным.

int main(){
 int* p;
 char junk[100];    /* ADD THIS */

Теперь пространство, следующее за хранилищем, выделенным для 'p', (скорее всего) будет массивом мусорных символов, который вы можете получитьперезаписать(По крайней мере, это «исправляет» программу в моей конкретной системе Linux, когда я компилирую с помощью «gcc -O0 -g»).

Все, что сказано - метод, который вы там используете, отсутствует в любомспособ портативный или безопасный.Компилятор не дает никаких обещаний, что он собирается расположить хранилища в определенном порядке, в котором мы их объявляем.Кроме того, компиляция с различными ключами оптимизации может изменить поведение.Так что, хотя это может быть интересным упражнением, вы не должны ожидать, что этот метод будет работать согласованно.

Ручное манипулирование стеком C таким способом - ПЛОХАЯ ИДЕЯ!

...