Практика языка C (МФТИ, 2023-2024). Семинар 6.2. Условные переходы и память в ассемблере x86.
Вставка
- Опубліковано 13 чер 2024
- Практические занятия по языку C на первом курсе МФТИ. Кафедра информатики.
На этом занятии мы погрузимся в работу с флагами. Мы начнём с того что обсудим детали goto. Далее вспомним кодировку для целых чисел. Далее мы увидим как отличаются знаковые и беззнаковые сравнения. Потом мы познакомимся с концепцией "эффективного адреса" и научимся работать с памятью. В конце нас ждёт погружение в тёмные искусства.
Семинарист: Константин Владимиров.
Дата: 4 марта 2024 года.
Съёмка: Марк Гончаров.
Звук: Юлий Тарасов.
Предыдущий семинар: • Практика языка C (МФТИ...
Следующий семинар: • Практика языка C (МФТИ...
Слайды к занятиям: cs.mipt.ru/wp/?page_id=7775
Примеры кода: github.com/tilir/c-graduate
Задачник: olymp1.vdi.mipt.ru/
Timeline
00:00 Немного про goto
11:29 Условные переходы в x86
14:30 Вспомним 2-адические числа
20:14 Снова к условным переходам
30:15 Беззнаковые сравнения
35:40 Эффективный адрес в x86
40:37 Выбираем синтаксис
44:00 Время решать задачи
46:00 Кодировка инструкций на практике
51:30 Введение в крэкми
01:02:10 Проблемы редактирования ассемблера
01:10:55 Разбор проблемы AGF и завершение
Errata
* Тут пока пусто
посмотрел, теперь буду как дурак умным ходить :-)
лучшие лекции по тематике
О Боже какое счастье прямой эфир, ваши лекции золото
Спасибо на добром слове, но премьера это не прямой эфир. Это обработанная запись которая эфиром немного притворяется.
Тааак, всем привет. Дядя Женя 41 годик снова пришёл на лекцию 😊. Пошёл смотреть с самого начала.
Дядь Женя, есть прекрасная книга. Язык программирования Си. Стивен Прата.
Зараза! Залез на пару минут глянуть о чем семинар. Опомнился только после окончания видео. Подача отличная, материал усваивается моментально.
Просто смотрю и нкайфую, спасибо огромное👍👍👍
Как круто что я вас нашел, так доходчиво все, еще бы по языкам для ПЛИС такого преподавателя)
И снова лайк заранее)
Круто! Приятно вспомнить молодость
Как всегда великолепно и четко объяснили 👍
15 тысяч вы набрали, поздравляю 😄
Какая ностальгия. Я помню учился ассемблеру по книжке, отладчик был OllyDBG, а в качестве дизассемблера использовал HIEW и дебажил крякмисы из журнала Хакер :-D интернет тога был был по карточкам и диалап модемчику
Ну вот да. Я считаю нельзя совсем уж лишать детей этого опыта ))
Хорош!
Ещё бы полноценный курс по реверс-инжинирингу...
Это преподаватель а не шарлотан с курсов.
@tilir, Константин, вы упомянули упомянули способ хранения данных, в данном кейсе little-endian. На примере опкода 74 2b на этом тайминге 57:07. Открыв бинарь через хекс- редактор порядок был прямым, как будто это big-endian, я чтото упускаю?
Спасибо за семинар) Как всегда - потрясающе
44:11 Могу ошибаться, но кажется, что код на C мог бы выглядеть так:
int foo(int *arr, int len) {
int i, value = 0;
if (len
Да вы правы это inclusive scan.
Чуть-чуть не так считали точку приземления. В момент вычисления "куда пойду" IP равен уже 0x1244, и тогда точное попадание на второй call abort (0x1244+0x2B=0x126F).
И ничего не рассказали про то, зачем компилятор на O1 бережно сдублировал нам аборты (чтобы мы не ругали потом отладчик).
Но это все мелочи, лекции очень крутые!
goto активно используется в ядре Линукса в probe функциях драйверов для перехода к обработке ошибок.
И для освобождения ресурсов (подобие defer).
Если переходы осуществляются только в конец функции, то код получается читаемее, чем если пытаться придумать вермишель без использования goto только потому что неправильно научили, что это "безусловное зло".
код на 18 слайде с goto можно заменить на это
for (i=0; i
А вы уверены что замена эквивалентная? У вас вместо 2×N итераций в случае когда условия не выполняются получилось N×N.
@@tilir да вы правы, об оптимизации при не выполнении я не подумал
а если так прервать цикл ?
for (i=0; i
28:22 (-5) - (-4) = -1
)
Тут еще и немного реверс инжиниринга😀 Константин, есть инструмент radare2, очень удрбный дизассемблер, hex editor и еще еще еще👍👍👍
Я в курсе. Хотя моё детство пришлось на IDA и Softice, я стараюсь не отставать от новых технологий. Ещё Hydra знаю, тоже очень интересное решение. Но я не учу детей прицельно реверс-инжинирингу. Это просто для общего образования. Если заинтересуются сами всё найдут. А вот хотя бы в комментах и найдут )))
Наверно вы все таки имели ввиду Ghidra@@tilir
3:50 on right side it is not while loop. It is do while
Ничего подобного. Это while так как я оставил сверху проверку которая обеспечивает безопасный вход в первую итерацию. Я просто её немножко обобщил ))
1:23:28
То неловкое чувство, когда решил cm0 за полтора часа((
К сожалению ассемблер почти не знаю, но не прав ли я, что на 44 минуте код вычисляет что-то вроде коммулятивнрй суммы массива , на который указывает x?
Хорошая гипотеза. Как будете проверять?
@@tilirя бы скомпилировал код ассемблера и потом протестировал бы на разных данных его путем вызова из си:) сегодня так и сделаю)
57:10 Так вот кто эти хулиганы, которые мой айпи с помощью артмани взломали
You've been pwn'd
в инете давно уже забрасывают асм, а зря..и курсов никто нормальных не делает для х64, крис касперски толковые книжки выпустил про exe и реверс, но охото свежего
Здравствуйте.
Отличная лекция.
Единственное, слайд "Концепция эффективного адреса" из-за опечатки мозг сильно ломает.
Хотелось бы в errata пояснение к этому моменту добавить с разъяснением как получается адрес.
Потому что приходится много думать, почему на месте двойки на самом деле восьмёрка и в голове держать, что int - это 4 байта, а не восемь
Я же поправляюсь прямо по ходу изложения. Обычно в эррату я сношу то что наглухо пропустил.
@@tilir да, так и есть.
Возможно я просто устал сегодня или это моя особенность, но понял я что происходит когда раз пять этот момент пересмотрел, ещё и сильно думая, в промежутках.
Мой комментарий вас ни к чему не обязывает, просто захотелось дать обратную связь.
Лекция то всё равно на высоте :)
Кто додумался до Регистра флагов, Это же ОЧЕВИДНО КОСТЫЛЬ. Я вот не понимаю, как в risc архитектурах, При ограниченном числе команд хватает места на все команды, а в x86 c 5000 инструкциями наверное(и 100к строк декодером к примеру iced) Не хватает места на отдельные инструкции знаковые, без. Вот это то же парадокс.
Ну как сказать. Есть три решения: глобальный регистр флагов, флаги прикреплённые к регистрам или отказ от флагов. Все три имеют свои удачные реализации.
Ждать ответку белому дому, за их совет: не пишете на c/c++ - небезопасно?
Какое мне дело до американского правительства? ))
Уже так много хороших лекций,а я всё поверхностно смотрю,всратую игрушку не могу опубликовать и забыть как кошмарный сон.сегодня последняя попытка и нафиг её.такие темы нормальные пропускаю
Не материтесь пожалуйста. Ну и хм... если что-то хочется забыть как страшный сон, может быть действительно стоит взять паузу. Мне кажется программирование должно в первую очередь приносить радость ))
Не совсем по теме лекций. Хорошо проникаешься ассемблером, если купить себе простую fpga и самостоятельно сделать на ней очень простую архитектуру, например по nand2tetris
Это уже скорее разработка железа. Для того чтобы разобраться именно в ассемблере лучше взять одноплатный ПК и что-нибудь там написать под bare metal. У нас действует лаборатория RISC-V куда первокурсники могут зайти и всё испытать.
Балы, красавицы, лакеи, хакера,
И вери трики кейс, и хруст французской булки...
у интел самый норм синтаксис, кто вообще додумался делать вот так 4(%esp) или 4(r1) , Кто этот гений, где хоть один язык программирования где доступ к данным через скобки (), а не "[ ]". еще и переменой мест базы и смещения, Прикиньте если бы было бы так int a = 4(arr) вместо arr[4],
Я полагаю синтаксис AT&T планировался исходя из лёгкости автоматического разбора, без оглядки на проблемы кожаных мешков.
Очень инетересно, было бы круто если бы вы рассказали поглубже про crackme и PE-Header(ну и попутно про DOS-Header)
Это не курс по реверс-инжинирингу. Я что-то расскажу про формат ELF на седьмом семинаре когда буду рассказывать как программу загружают и что при этом происходит. Но не более того.