Kevgen
18.12.2023, 18:22
Всем привет!
Подошёл к концу Backdoor CTF и я хочу поделиться решениями некоторых тасков.
Сейчас разберу пока 2 таска: на реверс и форензику.
1. Reverse: Open Sesame
Нам дается apk файл.
Запускаем, смотрим что есть. Есть поле для ввода имени и ключа(далее пароль).
https://forum.antichat.xyz/attachments/29109151/img_adf5b0d1da.png
Запускаем APKlab в VScode и смотрим MainActivity.java.
Сразу были найдены переменные valid_user, а также valid_password, который равен
{52, AppCompatDelegate.FEATURE_SUPPORT_ACTION_BAR, 49, 98, 97, 98, 97};
.
Отбрасываем valid_user, работаем только с паролем.
Далее у нас идет XOR строки "U|]rURuoU^PoR_FDMo@X]uBUg" с тем самым паролем и проверки на валидность введенного пароля(нам ни к чему).
Обращаем внимание на то, что в valid_password не все значения числовые. Строка "AppCompatDelegate.FEATURE_SUPPORT_ACTION_BAR" тоже является числом, так как возвращает значение "108".
Пишем солвер:
Python:
import
re
valid_password
=
[
52
,
108
,
49
,
98
,
97
,
98
,
97
]
TextPassword
=
''
.
join
(
chr
(
num
)
for
num
in
valid_password
)
def
sh4dy
(
str_value
)
:
digits_only
=
re
.
sub
(
r"\D"
,
""
,
str_value
)
return
digits_only
def
sl4y3r
(
str_value
)
:
return
int
(
str_value
)
-
1
def
flag
(
str1
,
str2
)
:
sb
=
[
]
for
i
in
range
(
len
(
str2
)
)
:
sb
.
append
(
chr
(
ord
(
str2
[
i
]
)
^
ord
(
str1
[
i
%
len
(
str1
)
]
)
)
)
return
""
.
join
(
sb
)
print
(
flag
(
str
(
sl4y3r
(
sh4dy
(
TextPassword
)
)
)
,
"U|]rURuoU^PoR_FDMo@X]uBUg"
)
)
Получаем флаг:
flag{aLiBabA_and_forty_thiEveS}
2. Forensics: Forenscript
Нам даётся какой-то файл a.bin. Смотрим в hex редакторе:
https://forum.antichat.xyz/attachments/29109151/img_6bc9d0ee12.png
Очень похоже на "магические" байты png картинки, да только в странном порядке.
Чтобы восстановить картинку нам надо сделать реверс каждых 4 байт, например "47 4e 50 89" должны превратиться в "89 50 4e 47"
Пишем программу для декодирования:
Python:
with
open
(
'C:/users/hidden/Desktop/a.bin'
,
'rb'
)
as
file
:
data
=
file
.
read
(
)
output
=
b''
for
i
in
range
(
0
,
len
(
data
)
,
4
)
:
segment
=
data
[
i
:
i
+
4
]
reversed_segment
=
segment
[
:
:
-
1
]
output
+=
reversed_segment
with
open
(
'C:/users/hidden/Desktop/out.png'
,
'wb'
)
as
file
:
file
.
write
(
output
)
Открываем и видим сие:
https://forum.antichat.xyz/attachments/29109151/img_f0992fb07d.png
Раз флаг не на экране - значит он в картинке.
Открываем aperisolve, видим что там есть ещё одна картинка:
https://forum.antichat.xyz/attachments/29109151/img_fba07c198f.png
Скачиваем, распаковываем, переименовываем нужный файл в "flag.png" и получаем флаг:
flag{scr1pt1ng_r34lly_t0ugh_a4n't_1t??}
https://forum.antichat.xyz/attachments/29109151/img_b48daf7b80.png
Спасибо за прочтение!
Подошёл к концу Backdoor CTF и я хочу поделиться решениями некоторых тасков.
Сейчас разберу пока 2 таска: на реверс и форензику.
1. Reverse: Open Sesame
Нам дается apk файл.
Запускаем, смотрим что есть. Есть поле для ввода имени и ключа(далее пароль).
https://forum.antichat.xyz/attachments/29109151/img_adf5b0d1da.png
Запускаем APKlab в VScode и смотрим MainActivity.java.
Сразу были найдены переменные valid_user, а также valid_password, который равен
{52, AppCompatDelegate.FEATURE_SUPPORT_ACTION_BAR, 49, 98, 97, 98, 97};
.
Отбрасываем valid_user, работаем только с паролем.
Далее у нас идет XOR строки "U|]rURuoU^PoR_FDMo@X]uBUg" с тем самым паролем и проверки на валидность введенного пароля(нам ни к чему).
Обращаем внимание на то, что в valid_password не все значения числовые. Строка "AppCompatDelegate.FEATURE_SUPPORT_ACTION_BAR" тоже является числом, так как возвращает значение "108".
Пишем солвер:
Python:
import
re
valid_password
=
[
52
,
108
,
49
,
98
,
97
,
98
,
97
]
TextPassword
=
''
.
join
(
chr
(
num
)
for
num
in
valid_password
)
def
sh4dy
(
str_value
)
:
digits_only
=
re
.
sub
(
r"\D"
,
""
,
str_value
)
return
digits_only
def
sl4y3r
(
str_value
)
:
return
int
(
str_value
)
-
1
def
flag
(
str1
,
str2
)
:
sb
=
[
]
for
i
in
range
(
len
(
str2
)
)
:
sb
.
append
(
chr
(
ord
(
str2
[
i
]
)
^
ord
(
str1
[
i
%
len
(
str1
)
]
)
)
)
return
""
.
join
(
sb
)
(
flag
(
str
(
sl4y3r
(
sh4dy
(
TextPassword
)
)
)
,
"U|]rURuoU^PoR_FDMo@X]uBUg"
)
)
Получаем флаг:
flag{aLiBabA_and_forty_thiEveS}
2. Forensics: Forenscript
Нам даётся какой-то файл a.bin. Смотрим в hex редакторе:
https://forum.antichat.xyz/attachments/29109151/img_6bc9d0ee12.png
Очень похоже на "магические" байты png картинки, да только в странном порядке.
Чтобы восстановить картинку нам надо сделать реверс каждых 4 байт, например "47 4e 50 89" должны превратиться в "89 50 4e 47"
Пишем программу для декодирования:
Python:
with
open
(
'C:/users/hidden/Desktop/a.bin'
,
'rb'
)
as
file
:
data
=
file
.
read
(
)
output
=
b''
for
i
in
range
(
0
,
len
(
data
)
,
4
)
:
segment
=
data
[
i
:
i
+
4
]
reversed_segment
=
segment
[
:
:
-
1
]
output
+=
reversed_segment
with
open
(
'C:/users/hidden/Desktop/out.png'
,
'wb'
)
as
file
:
file
.
write
(
output
)
Открываем и видим сие:
https://forum.antichat.xyz/attachments/29109151/img_f0992fb07d.png
Раз флаг не на экране - значит он в картинке.
Открываем aperisolve, видим что там есть ещё одна картинка:
https://forum.antichat.xyz/attachments/29109151/img_fba07c198f.png
Скачиваем, распаковываем, переименовываем нужный файл в "flag.png" и получаем флаг:
flag{scr1pt1ng_r34lly_t0ugh_a4n't_1t??}
https://forum.antichat.xyz/attachments/29109151/img_b48daf7b80.png
Спасибо за прочтение!