Частина 9 - Дебагування 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 двічі, щоб потрапити до хорошого дебагерського перегляду.

Ми починаємо встановлювати значення повернення головної частини програми.

push {r4, lr}

Ми викликаємо стандартну I/O ініціалізацію.

bl sym.stdio_init_all

Далі ми завантажуємо форматний модифікатор %d у r4.

ldr r4, [0x0000033c]

Ми можемо перевірити це.

:> psz @ [0x0000033c]
%d

Далі ми завантажуємо int значення '40' у r1, яке є 0x28 у шістнадцятковій системі числення.

movs r1, 0x28

Ми можемо перевірити це.

:>? 0x28
int32   40
uint32  40
hex     0x28
octal   050
unit    40
segment 0000:0028
string  "("
fvalue: 40.0
float:  0.000000f
double: 0.000000
binary  0b00101000
ternary 0t1111

Далі ми переміщаємо форматний модифікатор у r0.

movs r0, r4 

Далі ми здійснюємо довгий стрибок до printf обгортки і викликаємо її.

bl sym.__wrap_printf

Далі ми переміщаємо 250 у десятковій системі числення або 0xfa у шістнадцятковій системі числення у r0.

movs r0, 0xfa

Далі ми переміщаємо 250 у десятковій системі числення, яке ми знаємо, що після двох логічних зміщень вліво буде 1,000 у десятковій системі числення або 0xfa у шістнадцятковій системі числення у r0.

lsls r0, r0, 2

Далі ми викликаємо функцію sleep_ms.

bl sym.sleep_ms

Далі ми продовжуємо цикл while до нескінченності.

b 0x328

У наступному урокі ми навчимося хакувати цей дуже простий байнері.

results matching ""

    No results matching ""