目标文件:
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 打开。
点击此处去生成符号表 (.riz)
接下来就需要再次用 ida 装载我们要恢复符号表的程序。
部分函数恢复成功。但是因为两个程序的内核版本不同,或者将 rizzo 识别能力有限的原因。没有恢复的很好,但是确实也是恢复了。
特殊状况:arm 的栈底指针不一定为 R11, 也有可能是其他寄存器。
因为我自己编出的程序的栈底指针为 R7