测试平台是Linux 32位。
所以基本上我试图用c,
来模拟/翻译汇编代码目前我的代码可以使用系统调用处理小的汇编代码(int 80) 和其他人..
但是当我想要翻译libc函数调用部件时, 我很困惑..
以下是一个例子:
section .data
.LC0:
message db "this is a test %d %d %f ", 10
section .text
movl $1, 32(%esp)
movl $1, 36(%esp)
movl $1, 40(%esp)
movl $1, 44(%esp)
movl 44(%esp), %eax
movl %eax, 16(%esp)
movl 40(%esp), %eax
movl %eax, 12(%esp)
movl 36(%esp), %eax
movl %eax, 8(%esp)
movl 32(%esp), %eax
movl %eax, 4(%esp)
movl $.LC0, (%esp)
call printf
我很困惑如何翻译成这样的东西:
unsigned int v_ebp[100000];
unsigned int v_esp = v_ebp + 9999;
........
printf(.LC0, (unsigned int)(v_esp - 4), (unsigned int)(v_esp - 8), (unsigned int)(v_esp - 12));
我在想一个相对“愚蠢”的方法是模拟printf分析的方式 第一个参数,找出要求使用多少变量(一般应该等于%xx的数量),然后获取它们 在模拟堆栈上一个接一个地
这似乎是可行的,但如果我选择这种方式, 我必须做类似的事情 几乎所有的汇编代码中的libc函数...... 这太乏味了......
所以我的问题是我在正确的道路上......? 在这个问题上有更好的解决方案吗?
任何人都能给我一些帮助..?谢谢!
答案 0 :(得分:1)
要直接调用库函数,您必须知道它们的参数是什么以及调用约定是什么,因此您可以在模拟堆栈中从后者中提取前者,调用函数,然后调整模拟堆栈以反映该调用的结果。
答案 1 :(得分:1)
如果您正在模拟的代码在二进制文件中有足够的调试信息,您知道函数调用是libc调用,那么您可以使用keshlam所说的那个处理器的调用约定来模拟这些调用。您可能必须解析格式以确定预期的参数数量,然后对于每个参数,您必须模拟该参数,使用ram或您正在模拟的寄存器将这些转换为模拟器中的变量,然后进行libc调用。
可能更容易不关心,根本不打扰libc调用,只有系统调用,int 80等。 printf和其他任何这些调用只是你刚才模拟的更多机器代码,然后它最终会进行一个较低级别的系统调用,放一个字符串或输出一个字符或写入文件或其他什么,然后你模拟它。
a=7;
printf("Hello %d\n");
就你而言,是一堆机器指令在ram和寄存器,alu操作,加载,存储等操作。然后最终你要么系统调用输出“Hello 7 \ n”)或者你将获得一系列系统调用输出H输出e输出l输出l输出o输出''输出7输出CR,输出LF。你只需要处理系统调用......