информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Spanning Tree Protocol: недокументированное применениеПортрет посетителя
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Очередное исследование 19 миллиардов... 
 Оптимизация ввода-вывода как инструмент... 
 Зловреды выбирают Lisp и Delphi 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
если вы видите этот текст, отключите в настройках форума использование JavaScript
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
->beginners 02.12.03 15:40  Число просмотров: 1108
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка> <обсуждение закрыто>
<programming>
Подмена данных путём переполнения буфера. 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-2025 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach