Переведено для codeby. Net
Алгоритм 1 Первая уязвимая программа (test.c)
Download 0.92 Mb. Pdf ko'rish
|
эксплуатация систем arm linux AFANX
Алгоритм 1 Первая уязвимая программа (test.c)
#include #include #include void donuts () { puts(”Donuts . . . ”); exit (0); } void vuln ( char ∗ a r g ) { char buff[10]; strcpy(buff, arg); } int main(int argc, char ∗∗argv) { vuln(argv[1]); return 0; } 25 В нашей системе ARM: root@armstation# gcc -o test test.c Программа тривиальна, и единственное, что она делает, это сохраняет в буфере пользовательский ввод. Так как размер буфера заранее определен, то при достаточно длинной строке символов, можно перезаписать важную информацию на стеке. Давайте посмотрим на это на практике: root@armstation# ./test Segmentation fault root@armstation# ./test hello root@armstation# ./test 1234567890 Segmentation fault Первый сбой связан с отсутствием ввода, но это не то, что мы ищем... Последующие попытки были направлены на определение нужной длины, чтобы вызвать программу к сбою. Как только приблизительная длина была найдена (в нашем случае около 10 символов), пришло время использовать отладчик для получения точных данных: root@armstation# gdb ./test ... gdb headers ... This GDB was configured as "arm-linux-gnueabi"... (gdb) run 1234567890 Starting program: /root/exp/test 1234567890 Program received signal SIGSEGV, Segmentation fault. 0x07ab8a78 in ?? () (gdb) r AAAABBBBCCCCDDDDEEEE The program being debugged has been started already. Start it from the beginning? (y or n) y Starting program: /root/exp/test AAAABBBBCCCCDDDDEEEE Program received signal SIGSEGV, Segmentation fault. 0x00004544 in ?? () (gdb) r AAAABBBBCCCCDDDDEEEEFF The program being debugged has been started already. Start it from the beginning? (y or n) y Starting program: /root/exp/test AAAABBBBCCCCDDDDEEEEFF Program received signal SIGSEGV, Segmentation fault. 26 0x46464544 in ?? () (gdb) quit The program is running. Exit anyway? (y or n) y root@armstation# С помощью GDB мы обнаружили, что для полной перезаписи обратного адреса необходимо 22 символа. Поскольку процесс перезаписи отличается от процесса в системы x86/x64, важно понять, что происходит внутри уязвимой функции программы. С помощью GDB мы обнаружили, что для полной перезаписи обратного адреса необходимо 22 символа. Поскольку процесс перезаписи отличается от процесса в системы x86/x64, важно понять, что происходит внутри уязвимой функции программы. root@armstation# gdb ./test ... gdb headers ... This GDB was configured as "arm-linux-gnueabi"... (gdb) break vuln Breakpoint 1 at 0x8428 (gdb) r AABBBBCCCCDDDDEEEEFFFF Starting program: /root/exp/test AABBBBCCCCDDDDEEEEFFFF Breakpoint 1, 0x00008428 in vuln () Current language: auto; currently asm (gdb) Выполнение остановилось в начале функции vuln(). Нам нужно разобрать ее: (gdb) disass vuln Dump of assembler code for function vuln: 0x00008414 0x00008418 0x0000841c 0x00008420 0x00008424 0x00008428 0x0000842c 0x00008430 0x00008434 0x00008438 0x0000843c 0x00008440 End of assembler dump. (gdb) В дальнейшем мы будем использовать эту разборку в качестве эталона. Анализируя код, мы можем легко найти части и критические точки функции: 27 Первые 20 байт функции служат в качестве преамбулы и подготавливают стек, используемый функцией. По адресу 0x0000842c начинается вызов функции strcpy(), которая требует двух параметров. Первый параметр, адрес буфера назначения (char buff[10]) помещается в r0. Второй параметр, адрес строки, которую нужно копирования (наш вход), помещается в r1. В отличие от архитектуры x86, в ARM параметры передаются через регистры, а не в стек. По адресу 0x00008434 вызывается strcpy() вызывается (с инструкцией Branch with Link). Критическая точка, которую мы подробно обсудим, находится по адресу Download 0.92 Mb. Do'stlaringiz bilan baham: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling