Частина 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 мілісекунд!

У наступній лекції ми розберемося з плаваючими точками і особливим чином, яким Піко обробляє їх, оскільки воно не має співпроцесора.

results matching ""

    No results matching ""