Частина 10 - Хакінг int
Сьогодні ми хакуємо нашу просту int програму. Давайте переглянемо код.
0x04_int.c
#include <stdio.h> #include "pico/stdlib.h" int main() { stdio_init_all(); while(1) { int x = 40; printf("%d\n", x); sleep_ms(1000); } return 0; }
Давайте запустимо наш дебагер.
radare2 -w arm -b 16 0x04_int.elf
Давайте зробимо аналіз автоматично.
aaaa
Давайте перейдемо до головної частини програми.
s main
Давайте перейдемо в візуальний режим, натиснувши V і потім p двічі, щоб потрапити до хорошого дебагерського перегляду.
Ми почнемо з зміни int значення, яке ми знаємо, що воно дорівнює 40 у десятичній системі числення або 28 у шістнадцятковій системі числення.
:> wa movs r1, 0x30 @ 0x00000328 Written 2 byte(s) (movs r1, 0x30) = wx 3021
У цьому місці ми бачимо, що 0x30 дорівнює 48 у десятичній системі числення.
:>? 0x30 int32 48 uint32 48 hex 0x30 octal 060 unit 48 segment 0000:0030 string "0" fvalue: 48.0 float: 0.000000f double: 0.000000 binary 0b00110000 ternary 0t1210
Також ми бачимо, що 0xfa, яке ми знаємо, що воно дорівнює 250 у десятичній системі числення, є нашим 1/4 мілісекундним затримкою, яка при зміщенні вліво двічі, збільшується і стає 1000 у десятичній системі числення для затримки на 1 секунду.
:>? 0xfa int32 250 uint32 250 hex 0xfa octal 0372 unit 250 segment 0000:00fa string "\xfa" fvalue: 250.0 float: 0.000000f double: 0.000000 binary 0b11111010 ternary 0t100021
Давайте змінимо його на 50 у десятичній системі числення.
:> wa movs r0, 0x32 @ 0x00000330 Written 2 byte(s) (movs r0, 0x32) = wx 3220
Ми бачимо, що воно насправді дорівнює 50 у десятичній системі числення.
:>? 0x32 int32 50 uint32 50 hex 0x32 octal 062 unit 50 segment 0000:0032 string "2" fvalue: 50.0 float: 0.000000f double: 0.000000 binary 0b00110010 ternary 0t1212
Давайте також змішаємо його лише вліво один раз, щоб воно перетворилося на 100 у десятичній системі числення після зміщення лише вліво один раз.
:> wa lsls r0, r0, 1 @ 0x00000332 Written 2 byte(s) (lsls r0, r0, 1) = wx 4000
Тепер у нас залишається лише вийти і перетворити нашу .elf на .uf2!
./elf2uf2/elf2uf2 0x04_int.elf 0x04_int.uf2
Вставте Піко і переконайтеся, що ви натискаєте кнопку BOOTSEL або використовуєте налаштування, які я надав у частині 2.
cp 0x04_int.uf2 /Volumes/RPI-RP2
Давайте побачимо його!
screen /dev/tty.usbmodem0000000000001
АХА!
48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48
У цьому місці ми бачимо, що ми змінили його на 48 у десятичній системі числення, і воно друкує кожні 100 мілісекунд!
У наступній лекції ми розберемося з плаваючими точками і особливим чином, яким Піко обробляє їх, оскільки воно не має співпроцесора.