• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Тип Int

  • Автор темы Yalud
  • Дата начала
Статус
Закрыто для дальнейших ответов.
Y

Yalud

Поясните пожалуйста каков формат отображения переменной типа int в физической памяти. Как ни пародоксально ответ на данный вопрос я не нашел ни в одной книге c++, может я книги какие-то не те читаю :). Наверное в каждой средней школе первый урок информатики начинается с объяснения подобных вопросов. Сразу прошу прощения за свой ниский уровень элементарных знаний.

Все мы знаем, что переменная типа int имеет размер 4 байта. Тогда в оперативной памяти наблюдается следующая картина:

адрес значение
00000000 xx (xx- число в шеснадцетиричном коде)
00000001 xx
00000002 xx
00000003 xx

Как будут выглядеть эти ячейки памяти, если переменная типа int содержит число -1467324121 (к примеру). Или объясните общий принцип.
 
E

European

<!--QuoteBegin-Yalud+24:01:2007, 12:00 -->
<span class="vbquote">(Yalud @ 24:01:2007, 12:00 )</span><!--QuoteEBegin-->Поясните пожалуйста каков формат отображения переменной типа int в физической памяти. Как ни пародоксально ответ на данный вопрос я не нашел ни в одной книге c++,
[snapback]53929" rel="nofollow" target="_blank[/snapback]​
[/quote]
Странно было бы если бы нашел :)
Смотри
 
G

grigsoft

Полагаю, он не об этом спрашивал. В книгах по С этого нет, потому что способ хранения зависит от платформы, а не от языка.
 
E

European

Для: grigsoft

<!--QuoteBegin-Yalud+24:01:2007, 12:00 -->
<span class="vbquote">(Yalud @ 24:01:2007, 12:00 )</span><!--QuoteEBegin-->Как будут выглядеть эти ячейки памяти, если переменная типа int содержит число -1467324121 (к примеру).
[snapback]53929" rel="nofollow" target="_blank[/snapback]​
[/quote]
Сначала надо переменную перевести в 16-ричный (ну или двоичный вид), а только потом разбираться с порядком байт. И еще у меня сложилось впечатление, что 16-ричное значение получено из отладчика, а он, как раз таки, байты в нужном порядке ставит
 
Y

Yalud

Спасибо за участие, я посмотрел все прилагаемые материалы. Согласен с мнением, что для начала необходимо перевести число в 16-ричный вид, но думаю, что байты полученного шеснадцетеричного числа и байты находящиеся в памяти будут различными не только по порядку размещения, а именно по значению. Дело в том, что существует какое-то правило, которое определяет как именно должны отображаться положительные и отрицательные числа в двоичном(сугубоположительном) коде. Насколько мне известно, какой-то из битов в формате числа int отвечает только за знак числа, при этом если число отрицательное все остальные биты инвертируются и вроде бы к полученному результату добавляется единица. Именно такое правило я и пытаюсь найти в точной его формулировке для 32х-разрядных процессоров(хотя наверное от разрядности проца этот формат не зависит). Сейчас капаюсь в HEX редакторе, если удасться получить результат опытным путем, ответ сообщу. :(
 
G

grigsoft

Ну так надо правильно выражаться :(
все равно рулит
 
E

European

<!--QuoteBegin-Yalud+25:01:2007, 06:25 -->
<span class="vbquote">(Yalud @ 25:01:2007, 06:25 )</span><!--QuoteEBegin-->Сейчас капаюсь в HEX редакторе, если удасться получить результат опытным путем, ответ сообщу
[snapback]53990" rel="nofollow" target="_blank[/snapback]​
[/quote]
Получить правила перевода в дополнительный код при помощи HEX редактора - это конечно задача не для слабонервных :(
 
I

Igorg

<!--QuoteBegin-European+25:01:2007, 10:39 -->
<span class="vbquote">(European @ 25:01:2007, 10:39 )</span><!--QuoteEBegin-->Получить правила перевода в дополнительный код при помощи HEX редактора - это конечно задача не для слабонервных
[snapback]54019" rel="nofollow" target="_blank[/snapback]​
[/quote]
Это точно. Облегчу задачу (сугубо для IA-32):
int == Doubleword Signed Integer
Sign
|----|------------------------------|
31-30--------------------------- 0
В памяти хранится начиная с младшего байта (little endian). По смещению 0 хранятся биты 7-0, по смещению 1 биты 15-8 и далее (команды пересылки это учитывают и автоматически размещают быйты в регистрах как надо). Числа хранятся в дополнительном коде (two's complement) - но об этом на википедии хорошо написано, знаковый бит в любом случае очищен, если число положительно, и установлен -- если отрицательно. Добавлю только, что компу все равно, знаковое число или беззнаковое. Это решает программист и использует соответствующие команды процессора и алгоритмы (ну, или компилятор за него).
Читай: , там все подробненько написано.
 
?

-=

Ну эта переменная хранится в сегменте данных программы и её можно увидеть в дебаггере екзешника, где виден её адрес иданные, например:
Код:
//программа
void main()
{
int a=012345;
}
//дебаггер(сегмент данных)
//адрес	 HEX коды строки  Форматированное отображение
DS:0015	30 31 32 33 34 35  012345
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

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