информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Страшный баг в WindowsSpanning Tree Protocol: недокументированное применениеГде водятся OGRы
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Подмена данных путём переполнения буфера. 02.12.03 08:29   [amirul]
Автор: choor Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
Мне нужно переполнить стек так что бы вместо значения 12345678 стало 987654321 вот как представить 987654321 в виде шелл кода?
->beginners 02.12.03 15:40  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка> <обсуждение закрыто>
может я чего-то не понял, но для меня вопрос выглядит странно 02.12.03 09:53  
Автор: LLL <Алексей> Статус: Member
<"чистая" ссылка> <обсуждение закрыто>
Обычно вроде шелл-код представляют в виде байтов, которыми переполняется буфер. Но как можно число (тоже байты наверно) представить в виде шелл-кода?
Вообщем в программе объявленны переменные и в функции strcpy... 02.12.03 10:12  
Автор: choor Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
Вообщем в программе объявленны переменные и в функции strcpy идёт копирование не проверяющихся на вход данных. Идёт копирование в массив размером в 20 байт это я NOP'ами заполню, а дальше до стэку лежит переменная F вот её и нужно сделать чтобы она стала равна 987654321 Кароче вот примерно:
static char shellcode[]="\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90[Тут дальше должно быть значение 987654321 вот это мне и надо предстваить]";
А тебя не волнует, что ты *не вернешься* из strcpy? 02.12.03 15:43  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка> <обсуждение закрыто>
> "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90[Тут дальше должно
> быть значение 987654321 вот это мне и надо предстваить]";
И локальные переменные будут всем (в смысле тебе) по фигу.
Это зависит от того, что стоит дальше. 03.12.03 00:20  
Автор: Ktirf <Æ Rusakov> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
Если следом за 987654321 стоит \0, то вернется.

