gpt4 book ai didi

c - 如何使用libc函数在c中模拟asm代码?

转载 作者:太空宇宙 更新时间:2023-11-04 02:51:49 25 4
gpt4 key购买 nike

测试平台为 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 函数...这太乏味了......

所以我的问题是我走的路对吗..?这个问题有没有更好的解决方案?

谁能帮我点忙..?谢谢!

最佳答案

如果您正在模拟的代码在二进制文件中有足够的调试信息,您知道函数调用是 libc 调用,那么您可以使用 keshlam 所说的处理器调用约定来模拟这些调用。您可能必须解析格式以确定预期的参数数量,然后对于每个参数,您必须模拟该参数,获取您正在模拟的 ram 或寄存器,将它们转换为模拟器中的变量,然后进行 libc 调用。

不关心可能更容易,根本不关心 libc 调用,只关心系统调用,int 80 等。 printf 和任何其他这些调用只是您模拟的更多机器代码,然后最终它会进行较低级别的系统调用,输入一个字符串或输出一个字符或写入文件或其他任何内容,然后您模拟它。

a=7;
printf("Hello %d\n");

就您而言,是一堆在 ram 和寄存器、alu 操作、加载、存储等上运行的机器指令。然后最终您将得到一个输出“Hello 7\n”) 的系统调用,或者您会得到一系列的系统调用 output H output e output l output l output o output ' ' output 7 output CR,output LF。而您只需处理该系统调用...

关于c - 如何使用libc函数在c中模拟asm代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21340677/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com