eXeL@B —› Вопросы новичков —› Передать код через переменную окружения |
Посл.ответ | Сообщение |
|
Создано: 22 октября 2015 18:25 · Личное сообщение · #1 Приведенная ниже программа при запуске без аргументов работает и исполняет свой шеллкод. Однако при передаче тот же код через переменную окружения отказывается работать. В отладчике GDB видно, что EIP настраивается правильно, но принятый код не тот. Вот начало массива shellcode: 0x33785c22 0x63785c32 0x33785c30... ---------------------- Подскажите, пожалуйста, как нейтрализовать эту напасть?! ---------------------- В программе 1-й аргумент - для настройки (равен 4), через 2-й аргумент передаётся имя переменной окружения. ---------------------- Code:
|
|
Создано: 22 октября 2015 18:43 · Поправил: dosprog · Личное сообщение · #2 BAD: Code:
Code:
-- Добавлено -- Или так (лучше): BAD: Code:
Code:
А нщё лучше - вообще оба варианта. Хорошие программы от не очень хороших отличаются тем, что там учтены всех этих мелочей .. | Сообщение посчитали полезным: Rainbow |
|
Создано: 22 октября 2015 19:34 · Поправил: ksol · Личное сообщение · #3 |
|
Создано: 22 октября 2015 19:52 · Поправил: dosprog · Личное сообщение · #4 ksol пишет: К сожалению, предложение char shellcode[200+1] = не соотносится с инициализацией! Не знаю, о чём вообще речь. Вот готовый рабочий пример: a079_22.10.2015_EXELAB.rU.tgz - SHELLCOD.ZIP |
|
Создано: 23 октября 2015 12:49 · Поправил: cppasm · Личное сообщение · #5 Да там не с инициализацией проблемы. Очевидный же косяк. Тебе строчку получаемую от getenv() конвертировать надо самому. Т.е. если ты в коде пишешь Code:
то получишь строку из одного символа с кодом 0x33 - т.е. это эквивалентно Code:
Короче говоря компилятор обрабатывает esc-последовательности в твоей строке. А если ты то же самое получишь через getenv() то в строке будет то что ты написал - т.е. в данном случае 4 символа "\x33" что эквивалентно записи в коде Code:
Разница между Code:
и Code:
надеюсь понятна и почему не работает думаю тоже. |
|
Создано: 23 октября 2015 15:18 · Личное сообщение · #6 |
|
Создано: 23 октября 2015 15:24 · Личное сообщение · #7 |
|
Создано: 23 октября 2015 17:48 · Личное сообщение · #8 BoRoV - а это как? ----------------------------------- Если блок if(argc > 2) заменить на Code:
то всё работает! Т.е. определение переменной окружения в самой программе проходит. А из другой программы или оболочки bash - не идёт! ------------------------------------ dosprog Вашу программу запустил - да, работает в Windows, без проверки передачи кода. Если у вас есть Linux, проверьте может у вас пройдёт транспортировка кода без искажений? |
|
Создано: 23 октября 2015 17:52 · Поправил: dosprog · Личное сообщение · #9 |
|
Создано: 23 октября 2015 18:09 · Личное сообщение · #10 ksol пишет: А из другой программы или оболочки bash с другой программы и не будет проходить, она устанавливает ее в свое окружение а не общее. а с баша нормально все устанавливается Code:
----- Лучше быть одиноким, но свободным © $me | Сообщение посчитали полезным: ksol |
|
Создано: 23 октября 2015 18:12 · Поправил: ksol · Личное сообщение · #11 |
|
Создано: 23 октября 2015 18:24 · Личное сообщение · #12 |
|
Создано: 23 октября 2015 18:30 · Личное сообщение · #13 |
|
Создано: 24 октября 2015 14:53 · Личное сообщение · #14 |
|
Создано: 30 октября 2015 17:51 · Личное сообщение · #15 ---- Родственный вопрос --- В Сети есть статьи, в которых адрес переменной окружения с шеллкодом в ней, пересылается для переполнения буфера в стеке. Адрес вычисляется либо на использовании числа 0xbfffffff в качестве "верхушки" стека, либо функции getenv(), с некоторыми поправками на число символов имени программы. Считается, что вычисленный адрес остается тем же и для программы с буфером. Но у меня ни 1-й, ни 2-й варианты вычисления адреса не идут. Адреса имеют вид 0xbf'd69'f24 , 0xbf'927'f24 и не сохраняются в другой программе, а меняются от запуска к запуску одной и той же программы. А адрес 0xbfffffff вообще не доступен. Возможна ли передача реального адреса переменной окружения в программу?! |
|
Создано: 30 октября 2015 20:16 · Поправил: DenCoder · Личное сообщение · #16 Адрес там для примера. Инициалиазация базы указателя стека может быть произведена наполовину рандомно. Не надо даже в Windows XP полагать, что если стартовый тред всегда инициируется базой 0x00130000, то так всегда будет. Это не так! Всё зависит от базы(Image Base) exe-модуля, от баз подгруженных статически dll-модулей, от размеров модулей и от размеров куч... То же самое и для области переменных окружения. +: 1) Регион может иметь атрибут shared, тогда адреса всегда одни и те же, а может не иметь - тогда адреса у каждой программы могут быть свои. Тут зависит от версии ОС. 2) От версии ОС также зависит "обычный" адрес базы переменных окружения и методы доступа к ним. ----- IZ.RU |
|
Создано: 31 октября 2015 11:16 · Поправил: dosprog · Личное сообщение · #17 ksol пишет: Возможна ли передача реального адреса переменной окружения в программу?! Адреса переменной чьего окружения? Чужое окружение недоступно - изоляция процессов. Вообще, зачем эти извраты? Всё это спокойно реализуется через файловый ввод/вывод. Единстственно, приходят на ум всякие регистрационные подлости, с передачей раскриптованных адресов в программу. Не надо этого делать, право же. Подумайте лучше над фичами самой программы, чтоб она была классная. |
|
Создано: 31 октября 2015 12:54 · Личное сообщение · #18 Переменная окружения создается в оболочке bash, запускается программа, которую я привел в самом начале. Она по полученному имени через getenv() определяет адрес и запускает шеллкод из переменной окружения. Но эта программа подходит только для тестирования шеллкода. Если бы заставить через настройки оболочку bash не обновлять адреса, то адрес можно определить самому и кинуть в программу с буфером в стеке. Настроечный файл .bash_profile имеет раздел User specific environment . Может туда можно что-то записать? |
eXeL@B —› Вопросы новичков —› Передать код через переменную окружения |
Эта тема закрыта. Ответы больше не принимаются. |