Практика языка 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
    * Тут пока пусто

КОМЕНТАРІ • 55

  • @mahabat23
    @mahabat23 2 місяці тому +3

    посмотрел, теперь буду как дурак умным ходить :-)
    лучшие лекции по тематике

  • @MikhailGoncharov-tl4cr
    @MikhailGoncharov-tl4cr 3 місяці тому +11

    О Боже какое счастье прямой эфир, ваши лекции золото

    • @tilir
      @tilir  3 місяці тому +3

      Спасибо на добром слове, но премьера это не прямой эфир. Это обработанная запись которая эфиром немного притворяется.

  • @sibedir
    @sibedir 3 місяці тому +15

    Тааак, всем привет. Дядя Женя 41 годик снова пришёл на лекцию 😊. Пошёл смотреть с самого начала.

    • @russiancybercheck
      @russiancybercheck Місяць тому +1

      Дядь Женя, есть прекрасная книга. Язык программирования Си. Стивен Прата.

  • @intivi5277
    @intivi5277 3 місяці тому +5

    Зараза! Залез на пару минут глянуть о чем семинар. Опомнился только после окончания видео. Подача отличная, материал усваивается моментально.

  • @phil2964
    @phil2964 3 місяці тому +5

    Просто смотрю и нкайфую, спасибо огромное👍👍👍

  • @user-sw6hg7pb1p
    @user-sw6hg7pb1p 3 місяці тому +2

    Как круто что я вас нашел, так доходчиво все, еще бы по языкам для ПЛИС такого преподавателя)

  • @user-fw3kx2ix3p
    @user-fw3kx2ix3p 3 місяці тому +6

    И снова лайк заранее)

  • @vitalyistr
    @vitalyistr 3 місяці тому +3

    Круто! Приятно вспомнить молодость

  • @user-xd1rr1vj3f
    @user-xd1rr1vj3f 3 місяці тому +2

    Как всегда великолепно и четко объяснили 👍

  • @SpanchBobSpannish
    @SpanchBobSpannish 3 місяці тому +2

    15 тысяч вы набрали, поздравляю 😄

  • @pavelrid
    @pavelrid 3 місяці тому +3

    Какая ностальгия. Я помню учился ассемблеру по книжке, отладчик был OllyDBG, а в качестве дизассемблера использовал HIEW и дебажил крякмисы из журнала Хакер :-D интернет тога был был по карточкам и диалап модемчику

    • @tilir
      @tilir  3 місяці тому +2

      Ну вот да. Я считаю нельзя совсем уж лишать детей этого опыта ))

  • @malsh5288
    @malsh5288 3 місяці тому +1

    Хорош!
    Ещё бы полноценный курс по реверс-инжинирингу...

    • @doctor_livsi_pod_phonk
      @doctor_livsi_pod_phonk 3 місяці тому

      Это преподаватель а не шарлотан с курсов.

  • @evgenyrozhnowsky6572
    @evgenyrozhnowsky6572 2 місяці тому +1

    @tilir, Константин, вы упомянули упомянули способ хранения данных, в данном кейсе little-endian. На примере опкода 74 2b на этом тайминге 57:07. Открыв бинарь через хекс- редактор порядок был прямым, как будто это big-endian, я чтото упускаю?

  • @user-kz4bx7bp5s
    @user-kz4bx7bp5s 3 місяці тому +1

    Спасибо за семинар) Как всегда - потрясающе
    44:11 Могу ошибаться, но кажется, что код на C мог бы выглядеть так:
    int foo(int *arr, int len) {
    int i, value = 0;
    if (len

    • @tilir
      @tilir  3 місяці тому

      Да вы правы это inclusive scan.

  • @user-tv1td8zz1b
    @user-tv1td8zz1b 3 місяці тому

    Чуть-чуть не так считали точку приземления. В момент вычисления "куда пойду" IP равен уже 0x1244, и тогда точное попадание на второй call abort (0x1244+0x2B=0x126F).
    И ничего не рассказали про то, зачем компилятор на O1 бережно сдублировал нам аборты (чтобы мы не ругали потом отладчик).
    Но это все мелочи, лекции очень крутые!

  • @Airatgl
    @Airatgl 3 місяці тому +1

    goto активно используется в ядре Линукса в probe функциях драйверов для перехода к обработке ошибок.

    • @m6vrm
      @m6vrm 3 місяці тому

      И для освобождения ресурсов (подобие defer).
      Если переходы осуществляются только в конец функции, то код получается читаемее, чем если пытаться придумать вермишель без использования goto только потому что неправильно научили, что это "безусловное зло".

  • @user-oz1jv4yc8y
    @user-oz1jv4yc8y 3 місяці тому

    код на 18 слайде с goto можно заменить на это
    for (i=0; i

    • @tilir
      @tilir  3 місяці тому +1

      А вы уверены что замена эквивалентная? У вас вместо 2×N итераций в случае когда условия не выполняются получилось N×N.

    • @user-oz1jv4yc8y
      @user-oz1jv4yc8y 3 місяці тому

      @@tilir да вы правы, об оптимизации при не выполнении я не подумал

    • @user-oz1jv4yc8y
      @user-oz1jv4yc8y 2 місяці тому

      а если так прервать цикл ?
      for (i=0; i

  • @olegpatraschku3736
    @olegpatraschku3736 Місяць тому

    28:22 (-5) - (-4) = -1
    )

  • @phil2964
    @phil2964 3 місяці тому +1

    Тут еще и немного реверс инжиниринга😀 Константин, есть инструмент radare2, очень удрбный дизассемблер, hex editor и еще еще еще👍👍👍

    • @tilir
      @tilir  3 місяці тому +2

      Я в курсе. Хотя моё детство пришлось на IDA и Softice, я стараюсь не отставать от новых технологий. Ещё Hydra знаю, тоже очень интересное решение. Но я не учу детей прицельно реверс-инжинирингу. Это просто для общего образования. Если заинтересуются сами всё найдут. А вот хотя бы в комментах и найдут )))

    • @nikitaq123
      @nikitaq123 2 місяці тому

      Наверно вы все таки имели ввиду Ghidra@@tilir

  • @MahdiyDev
    @MahdiyDev 3 місяці тому +1

    3:50 on right side it is not while loop. It is do while

    • @tilir
      @tilir  3 місяці тому +1

      Ничего подобного. Это while так как я оставил сверху проверку которая обеспечивает безопасный вход в первую итерацию. Я просто её немножко обобщил ))

  • @napalm20005
    @napalm20005 22 дні тому

    1:23:28
    То неловкое чувство, когда решил cm0 за полтора часа((

  • @andrewkot5212
    @andrewkot5212 2 місяці тому

    К сожалению ассемблер почти не знаю, но не прав ли я, что на 44 минуте код вычисляет что-то вроде коммулятивнрй суммы массива , на который указывает x?

    • @tilir
      @tilir  2 місяці тому

      Хорошая гипотеза. Как будете проверять?

    • @andrewkot5212
      @andrewkot5212 2 місяці тому

      @@tilirя бы скомпилировал код ассемблера и потом протестировал бы на разных данных его путем вызова из си:) сегодня так и сделаю)

  • @sibedir
    @sibedir 3 місяці тому +1

    57:10 Так вот кто эти хулиганы, которые мой айпи с помощью артмани взломали

    • @tilir
      @tilir  3 місяці тому +1

      You've been pwn'd

  • @KrINekroN
    @KrINekroN 3 місяці тому

    в инете давно уже забрасывают асм, а зря..и курсов никто нормальных не делает для х64, крис касперски толковые книжки выпустил про exe и реверс, но охото свежего

  • @The604FX
    @The604FX 2 місяці тому

    Здравствуйте.
    Отличная лекция.
    Единственное, слайд "Концепция эффективного адреса" из-за опечатки мозг сильно ломает.
    Хотелось бы в errata пояснение к этому моменту добавить с разъяснением как получается адрес.
    Потому что приходится много думать, почему на месте двойки на самом деле восьмёрка и в голове держать, что int - это 4 байта, а не восемь

    • @tilir
      @tilir  2 місяці тому

      Я же поправляюсь прямо по ходу изложения. Обычно в эррату я сношу то что наглухо пропустил.

    • @The604FX
      @The604FX 2 місяці тому

      @@tilir да, так и есть.
      Возможно я просто устал сегодня или это моя особенность, но понял я что происходит когда раз пять этот момент пересмотрел, ещё и сильно думая, в промежутках.
      Мой комментарий вас ни к чему не обязывает, просто захотелось дать обратную связь.
      Лекция то всё равно на высоте :)

  • @tarmo9010
    @tarmo9010 3 місяці тому

    Кто додумался до Регистра флагов, Это же ОЧЕВИДНО КОСТЫЛЬ. Я вот не понимаю, как в risc архитектурах, При ограниченном числе команд хватает места на все команды, а в x86 c 5000 инструкциями наверное(и 100к строк декодером к примеру iced) Не хватает места на отдельные инструкции знаковые, без. Вот это то же парадокс.

    • @tilir
      @tilir  3 місяці тому

      Ну как сказать. Есть три решения: глобальный регистр флагов, флаги прикреплённые к регистрам или отказ от флагов. Все три имеют свои удачные реализации.

  • @user-zy3ub3bx1h
    @user-zy3ub3bx1h 3 місяці тому +1

    Ждать ответку белому дому, за их совет: не пишете на c/c++ - небезопасно?

    • @tilir
      @tilir  3 місяці тому

      Какое мне дело до американского правительства? ))

  • @user-tx7ct1fg2i
    @user-tx7ct1fg2i 3 місяці тому

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

    • @tilir
      @tilir  3 місяці тому

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

  • @disperf2928
    @disperf2928 3 місяці тому

    Не совсем по теме лекций. Хорошо проникаешься ассемблером, если купить себе простую fpga и самостоятельно сделать на ней очень простую архитектуру, например по nand2tetris

    • @tilir
      @tilir  3 місяці тому

      Это уже скорее разработка железа. Для того чтобы разобраться именно в ассемблере лучше взять одноплатный ПК и что-нибудь там написать под bare metal. У нас действует лаборатория RISC-V куда первокурсники могут зайти и всё испытать.

  • @MVZ1983
    @MVZ1983 Місяць тому

    Балы, красавицы, лакеи, хакера,
    И вери трики кейс, и хруст французской булки...

  • @tarmo9010
    @tarmo9010 3 місяці тому

    у интел самый норм синтаксис, кто вообще додумался делать вот так 4(%esp) или 4(r1) , Кто этот гений, где хоть один язык программирования где доступ к данным через скобки (), а не "[ ]". еще и переменой мест базы и смещения, Прикиньте если бы было бы так int a = 4(arr) вместо arr[4],

    • @tilir
      @tilir  3 місяці тому +1

      Я полагаю синтаксис AT&T планировался исходя из лёгкости автоматического разбора, без оглядки на проблемы кожаных мешков.

  • @milsnel
    @milsnel 3 місяці тому

    Очень инетересно, было бы круто если бы вы рассказали поглубже про crackme и PE-Header(ну и попутно про DOS-Header)

    • @tilir
      @tilir  3 місяці тому

      Это не курс по реверс-инжинирингу. Я что-то расскажу про формат ELF на седьмом семинаре когда буду рассказывать как программу загружают и что при этом происходит. Но не более того.