?

Log in

No account? Create an account
книги: ассемблер - Поклонник деепричастий [entries|archive|friends|userinfo]
Anatoly Vorobey

[ website | Website ]
[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Links
[Links:| English-language weblog ]

книги: ассемблер [сент. 1, 2018|04:21 am]
Anatoly Vorobey
[Tags|, , ]

x86-64 Assembly Language Programming with Ubuntu

Неплохая бесплатная книга для знакомства с современным ассемблером. Применима к любому Линуксу, "Ubuntu" ни при чем. Сознательно опускает многое (например, 16- и 32-битные режимы) и за это автора следует похвалить: лучше меньше, да лучше, особенно для новичков.

Вместе с тем, в книге есть лишнее и недостающее. Некоторые главы сводятся к сухому пересказу списка инструкций (например, плавающей точки), это не нужно. С другой стороны, не хватает краткого описания, что такое машинные коды, с несколькими примерами. Хоть что-то следовало сказать про устройство виртуальной памяти. Некоторые главы сделаны на неправильном "уровне абстракции". Глава про multithreading зачем-то объясняет, как вызывать pthreads, вместо того, чтобы построить пример на системном вызове clone(). Похожим образом глава про аргументы коммандной строки зачем-то использует C-шную конвенцию main(argc,argv) и для этого требует от читателя линковать пример с помощью gcc, а не ld (и не объясняет, почему, чистая магия выходит). Лучше было объяснить, что такое ABI, и брать аргументы по нему.

В целом, адекватное введение в основы 64-битного ассемблера x86-систем для тех, кто знает какой-то язык программирования высшего уровня.

Из обсуждения книги на HN я узнал любопытную деталь. Инструкция NOP (машинный код 0x90) "на самом деле" по своему коду расшифровывается как "xchg eax, eax" (это я знал). Но с переходом к 64 битам пришлось кое-что подправить в консерватории, потому что 32-битные операции вообще говоря обнуляют верхние 32 бита 64-битных регистров, но мы не хотим, конечно, чтобы NOP обнуляла верхнюю половину RAX. В результате 0x90 официально переосмыслили как NOP, не имеющий отношения к XCHG; если очень хочется сделать "xchg eax, eax", можно сделать это через другую форму инструкции, начинающуюся с 0x87 и занимающую два байта. Но например 0x91 остается сокращенной формой "xchg ecx, eax", 0x92 это "xchg edx, eax" итд., и они все обнуляют верхушки 64-битных регистров. А 0x90 не обнуляет, особь статья.
СсылкаОтветить

Comments:
[User Picture]From: occuserpens
2018-09-01 01:46 pm
Имеется в виду не общее знание того, что такое вообще Ассемблер, а умение работать на конкретном ассемблере со всеми деталями
(Ответить) (Parent) (Thread)
[User Picture]From: lightjedi
2018-09-01 04:44 pm
Иногда нужно написать супероптимизированный код, и без ассемблера не обойтись. Например для хэша паролей Argon2 надо было такой написать
(Ответить) (Parent) (Thread)
[User Picture]From: occuserpens
2018-09-01 06:19 pm
Что интересно, это таки security/hacking. И непонятно, насколько эта шука полезна в большой системе вроде Амазона. Нет ли здесь false security?
(Ответить) (Parent) (Thread)
[User Picture]From: lightjedi
2018-09-01 06:46 pm
Чем быстрее функция, тем больше вычислений можно сделать в секунду и соответственно заложить на обработку пароля - и тем сложнее перебор паролей для атакующего на спецжелезе
(Ответить) (Parent) (Thread)
[User Picture]From: occuserpens
2018-09-01 07:15 pm
Если речь идет об атаке перебор паролей, то она блокируется тупым запретом на быстрый повторный логин.
(Ответить) (Parent) (Thread)
[User Picture]From: hord
2018-09-01 08:58 pm
А если речь не об атаке на вебсервис, а про брутфорс при ИЗВЕСТНОМ хэше?
(Ответить) (Parent) (Thread)
[User Picture]From: lightjedi
2018-09-01 09:09 pm
Речь идет об атаке в оффлайне, например на бд хэшей или на зашифрованный диск
(Ответить) (Parent) (Thread)
[User Picture]From: occuserpens
2018-09-02 12:55 am
Шифрованный диск - это да. Но такие вещи разумно сажать на чип и тогда ассемблерная оптимизация вроде как не нужна
https://www.allaboutcircuits.com/news/energy-efficient-public-key-encryption-chip-solve-iot-security-problems/
(Ответить) (Parent) (Thread)
[User Picture]From: lightjedi
2018-09-02 05:27 am
Если диск зашифрован на пароле, то ключ симметричного шифрования получается хэшированием пароля, и именно этот ключ подбирается перебором пароля. Тут некуда запихнуть чип; наоборот идея в том чтобы проводить хэширование используя по максимуму CPU и память.
(Ответить) (Parent) (Thread)
[User Picture]From: occuserpens
2018-09-02 11:31 am
Ага, в Линуксе хэширование паролей применяется часто. Но использовать его для серьезной шифровки - это детский сад. Только общеключевуха и двухфакторник с чиповыми токенами.

Edited at 2018-09-02 12:17 (UTC)
(Ответить) (Parent) (Thread)