Частина 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
У наступному урокі ми навчимося хакувати цей дуже простий байнері.