Частина 17 - Хакінг примітивної типової даних типу float
Для повного змісту всіх уроків натисніть нижче, оскільки це надасть вам короткий зміст кожного уроку, а також теми, які будуть розглянуті. https://github.com/mytechnotalent/hacking\_c-\_arm64
Сьогодні ми хакуємо float з попереднього уроку.
Спочатку оновіть наш radare2 джерельний код.
cd radare2 git pull sys/user.sh
Якщо ви раніше не дотримувалися інструкцій, необхідно побудувати radare2 з джерела, оскільки вони рідко оновлюють випуски.
https://github.com/radareorg/radare2
Якщо ви не маєте репозиторію, клоніруйте його і дотримуйтесь інструкцій вище.
Давайте запустимо radare2 у режимі запису.
radare2 -w./0x05_asm64_float_primitive_datatype
Давайте зробимо аналіз автоматично.
aaa
Перейдіть до головної частини.
s main
Перегляньте розборку.
v
Давайте повернемося до термінального перегляду.
q
Нам потрібно змінити дві інструкції. Давайте розглянемо дві дуже спеціальні інструкції.
movz w0, 0x999a movk w0, 0x4121, lsl 16
Пам'ятайте з попереднього тижня, що в кінцевому підсумку w0 буде зберігати 0x4121999a як lsl переміщає біти в зворотньому порядку байтів.
Зараз це буде давати float 10.1 як ми бачили раніше в попередніх уроках. Важливо розуміти, що в чиселах з плаваючою комою є мантисса яка в нашому випадку 10 і висота яка 1 до якої вони розділені._ яка поєднує їх разом.
Отже, щоб отримати 10.2 нам потрібно буде написати збірку і оновити ці інструкції.
[0x000009b4]> wa movz w0, 0x3333 @0x000009bc [0x000009b4]> wa movk w0, 0x4123, lsl 16 @0x000009c0 q
Тепер запустіть бінарник!
kali@kali:~/Documents/0x05_float_primitive_datatype$./0x05_float_primitive_datatype 10.2
Я бажаю, щоб ви взяли близько на погляд деякі приклади, які я створив для вас, щоб ви могли зрозуміти, як різні значення призводять до різних результатів. Увага! Результати будуть різними, оскільки ці результати будуть активним сесією відлагодження, тому адреси будуть різними, тому ваш ASLR буде мати різні значення.
[0x555e6c29c4]> dr w0 = 0x4122999a 0x4121999a ->0x4122999a [0x555e6c29c4]> dc hit breakpoint at: 0x555e6c29c8 [0x555e6c29c8]> dc 10.1625 (238252) Process exited with status=0x0 [0x556215e9c4]> dr w0 = 0x41235555 0x4121999a ->0x41235555 [0x556215e9c4]> dc hit breakpoint at: 0x556215e9c8 [0x556215e9c8]> dc 10.2083 (238258) Process exited with status=0x0 [0x558216c9c4]> dr w0 = 0x4123599a 0x4121999a ->0x4123599a [0x558216c9c4]> dc hit breakpoint at: 0x558216c9c8 [0x558216c9c8]> dc 10.2094 (238257) Process exited with status=0x0 [0x55868a79c4]> dr w0 = 0x4123999a 0x4121999a ->0x4123999a [0x55868a79c4]> dc hit breakpoint at: 0x55868a79c8 [0x55868a79c8]> dc 10.225 (238253) Process exited with status=0x0 [0x55826479c4]> dr w0 = 0x41233333 0x4121999a ->0x41233333 [0x55826479c4]> dc hit breakpoint at: 0x55826479c8 [0x55826479c8]> dc 10.2 (238259) Process exited with status=0x0 [0x55716ab9c4]> dr w0 = 0x4125999a 0x4121999a ->0x4125999a [0x55716ab9c4]> dc hit breakpoint at: 0x55716ab9c8 [0x55716ab9c8]> dc 10.35 (238250) Process exited with status=0x0 [0x55880169c4]> dr w0 = 0x412f999f 0x4121999a ->0x412f999f [0x55880169c4]> dc hit breakpoint at: 0x55880169c8 [0x55880169c8]> dc 10.975 (238245) Process exited with status=0x0 [0x559130d9c4]> dr w0 = 0x412ff99e 0x4121999a ->0x412ff99e [0x559130d9c4]> dc hit breakpoint at: 0x559130d9c8 [0x559130d9c8]> dc 10.9984 (238246) Process exited with status=0x0 [0x557b1b39c4]> dr w0 = 0x412fff9e 0x4121999a ->0x412fff9e [0x557b1b39c4]> dc hit breakpoint at: 0x557b1b39c8 [0x557b1b39c8]> dc 10.9999 (238247) Process exited with status=0x0 [0x55931439c4]> dr w0 = 0x412ffffe 0x4121999a ->0x412ffffe [0x55931439c4]> dc hit breakpoint at: 0x55931439c8 [0x55931439c8]> dc 11 (238248) Process exited with status=0x0
Ви починаєте бачити шаблони тут. ВИДЕЛІТЬСЯ ПОВІДОМЛЕННЯ ІСТИННО ВИПРОБУВАТИ ЦІ ВИРОБИТИ, щоб краще зрозуміти, як ці значення в кінцевому підсумку потрапляють в регістр s0!
У наступному уроці ми обговоримо подвійні числа.