Частина 13 - Хакінг флоата

Давайте переглянем наш приклад. 0x05_float.c as слідує.

#include <stdio.h>
#include "pico/stdlib.h"

int main() 
{
  stdio_init_all();

  while(1) 
  {
    float x = 40.5;

    printf("%f\n", x); 

    sleep_ms(1000);
  }

  return 0;
}

Давайте запустимо наш дебагер.

radare2 -w arm -b 16 0x05_float.elf

Давайте зробимо аналіз автоматично.

aaaa

Давайте перейдемо до головної частини програми.

s main

Давайте перейдемо в візуальний режим, натиснувши V і потім p два рази, щоб потрапити до хорошого дебагерського перегляду.

Флоат знаходиться на [0x00000340].

:> pff @ [0x00000340] 0x00004000 = 9.32830524e-09

Як ми обговорили в останньому урокі, не хвилюйтеся, що флоат не дуже точний, оскільки ця машина x64. Що важливо побачити, це значення 0x00004000.

У нашому останньому урокі ми також пояснили, як працює Pico щодо флоатів. Давайте переглянемо деякі основи.

0x3ff00000 = 1.000000 0x3ff00001 = 1.000001 0x3ff00002 = 1.000002... 0x3ff0000f = 1.000015 0x3ff00010 = 1.000016 0x3ff00011 = 1.000017
etc...

Давайте змінимо на 1.000000 наступним чином.

Наш мікроконтролер має малендійну архітектуру, тому якщо ми хочемо змінити наш 40.5 на 1.0, нам потрібно помістити цю вартість у зворотньому порядку байтів, тому...

0x3ff00000

Нам потрібно...

0x0000f03f

Отже, нам потрібно змінити значення на наступному місці.

wx 0x0000f03f @ 0x00000340

Усі, що залишилося зробити зараз, це вийти і перетворити нашу .elf на .uf2!

./elf2uf2/elf2uf2 0x05_float.elf 0x05_float.uf2

Під'єднайте Pico і переконайтеся, що натисніть кнопку BOOTSEL або використовуйте налаштування, які я надав у частині 2.

cp 0x05_float.uf2 /Volumes/RPI-RP2

Давайте побачимо!

screen /dev/tty.usbmodem0000000000001

АХА!

1.000000
1.000000
1.000000
1.000000
1.000000
1.000000
1.000000
1.000000
1.000000
1.000000
1.000000
1.000000

Тут ми змінили значення на 1.000000 і дали 1 секунду, щоб воно збереглося.

У наступному урокі ми обговоримо тип даних double.

results matching ""

    No results matching ""