Jak wyłączyć optymalizację kompilatora gcc, aby włączyć przepełnienie bufora

Pracuję nad problemem z zadaniami domowymi , który wymaga wyłączenia ochrony optymalizacji kompilatora, aby działał. Używam gcc 4.4.1 na ubuntu linux, ale nie mogę dowiedzieć się, które flagi są właściwe. Zdaję sobie sprawę, że to zależy od architektury - moja maszyna pracuje z 32-bitowym procesorem Intela.

Dzięki.
Author: Community, 2010-02-26

6 answers

To dobry problem. Aby rozwiązać ten problem, musisz również wyłączyć ASLR w przeciwnym razie adres g() będzie nieprzewidywalny.

Wyłącz ASLR:

sudo bash -c 'echo 0 > /proc/sys/kernel/randomize_va_space'

Wyłącz kanarki:

gcc overflow.c -o overflow -fno-stack-protector

Po wyłączeniu kanarów i ASLR powinien to być prosty atak, jak ten opisany w rozwalanie stosu dla zabawy i zysku

Oto lista zabezpieczeń używanych w ubuntu: https://wiki.ubuntu.com/Security/Features Nie musisz się martwić o NX bitów, adres g() zawsze będzie w obszarze wykonywalnym pamięci, ponieważ znajduje się w segmencie pamięci tekstowej. Bity NX wchodzą w grę tylko wtedy, gdy próbujesz wykonać kod powłoki na stosie lub stercie, co nie jest wymagane do tego przydziału.

A teraz idź i zatrzaśnij to EIP !

 82
Author: rook,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-30 21:03:05

Urm, wszystkie odpowiedzi do tej pory były błędne, ponieważ odpowiedź Rooka jest poprawna.

Wejście:

echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

, po którym następuje:

gcc -fno-stack-protector -z execstack -o bug bug.c

Wyłącza ASLR, SSP / Propolice i Nonexec Ubuntu (który został umieszczony w 9.10 i dość prosty w obsłudze patrz mprotect (2) technika mapowania stron jako wykonywalnych i jmp) powinna trochę pomóc, jednak te "funkcje bezpieczeństwa" nie są bynajmniej nieomylne. Bez flagi '- z execstack' strony mają niestandardowe oznaczenia stosu.

 26
Author: Muhammed Abiola,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-25 10:07:17

W nowszych dystrybucjach (od 2016 roku), wydaje się, że PIE jest domyślnie włączona, więc będziesz musiał ją wyłączyć bezpośrednio podczas kompilacji.

Oto małe podsumowanie poleceń, które mogą być pomocne podczas odtwarzania lokalnie z ćwiczeniami przepełnienia bufora w ogóle:

Wyłącz kanarek:

gcc vuln.c -o vuln_disable_canary -fno-stack-protector

Disable DEP:

gcc vuln.c -o vuln_disable_dep -z execstack

Disable PIE:

gcc vuln.c -o vuln_disable_pie -no-pie

Wyłącz wszystkie wymienione powyżej mechanizmy ochrony (ostrzeżenie: dla testów lokalnych tylko):

gcc vuln.c -o vuln_disable_all -fno-stack-protector -z execstack -no-pie

W przypadku maszyn 32-bitowych należy również dodać parametr -m32.

 11
Author: Aydin K.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-25 11:51:16

Wypróbuj flagę -fno-stack-protector.

 5
Author: Kyle Lutz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-26 08:17:00

Wiem, że to stary wątek, ale chcę zaznaczyć, że nie musisz wyłączać ASLR, aby zrobić przepełnienie bufora! Chociaż ASLR jest włączone (kernel_randomize_va_space = 2), to nie będzie działać, chyba że skompilowany plik wykonywalny to PIE, więc dopóki u nie skompilujesz pliku z flagą-fPIC-pie, ASLR nie będzie działać.

Myślę, że wystarczy wyłączenie kanarków za pomocą-fno-stack-protector. Jeśli chcesz sprawdzić, czy ASLR działa, czy nie(musi być ustawiony kod niezależny od pozycji), use: hardening-check executable_name

 4
Author: AhlyM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-07 00:38:32

Nie będę cytował całej strony, ale cały podręcznik optymalizacji jest dostępny tutaj: http://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Optimize-Options.html#Optimize-Options

Z dźwięków tego chcesz co najmniej -O0, domyślne i:

- fmudflap-fmudflapth-fmudflapir

Dla front-endów, które go obsługują (C i c++), wszystkie pointer / array dereferencing operacje, jakaś biblioteka standardowa funkcje string/heap, a niektóre inne konstrukcje powiązane z testy zakresu / ważności. Moduły so oprzyrządowanie powinno być odporne na przepełnienie bufora, nieprawidłowe użycie sterty, i inne klasy C / C++ błędy programowania. Na oprzyrządowanie opiera się na oddzielnym runtime library (libmudflap), która zostanie podłączony do programu, jeśli - fmudflap podaje się w czasie połączenia. Zachowanie oprzyrządowania w czasie pracy program jest sterowany przez Zmienna środowiskowa MUDFLAP_OPTIONS. Patrz env MUDFLAP_OPTIONS= - help a. out dla swoich opcji.

 2
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-26 08:17:37