Частина 7 - Хакінг char
Сьогодні ми хакуємо простий програму char.
Давайте переглянемо наш код.
#include <stdio.h> #include "pico/stdlib.h" int main() { stdio_init_all(); while(1) { char x = 'x'; printf("%c\n", x); sleep_ms(1000); } return 0; }
Давайте запустимо наш дебагер.
radare2 -w arm -b 16 0x03_char.elf
Давайте зробимо аналіз.
aaaa
Давайте перейдемо до головної частини програми.
s main
Давайте перейдемо в візуальний режим, натиснувши V і потім p двічі, щоб потрапити в добрий дебагерський вигляд.
У нашому останньому урокі ми розбили кожну лінію. Тут ми явно зацікавлені в хакінгу значення 0x78 і зміни цього значення на щось інше. Давайте спробуємо 0x79. Цей простий хак перетворить символ 'x' на 'y'.
:> wa movs r1, 0x79 @ 0x00000328 Written 2 byte(s) (movs r1, 0x79) = wx 7921
Давайте перевіримо зміну.
:> pd 1 @ 0x00000328 │ ; CODE XREF from main @ 0x338 │ 0x00000328 7921 movs r1, 0x79 ; 'y'; arg1
У цьому випадку наш дебагер навіть повідомляє нам, що воно насправді 'y', а тепер ми переміщаємо значення hex ascii в 0x79 в r1.
Давайте також хакнемо час очікування на 2000 мс або 2 секунди.
:> wa lsls r0, r0, 3 @ 0x00000332 Written 2 byte(s) (lsls r0, r0, 3) = wx c000
У цьому випадку ми просто логічно зміщуємо значення вліво 3 рази, тобто 250 х 2 = 500, 500 х 2 = 1000, 1000 х 2 = 2000.
Давайте перевіримо.
:> pd 1 @ 0x00000332 │ 0x00000332 c000 lsls r0, r0, 3
Усі, чого ми тепер повинні зробити, це вийти і перетворити нашу .elf на .uf2!
./elf2uf2/elf2uf2 0x03_char.elf 0x03_char.uf2
Вставте Піко і переконайтеся, що ви натискаєте кнопку BOOTSEL або використовуйте налаштування, які я надав у частині 2.
cp 0x03_char.uf2 /Volumes/RPI-RP2
Давайте його побачимо!
screen /dev/tty.usbmodem0000000000001
АХА!
y y y y y y
Ми бачимо 'y' виводиться кожні 2 секунди!
У нашому наступному урокі ми розберемося з типом даних int.