Частина 31 – Хакінг змінних Float
Для повного змісту всіх уроків натисніть нижче, оскільки це надасть вам короткий зміст кожного уроку, а також теми, які будуть розглянуті.
Давайте знову розглянемо наш код.
Давайте переглянемо попередній урок.
Давайте зупинимося на main+20 і продовжимо на цьому місці.
Давайте побачимо, яку вартість знаходиться всередині r11-8. Вже дуже чітко бачимо, що це 1337.09998, яка наближається до нашої вартості в нашому оригінальному коді C++. Увага: змінна Float має близько 7 цифр після коми точності, тому ми не бачимо 1337.1. Будьте пам'ятливі про це, оскільки продовжуватимемо.
Ми також бачимо цю вартість в високій пам'яті.
Давайте зупинимося на main+28 і продовжимо.
Ми бачимо дивну нову інструкцію. Ми бачимо vldr і значення всередині r11, #8, яке переміщується в s0. А що таке s0? Ми маємо математичний процесор, який має серію додаткових регістрів, які працюють з десятковими або плаваючими-цілочисельними числами. Тут ми бачимо приклад такого, до якого значення 1337.09998 переміщується в s0. Інструкція vldr завантажує константне значення в кожний елемент однобайтового або подвійнобайтового регістру, наприклад s0.
Ми можемо побачити ці спеціальні регістри тільки якщо ми зробимо команду info registers all, як ми робимо нижче.
Нижче ми бачимо значення, яке тепер переміщується в s0.
Давайте хакнемо!
Давайте тепер побачимо регістри і побачимо, що відбулося.
Давайте зупинимося на main+20 і продовжимо.
Давайте зупинимося на main+28 і продовжимо.
Як бачите, ми вже хакнули значення (з урахуванням проблеми точності змінної Float, яка відповідає 6 цифрам після коми).
Останнім часом продовжуючи, ми бачимо наш хакований вміст відображений знову в терміналі, коли функція C++ cout виконує.
Наступна неділя ми вийдемо на подвійні змінні.