目标文件:

typo: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=211877f58b5a0e8774b8a3a72c83890f8cd38e63, stripped

32 位 ARM 架构,静态连接。内核版本 GUN/Linux 2.6.32 | 去符号表

对于修复程序我们首先要准备一个拥有完全符号的程序,使用一些方法给他导出符号表。

因此,我们需要去编译一个与其类似的程序,用 ida 插件 rizzo,去生成其符号表内容

// 文件名: hello_arm.c
#include <stdio.h>
int main() {
    printf("Hello, ARM World!\n");
    return 0;
}

编译内容如下:

arm-linux-gnueabihf-gcc -static -march=armv7-a -mfloat-abi=hard -o myapp hello_arm.c

myapp: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, for GNU/Linux 2.6.31, BuildID[sha1]=da2d1220742527123cd7cfeb41bbc4d2facbb3d5, with debug_info, not stripped

接下来我们需要将其用 ida 打开。

image-20240510152016835

点击此处去生成符号表 (.riz)

接下来就需要再次用 ida 装载我们要恢复符号表的程序。

image-20240510152245888

image-20240510152301219

部分函数恢复成功。但是因为两个程序的内核版本不同,或者将 rizzo 识别能力有限的原因。没有恢复的很好,但是确实也是恢复了。

特殊状况:arm 的栈底指针不一定为 R11, 也有可能是其他寄存器。

​ 因为我自己编出的程序的栈底指针为 R7