我正在练习对C语言的目标文件进行逆向工程。假设我有一个C程序的目标文件:
#include <stdio.h>
#include <string.h>
int main (int argc, char ** argv) {
char * input = argv[1];
int result = strcmp(input, "text_to_compare");
if (result == 0) {
printf("%s\n", "text matches");
}
else {
printf("%s\n", "text doeesn't match");
}
return 0;
}
如果目标文件是使用-g标志和x86-64架构编译的,我将如何从目标文件中找到“text_to_compare”?
1条答案
按热度按时间twh00eeo1#
在二进制文件上运行
strings
将在文件中显示四个或更多可打印字符的所有序列。对于简单的文件,这可能足够了,但对于较大的文件,您可能会以大量误报告终。例如,使用gcc
编译代码并在生成的二进制文件上运行strings
将返回295个结果。我们可以先使用
objdump
命令来反汇编示例文件中的代码:查看反汇编,我们可以看到对偏移量为40115d的
strcmp
的调用:如果我们看一下前面的几行,我们可以看到一条指令正在将数据从这个部分之外的地址(
0x402010
)移动:如果我们查看
objdump -h a.out
的输出,我们会发现该地址福尔斯.rodata
部分(我们正在查找给定地址位于从VMA列中的地址开始的内存块中的部分):我们可以使用
objcopy
命令提取该部分中的数据:我们可以看到地址为
0x402010
的字符串是text_to_compare
。