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