> И локальные переменные будут всем (в смысле тебе) по фигу.
И как раз в этом случае локальные переменные будут совсем не по фигу, особенно если они участвуют в формировании какого-нибудь вызова system.
А тип у переменной какой? 02.12.03 10:20  
Автор: Ktirf <Æ Rusakov> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
int 02.12.03 10:24  
Автор: choor Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
если 32-битный int, да еще с интеловской разрядностью и 02.12.03 10:55  
Автор: LLL <Алексей> Статус: Member
<"чистая" ссылка> <обсуждение закрыто>
число требуемое было приведено в десятичной системе, то там будут байты "\xB1\x68\xDE\x3A"
надеюсь, мне не пошьют соучастие в чем-то наказуемом? ;-)
Не думаю, что представление числа 987654321 на процессорах Intel является какой-то там тайной :) 02.12.03 11:03  
Автор: Ktirf <Æ Rusakov> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
строка SecretPassword тоже не является чем-то таинственным, однако ж... 02.12.03 11:25  
Автор: LLL <Алексей> Статус: Member
<"чистая" ссылка> <обсуждение закрыто>
если ее сопроводить (правдивым) комментарием, что это пароль к ресурсу X сервера Y, которого я знать не должен, то вроде уже и не совсем порядок получается :-)
как часто бывает, смысл зависит от контекста :-)
Ты же не указал конкретное место, где надо написать это число ;) 02.12.03 11:43  
Автор: Ktirf <Æ Rusakov> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
зато это место было обозначено автором вопроса (после 20-го \x90) :-) 02.12.03 12:25  
Автор: LLL <Алексей> Статус: Member
<"чистая" ссылка> <обсуждение закрыто>
Полагаю, что переполнение буфера используется для ДОС атак. 02.12.03 09:50  
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
Отредактировано 02.12.03 09:52  Количество правок: 1
<"чистая" ссылка> <обсуждение закрыто>
> Мне нужно переполнить стек так что бы вместо значения
> 12345678 стало 987654321 вот как представить 987654321 в
> виде шелл кода?
То есть не конкретным значением, а не важно чем, лишь бы что-то за пределами буфера испортилось. Использовать переполнение для того, чтобы куда надо занести нужное значение, является довольно сложной задачей.
Для переполнения необходимы два главных условия: наполнение буфера должно быть быстрее его опустошения и при наполнении должна отсутствовать проверка границ. Не всегда наполнение происходит порциями требуемого размера. Стало быть при переполнении может еще что-то измениться/испортиться, а это приведет к неконтролируемости процесса.
Руки надо отрывать тому, кто пришет программы, подверженные переполнению буфера. Этого ведь очень тяжело добиться. Например переполнить стэк так, чтобы нужным образом изменились какие-то данные очень тяжело. Обычно для стэка (программного) выделяется довольно узкое адресное пространство, и при попытке программы занести что-то за пределы этого пространства произойдет прерывание (ошибка при доступе в память), в результате чего работа программы будет аварийно завершена. Типичная ДОС атака.
Хуже дело обстоит, если стэк, дэк или какой либо еще способ организации хранения данных в памяти реализован исключительно программно. В этом случае нужно просто, как минимум, проверять границы рабочего фрагмента памяти. Обычно сегменты данных и кода разнесены. Мало того, программе довольно сложно дотянуться до своего сегмента кода. И этого мало, обычно сегмент кода не доступен на изменение. А чаще всего он доступен только на выполнение. Стало быть очень тяжело переполнением буфера изменить код, если это не интерпретатор и ОС использует соответствующие возможности процессора.
Мне просто хотелось показать, что это очень сложная задача. Чтобы в этом убедиться попробуйте написать программу, которая делает что-нибудь разумное, и заставить изменить ее что-то в своей области данных/кода по средством переполнения буфера/стэка.
Переполнение буфера используется не только для ДОС атак, но... 02.12.03 10:14  
Автор: choor Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
Переполнение буфера используется не только для ДОС атак, но и для получения высших привилегий. И реализовать переполнение не так уж и сложно :) Надо просто уметь и понимать!
Слышал я про это... 02.12.03 11:04  
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
<"чистая" ссылка> <обсуждение закрыто>
> Переполнение буфера используется не только для ДОС атак, но
> и для получения высших привилегий. И реализовать
> переполнение не так уж и сложно :) Надо просто уметь и
> понимать!
Таких программистов нужно в судебном порядке лишать права писать программы и вообще близко подходить к компьютеру, а так же лишать права заниматься преподавательской и репититорской деятельностью.
Переменная, которая отвечает за права и привелегии находится в адресном пространстве программы, которая не должна иметь доступ к ней!
Это старая и грустная тема 02.12.03 11:11  
Автор: Ktirf <Æ Rusakov> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
Про неисполняемый стек и тому подобные способы защиты от исполнения того, что исполняться не должно.
Ага. Я тоже по этому поводу хотел сказать 02.12.03 15:51  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка> <обсуждение закрыто>
> Про неисполняемый стек и тому подобные способы защиты от
> исполнения того, что исполняться не должно.
Архитектура IA32 - такое болото, что добиться там неисполняемого стека можно только за счет накладных расходов по управлению сегментами. Сейчас во всех более-менее распространенных и производительных ОС на базе x86 используется FLAT-модель для сегментов, а страничная защита не позволяет запретить исполнение для страницы (на фига два разных механизма защиты памяти, один из которых так и остается невостребованным, а другой неполным - я до сих пор не понимаю).

В общем, как уже было сказано - это грустная тема и обсуждалась неоднократно (в том числе и на БТ)
Это старая и грустная тема, но ведь до сих пор такие системы есть, существуют и используются, и программисты до сих пор ляпают такие ошибки. 02.12.03 11:56  
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
Отредактировано 02.12.03 11:57  Количество правок: 2
<"чистая" ссылка> <обсуждение закрыто>
> Про неисполняемый стек и тому подобные способы защиты от
> исполнения того, что исполняться не должно.

Вспоминается старая RSX-11. Всего один битик. Причем в области данных ядра, в структуре сеанса. Добраться туда так трудно. Какое к четру переполнение стэка. Может сейчас модно привелегии в ENVIRONMENTе или в заголовке задачи хранить. Почему бы при создании новых ОС не посмотреть как это сделано в других "бородатых" и морально устарелых ОС.
Дело не только и не столько в ОС, а еще и в архитектуре процессоров... 02.12.03 12:42  
Автор: Ktirf <Æ Rusakov> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach