ASCII и шестнадцатеричное представление строк. Побитовые операции со строками

В литературе, которую я изучаю (например, по обратному инженерингу), для строк как само собой разумеющееся используются ASCII значения или запись в виде шестнадцатеричной строки. Подразумевается что читатели не только должны на лету конвертировать строки между обычным представлением, ASCII кодами символов, шестнадцатеричной и двоичной записью, но и должны уметь делать побитовые операции со строками.

На самом деле, это действительно не особенно сложная тема — достаточно один раз понять суть, а затем при необходимости можно пользоваться таблицами ASCII/Hex/Bin значений символов, либо конвертировать используя соответствующие утилиты или встроенные в языки программирования функции. Если у вас пробел в этих знаниях, то это статья должна вам помочь.

Для кого эта статья

Вам абсолютно точно нужно понимать суть ASCII кодирования символов, а также шестнадцатеричную запись строк если вы:

  • программируете
  • занимаетесь отладкой и обратным инжинирингом программ
  • выполняете тесты на проникновение (шестнадцатеричная и другие варианты записи широко используются для обхода файловых файерволов, фильтров и других систем защиты веб-приложений)

Примечание: правда, я исхожу из того, что вы знаете что такое:

  • система счисления
  • десятичная, шестнадцатеричная, двоичная система счисления
  • умеете конвертировать числа между этими системами счисления
  • логические операции И, ИЛИ

По идее, это охватывается базовым курсом информатики и логики на любых специальностях в ВУЗе (некоторые учат это уже в школе) и это должен знать каждый — поэтому я не будут на этом останавливаться. Если вы не знаете даже этого, то прежде чем читать эту заметку, начните с ликвидации ваших более базовых пробелов про системы счисления.

Что такое ASCII

Не будем тратить время на экскурсы в историю о появлении ASCII — рассмотрим только с практической точки зрения.

А с практической точки зрения в ASCII каждому символу соответствует его порядковый номер. Этот порядковый номер можно записать десятичным числом, например, символу «h» соответствует 104, а символу «i» соответствует 105.

Любое десятичное число можно конвертировать в шестнадцатеричное, двоичное или восьмеричное число. Зачем конвертировать? Главная причина в том, что компьютер в своей основе не работает с десятеричными числами, а использует двоичные, которые удобно записывать в более компактном виде — конвертировать в шестнадцатеричные. Поэтому в определённых программах широко используются эти записи: в шестнадцатеричных редакторах, отладчиках. Также шестнадцатеричную/двоичную запись строк программист может использовать для различных манипуляций, например, с целью шифрования или другой обработки. Например, для тех же самых побитовых операций, к которым мы вернёмся позже.

Итак, вот таблицы символов, с их цифровым представлением в различных системах счисления:

Контрольные символы ASCII (некоторые из них больше не актуальны, так как подразумевают использование в телетайп связи)

Десятичный вид Шестнадцатеричный Двоичный Символ Описание
0 00 00000000 NUL null
1 01 00000001 SOH начало «заголовка»
2 02 00000010 STX начало «текста». Включить печатающее устройство (телетайп). Текст для печати располагался между символами «STX» и «ETX».
3 03 00000011 ETX конец «текста». Выключить печатающее устройство (телетайп). В наши дни код «03» используется для отправки процессу сигнала «SIGINT» (сигнал-прерывание: англ. signal interrupt) и может быть набран нажатием комбинации клавиш Ctrl+C. Получив такой сигнал, процесс должен завершить работу.
4 04 00000100 EOT конец передачи. Символ используется эмуляторами терминалов в значении «Конец файла» (EOF: англ. end ofile) и может быть отправлен нажатием комбинации клавиш Ctrl+D. Получив такой сигнал, эмулятор терминала определит процесс, который в данный момент работает с терминалом, и установит в стандартном потоке ввода этого процесса (stdin: англ. standard input stream) флаг «Конец файла». В результате процесс прекратит чтение stdin и начнёт обработку прочитанных данных.
5 05 00000101 ENQ «Прошу подтверждения!»
6 06 00000110 ACK «Подтверждаю!»
7 07 00000111 BEL звуковой сигнал: звонок
8 08 00001000 BS backspace: возврат на один символ
9 09 00001001 HT горизонтальная табуляция: Обозначается как «\t». Иногда называется «HT» (от англ. horizontal tabulation).
10 0A 00001010 LF

line feed - перевод строки: Команда для опускания каретки печатающего устройства на одну строку вниз. Обозначение конца строки текстового файла различается в семействах операционных систем:

  • для «UNIX» — одиночный символ «LF»;
  • для «Windows» — последовательность символов «CR LF».

Во многих языках программирования символ обозначается как «\n». Нажатие на клавишу ↵ Enter при выводе текста переводит строку.

11 0B 00001011 VT вертикальная табуляция
12 0C 00001100 FF form feed - «прогон страницы», новая страница: Команда для принтера: продолжить печать с начала следующего листа. Обозначается как \f
13 0D 00001101 CR enter / carriage return - возврат каретки: Команда для принтера: продолжить печать с начала текущей строки (не с новой строки). Во многих языках программирования — символ «CR» обозначается как «\r». В операционной системе «Mac» — символ «CR» (в прошлом) обозначал конец строки текстового файла. С клавиатуры символ «CR» может быть введён нажатием комбинации клавиш: Ctrl+M.
14 0E 00001110 SO shift out - «Переключиться на другую ленту (кодировку)»: Другая лента обычно была окрашена в красный цвет. В дальнейшем — символ использовался для переключения на национальную кодировку.
15 0F 00001111 SI shift in - «Переключиться на исходную ленту (кодировку)»: Команда для выполнения действия, обратного действию «SO».
16 10 00010000 DLE data link escape - «Экранирование канала данных»: Любые символы, следующие после «DLE», должны восприниматься как данные, а не как управляющие символы.
17 11 00010001 DC1 device control 1 - Первый символ управления устройством: Команда включить устройство чтения перфоленты.
18 12 00010010 DC2 device control 2 - Второй символ управления устройством: Команда включить перфоратор.
19 13 00010011 DC3 device control 3 - Третий символ управления устройством: Команда выключить устройство чтения перфоленты.
20 14 00010100 DC4 device control 4 - Четвёртый символ управления устройством: Команда выключить перфоратор.
21 15 00010101 NAK negative acknowledge - «Не подтверждаю!»: Обратно символу «ACK».
22 16 00010110 SYN synchronize: Этот символ передавался, когда (для синхронизации) было необходимо что-нибудь передать.
23 17 00010111 ETB end of trans. block - конец текстового блока: Иногда текст (по техническим причинам) разбивался на блоки.
24 18 00011000 CAN cancel - «Отмена»: Отмена того, что было передано ранее.
25 19 00011001 EM end of medium - «Конец носителя»: Кончилась перфолента, бумага — и т. п.
26 1A 00011010 SUB

substitute - «Подставить»: Символ ставится:

  • На месте символа, значение которого было потеряно (или испорчено) при передаче;
  • Перед символом, для интерпретации которого нужно переключиться на дополнительный набор символов;
  • Перед символом, печатать который нужно другим цветом…

В настоящее время символ вставляется нажатием комбинации клавиш Ctrl+Z и используется для обозначения конца файла в операционных системах «DOS» и «Windows».

27 1B 00011011  ESC escape: Знак того, что символ, следующий после «ESC», имеет какое-то другое (отличное от определённого в ASCII) значение. Обычно после символа «ESC» следуют управляющие последовательности; в операционной системе «DOS» они реализуются драйвером «ANSI.SYS».
28 1C 00011100  FS file separator - разделитель файлов: сообщение могло состоять из файлов
29 1D 00011101 GS group separator - разделитель групп
30 1E 00011110 RS record separator - разделитель записей: группы могли состоять из записей
31 1F 00011111 US unit separator - разделитель юнитов: записи могли состоять из юнитов
127 7F 01111111 DEL

delete - стереть последний символ: Символом «DEL» (состоящим в двоичном коде из всех единиц) можно было «забить» любой символ. Устройства и программы игнорировали «DEL» так же, как и «NUL».

Код этого символа происходит из первых текстовых процессоров с памятью на перфоленте: в них удаление символа происходило «забиванием» его кода дырочками (обозначавшими логические единицы).

Печатные символы ASCII

Десятичный вид Шестнадцатеричный Двоичный

Символ

Описание
32 20 00100000 Space пробел
33 21 00100001 ! воскллицательный знак
34 22 00100010 " двойные кавычки
35 23 00100011 # шарп, номер
36 24 00100100 $ доллар
37 25 00100101 % проценты
38 26 00100110 & амперсант
39 27 00100111 ' единичная кавычка
40 28 00101000 ( левая скобка
41 29 00101001 ) правая скобка
42 2A 00101010 * звездочка
43 2B 00101011 + плюс
44 2C 00101100 , запятая
45 2D 00101101 - минус
46 2E 00101110 . точка
47 2F 00101111 / слэш
48 30 00110000 0 ноль
49 31 00110001 1 один
50 32 00110010 2 два
51 33 00110011 3 три
52 34 00110100 4 четыре
53 35 00110101 5 пять
54 36 00110110 6 шесть
55 37 00110111 7 семь
56 38 00111000 8 восемь
57 39 00111001 9 девять
58 3A 00111010 : двоеточие
59 3B 00111011 ; точка с запятой
60 3C 00111100 < меньше чем
61 3D 00111101 = знак равенства
62 3E 00111110 > больше чем
63 3F 00111111 ? знак вопроса
64 40 01000000 @ сабака
65 41 01000001 A  
66 42 01000010 B  
67 43 01000011 C  
68 44 01000100 D  
69 45 01000101 E  
70 46 01000110 F  
71 47 01000111 G  
72 48 01001000 H  
73 49 01001001 I  
74 4A 01001010 J  
75 4B 01001011 K  
76 4C 01001100 L  
77 4D 01001101 M  
78 4E 01001110 N  
79 4F 01001111 O  
80 50 01010000 P  
81 51 01010001 Q  
82 52 01010010 R  
83 53 01010011 S  
84 54 01010100 T  
85 55 01010101 U  
86 56 01010110 V  
87 57 01010111 W  
88 58 01011000 X  
89 59 01011001 Y  
90 5A 01011010 Z  
91 5B 01011011 [ левая квадратная скобка
92 5C 01011100 \ обратный слэш
93 5D 01011101 ] правая квадратная скобка
94 5E 01011110 ^ каретка
95 5F 01011111 _ подчёркивание
96 60 01100000 ` акцент
97 61 01100001 a  
98 62 01100010 b  
99 63 01100011 c  
100 64 01100100 d  
101 65 01100101 e  
102 66 01100110 f  
103 67 01100111 g  
104 68 01101000 h  
105 69 01101001 i  
106 6A 01101010 j  
107 6B 01101011 k  
108 6C 01101100 l  
109 6D 01101101 m  
110 6E 01101110 n  
111 6F 01101111 o  
112 70 01110000 p  
113 71 01110001 q  
114 72 01110010 r  
115 73 01110011 s  
116 74 01110100 t  
117 75 01110101 u  
118 76 01110110 v  
119 77 01110111 w  
120 78 01111000 x  
121 79 01111001 y  
122 7A 01111010 z  
123 7B 01111011 { левая фигурная скобка
124 7C 01111100 | вертикальная черта
125 7D 01111101 } правая фигурная скобка
126 7E 01111110 ~ тильда
127 7F 01111111 DEL delete - удалить

Расширенные символы ASCII

Десятичное значение Шестнадцатеричное Двоичное Символ Описание
128 80 10000000 €  
129 81 10000001   
130 82 10000010 ‚  
131 83 10000011 ƒ  
132 84 10000100 „  
133 85 10000101 …  
134 86 10000110 †  
135 87 10000111 ‡  
136 88 10001000 ˆ  
137 89 10001001 ‰  
138 8A 10001010 Š  
139 8B 10001011 ‹  
140 8C 10001100 Œ  
141 8D 10001101   
142 8E 10001110 Ž  
143 8F 10001111   
144 90 10010000   
145 91 10010001 ‘  
146 92 10010010 ’  
147 93 10010011 “  
148 94 10010100 ”  
149 95 10010101 •  
150 96 10010110 –  
151 97 10010111 —  
152 98 10011000 ˜  
153 99 10011001 ™  
154 9A 10011010 š  
155 9B 10011011 ›  
156 9C 10011100 œ  
157 9D 10011101   
158 9E 10011110 ž  
159 9F 10011111 Ÿ  
160 A0 10100000   пробел
161 A1 10100001 ¡  
162 A2 10100010 ¢ цент
163 A3 10100011 £ фунт
164 A4 10100100 ¤ знак валюты
165 A5 10100101 ¥ иена, юань
166 A6 10100110 ¦ сломанный бар
167 A7 10100111 § знак параграфа
168 A8 10101000 ¨  
169 A9 10101001 © копирайт
170 AA 10101010 ª порядковый индикатор
171 AB 10101011 «  
172 AC 10101100 ¬  
173 AD 10101101    
174 AE 10101110 ® зарегистрированная торговая марка
175 AF 10101111 ¯  
176 B0 10110000 ° градус
177 B1 10110001 ± плюс-минус
178 B2 10110010 ²  
179 B3 10110011 ³  
180 B4 10110100 ´  
181 B5 10110101 µ мю
182 B6 10110110 знак абзаца
183 B7 10110111 ·  
184 B8 10111000 ¸  
185 B9 10111001 ¹  
186 BA 10111010 º порядковый индикатор
187 BB 10111011 »  
188 BC 10111100 ¼  
189 BD 10111101 ½  
190 BE 10111110 ¾  
191 BF 10111111 ¿ перевернутый знак вопроса
192 C0 11000000 À  
193 C1 11000001 Á  
194 C2 11000010 Â  
195 C3 11000011 Ã  
196 C4 11000100 Ä  
197 C5 11000101 Å  
198 C6 11000110 Æ  
199 C7 11000111 Ç  
200 C8 11001000 È  
201 C9 11001001 É  
202 CA 11001010 Ê  
203 CB 11001011 Ë  
204 CC 11001100 Ì  
205 CD 11001101 Í  
206 CE 11001110 Î  
207 CF 11001111 Ï  
208 D0 11010000 Ð  
209 D1 11010001 Ñ  
210 D2 11010010 Ò  
211 D3 11010011 Ó  
212 D4 11010100 Ô  
213 D5 11010101 Õ  
214 D6 11010110 Ö  
215 D7 11010111 × знак умножения
216 D8 11011000 Ø  
217 D9 11011001 Ù  
218 DA 11011010 Ú  
219 DB 11011011 Û  
220 DC 11011100 Ü  
221 DD 11011101 Ý  
222 DE 11011110 Þ  
223 DF 11011111 ß  
224 E0 11100000 à  
225 E1 11100001 á  
226 E2 11100010 â  
227 E3 11100011 ã  
228 E4 11100100 ä  
229 E5 11100101 å  
230 E6 11100110 æ  
231 E7 11100111 ç  
232 E8 11101000 è  
233 E9 11101001 é  
234 EA 11101010 ê  
235 EB 11101011 ë  
236 EC 11101100 ì  
237 ED 11101101 í  
238 EE 11101110 î  
239 EF 11101111 ï  
240 F0 11110000 ð  
241 F1 11110001 ñ  
242 F2 11110010 ò  
243 F3 11110011 ó  
244 F4 11110100 ô  
245 F5 11110101 õ  
246 F6 11110110 ö  
247 F7 11110111 ÷ крестик
248 F8 11111000 ø  
249 F9 11111001 ù  
250 FA 11111010 ú  
251 FB 11111011 û  
252 FC 11111100 ü  
253 FD 11111101 ý  
254 FE 11111110 þ  
255 FF 11111111 ÿ  

Как отличить двоичное, шестнадцатеричное и десятичное написание друг от друга

Конкретные нотации могут различаться в зависимости от языка программирования или используемой программы (printf, printf, xxd, hexdump и так далее), но обычно используются следующие правила:

По умолчанию целочисленный литерал (число) — это десятичное целое число.

Для обозначения двоичного целочисленного литерала перед ним используется 0b или 0B (ноль B). Иногда буква b ставится позади числа.

Для обозначения восьмеричного целочисленного литерала, перед ним используется 0 (ноль).

А для обозначения шестнадцатеричного целочисленного литерала, перед ним используется 0x или 0X (ноль X).

В Radare2 можно увидеть такую запись:

Обратите внимание на переменную eax, значение которой равно 0x6d, а затем дано пояснение 109 ascii. То есть в шестнадцатеричном виде значение переменной eax равно 0x6d, в десятеричном это 109 что соответствует символу m.

ASCII и HTML

Если в HTML коде перед десятичным кодом ASCII символа поставить &#, то веб-браузер отобразит этот символ.

К примеру, если использовать &#39, то веб-браузер покажет ' (одинарную кавычку). Некоторые преобразователи строк внутри веб-приложения также могут конвертировать написание символов &#XX в их ASCII представления. Поэтому безобидная запись &#39 внутри веб-приложения может превратиться в одинарную кавычку, которая может нарушить SQL запрос.

Аналогично можно использовать &#x, после которой нужно указать код символа в шестнадцатеричной системе, например, &#x27 также покажет кавычку. Для разделения символов друг от друга, используйте точку с запятой, например, &#x27;&#x68;&#x69;&#x27;

Многие программы понимают шестнадцатеричную запись, правда вид записи может различаться от конкретной программы и языка программирования.

В JavaScript шестнадцатеричные строки записываются в виде экранированной последовательности:

<script>
alert ("\x27\x68\x69\x27")
</script>

Можно записать код символов в восьмеричной системе счисления:

<script>
alert ("\47\150\151\47")
</script>

Аналогично Bash понимает такие строки:

echo -e "\x27\x68\x69\x27"
'hi'

И PHP их обрабатывает верно:

<?php
echo "\x27\x68\x69\x27";

Также выведет:

'hi'

Побитовые операции над строками

К побитовым операторам относятся:

  • И (AND)
  • Отрицание
  • Побитовое (включающее) ИЛИ (OR)
  • Побитовое ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR)
  • Побитовый сдвиг (влево и вправо)

Если вспомнить школьный/ВУЗовский курс логики, то там такие операции выполняются с нулями и единицами. То есть их можно выполнить с бинарными данными, например, с двоичными числами.

В языках программирования можно делать побитовые операции с десятичными числами, например Побитовое ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR) в PHP:

echo 8 ^ 5;

Выведет:

13

Дело в том, что числа будут автоматически переведены в двоичный вид и операция будет выполнена уже над двоичными числами.

Пример выше можно проверить вручную. Операция ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR) означает, что устанавливаются только те биты, которые установлены либо только в $a, либо только в $b, но не в обоих одновременно.

8 и 5 в двоичном виде это соответственно 1000 и 101, можно также из записать так: 1000 и 0101.

Итак:

  • смотрим первый бит — в первом числе он установлен (1) а во втором — не установлен (0), следовательно, в конечном числе он будет установлен (1)
  • смотрим второй бит — в первом числе он не установлен (0) а во втором — установлен (1), следовательно, в конечном числе он будет установлен (1)
  • смотрим третий бит — в первом числе он не установлен (0) и во втором — не установлен (0), следовательно, в конечном числе он не будет установлен (0)
  • смотрим четвёртый бит — в первом числе он не установлен (0) а во втором — установлен (1), следовательно, в конечном числе он будет установлен (1)

Получаем конечное число: 1101

Проверяем:

rax2 1101d
13

То есть в PHP операция проделана правильно, даже не смотря на то, что мы указали не двоичные числа, а десятичные.

Когда говорят о побитовых операциях со строками, то имеют в виду, что используется ASCII код символа (который затем переводиться в двоичный вид). После выполнения требуемой операции, выполняется обратное преобразование — число переводиться в ASCII символ.

Кстати, про ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR) — у этой операции есть интересное свойство:

  • Как мы уже видели, 8 ^ 5 = 13
  • При этом: 13 ^ 5 = 8
  • И: 8 ^ 13 = 5

То есть можно взять строки и выполнить между ними операцию XOR. В результате получиться бессмысленный набор символов. Затем если между этой бессмысленной строкой и любой из первоначальных строк вновь выполнить операцию XOR, то получиться вторая начальная строка.

На этом основано простейшее симметричное шифрование: исходный текст шифруется паролем с помощью XOR. То есть с первым символом текста и первыми символом пароля делается операция XOR, затем со вторым символом шифруемого текста и вторым символом пароля делается операция XOR и так далее, пока шифруемый текст не кончится. Поскольку пароль обычно короче шифруемого текста, то когда он заканчивается, вновь выполняется переход к первому символу пароля и так далее много раз.

В результате получается бессмысленный набор символов, которые можно расшифровать этим же паролем выполняя эту же операцию XOR.

Правда, зашифрованные таким образом тексты часто приводятся для тренировки в литературе по взлому шифров: если текст достаточно длинный, то с помощью статистического анализа того, как часто в нём встречаются символы и сравнивая эту частотность с естественной частотностью букв в языке, сначала вычисляют длину пароля, а затем и сам пароль. То есть это крайне ненадёжный шифр.

Вычитание числа из строки и прибавление к строкам числа

В статье «Анализ вредоносной программы под Linux: плохое самодельное шифрование» рассматривается шифрование, которое основано на прибавлении или вычитании числа к символу строки (на основе позиции символов). Как я думаю вы уже поняли, используется аналогичный приём: берётся ASCII код символа и из этого числа делается вычитание или находиться сумма с ним, а затем полученное число опять переводят в ASCII символ.

Побитовые операции с цифрами: нужно переводить в двоичную систему сами цифры или брать двоичные значения ASCII каждого символа?

Допустим, мы хотим сделать побитовую операцию 5 OR 7. Какой будет результат? Микропроцессор не работает ни с числами в десятичной системе, ни с ASCII строками — микропроцессор работает только двоичными числами.

То есть возникает вопрос:

1. Это числа?

2. Это ASCII строки?

Рассмотрим оба эти варианта, чтобы понять, насколько они различаются.

1.

5 и 7 — это числа

Число 5 в двоичной системе это 101, а число 7 в двоичной системе это 111.

В результате выполнения

101 OR 111

Будет получено 111. То есть результатом данной операции является число 7.

2.

5 и 7 — это ASCII строки

Смотрим таблицу ASCII символов, там цифре 5 соответствует код 00110101, а цифре 7 соответствует код 00110111. Делаем побитовую операцию OR между ними:

00110101 OR 00110111

Получаем: 110111, что в таблице ASCII символов также соответствует символу «7».

Итак, в принципе, можно напрямую переводить данные цифры в их двоичные значения, либо можно использовать двоичные значения их символов. Самое главное, придерживаться одной и той же схемы и преобразовывать с учётом выбранного пути. Ведь если вы делаете логическую операцию (например OR), с ASCII значением, а затем начинаете толковать полученный результат как число, то такое число (в нашем примере), будет равно 110111 = 55 (в десятичной системе). Или наоборот, вы сделали побитовую операцию между 101 OR 111, а затем полученный результат 111 начинаете трактовать как ASCII код символа — то тогда вместо числа вы получите управляющий символ «звуковой сигнал: звонок».

Заключение

Подытожим: у всех символов (печатных и непечатных) есть свой код ASCII. Кстати, ASCII — это ведь одна из многих кодировок. Существует много разных кодировок, например, очень популярна UTF8 и там у символов свои собственные коды. Причём используя экранированные последовательности можно записывать символы UTF8 по аналогии, как это показано с ASCII.

О том, как разными способами записать один и тот же символ (на примере “>”) смотрите здесь: https://security.stackexchange.com/questions/205967/character-escape-sequences-for

>
%3e
&gt
&gt;
&GT
&GT;
&#62
&#062
&#0062
&#00062
&#000062
&#0000062
&#62;
&#062;
&#0062;
&#00062;
&#000062;
&#0000062;
&#x3e
&#x03e
&#x003e
&#x0003e
&#x00003e
&#x000003e
&#x3e;
&#x03e;
&#x003e;
&#x0003e;
&#x00003e;
&#x000003e;
&#X3e
&#X03e
&#X003e
&#X0003e
&#X00003e
&#X000003e
&#X3e;
&#X03e;
&#X003e;
&#X0003e;
&#X00003e;
&#X000003e;
&#x3E
&#x03E
&#x003E
&#x0003E
&#x00003E
&#x000003E
&#x3E;
&#x03E;
&#x003E;
&#x0003E;
&#x00003E;
&#x000003E;
&#X3E
&#X03E
&#X003E
&#X0003E
&#X00003E
&#X000003E
&#X3E;
&#X03E;
&#X003E;
&#X0003E;
&#X00003E;
&#X000003E;
\x3e
\x3E
\u003e
\u003E

Эти техники могут использоваться в обходе фильтрации символов и слов.

Про Побитовые операторы (на примере PHP) смотрите здесь: https://www.php.net/manual/ru/language.operators.bitwise.php. Про саму суть логических побитовых операций - смотрите в учебниках по логике.

Вы уже знаете о факультете информационной безопасности от GeekBrains? Комплексная годовая программа практического обучения с охватом всех основных тем, а также с дополнительными курсами в подарок. По итогам обучения выдаётся свидетельство установленного образца и сертификат. По этой ссылке специальная скидка на любые факультеты и курсы!

Рекомендуется Вам:

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 5,00 из 5)
Загрузка...

Добавить комментарий

Ваш e-mail не будет опубликован.