Частина 16 - Дебагування примітивного типу даних Float
Для повного змісту змісту всіх уроків, будь ласка, натисніть нижче, оскільки це надасть вам короткий зміст кожного уроку, а також теми, які будуть розглянуті. https://github.com/mytechnotalent/hacking\_c-\_arm64
Сьогодні ми будемо дебагувати свій дуже простий примітивний тип даних Float.
Для початку відкрийте нашу бінарну у Radare2.
radare2./0x05_asm64_float_primitive_datatype
Давайте використаємо Radare2 функцію автоматичної аналізу.
aaa
Наступним логічним кроком буде запуск програми в режимі дебагування, щоб вона відображала на диску в процесі виконання машинний код.
ood
Тепер, коли ми маємо працюючий екземпляр, ми можемо звернутися до головного вхідного пункту бінарного файлу.
s main
Давайте зробимо початкове дослідження шляхом виконання наступних дій.
v
При роботі з дробними числами ARM64 необхідно розуміти, що ми повинні знайти місце, де відбувається інструкція fmov, де ми беремо значення з нашого регістра w0 і переміщаємо його в регістр дробових чисел s0. Тут відбувається справжня магія!
Давайте встановимо зупинку в місці, розташованому прямо нижче інструкції fmov. Пам'ятайте, що адреси ASLR будуть відрізнятися від цього прикладу.
[0x557931c9b4]> db 0x557931c9c8 [0x557931c9b4]> dc [0x557931c9b4]> hit breakpoint at: 0x557931c9c8 [0x557931c9c8]> ds [0x557931c9c8]> dr w0 0x4121999a [0x557931c9c8]>
Також ми бачимо цю дивну вартість, яка, якщо переглянути код нижче, інструкція lsl (логічний зміщення вліво) переміщає порядок байтів, який ми використовуємо інструкції movz і movk, які movz перемістить 0x999a в регістр w0 і потім movk перемістить 0x4121, lsl 16 в регістр w0, тому 4121 знаходиться в більш високій порядку байтів місцях, а 999a знаходиться в нижній порядку байтів місцях.
movz w0, 0x999a movk w0, 0x4121, lsl 16 fmov s0, w0
Ми переміщаємо регістр w0 в регістр s0, тому ми повинні змінити ці значення тут, перш ніж дозволити йому потрапити в регістр s0, інакше це буде значно важче підмінити значення в наступному урокі.
Давайте продовжимо показувати нашу вартість.
[0x557931c9c8]> dc 10.1 (237691) Process exited with status=0x0 [0x7fb948407c]>
У наступному урокі ми підмінимо цю вартість!
Примітка: XMDX - це спеціальний код, який використовується для позначення окремих частин тексту!