【问题标题】:How to use libc function in simulating asm code in c?如何使用libc函数在c中模拟asm代码?
【发布时间】:2014-02-15 22:04:21
【问题描述】:

测试平台为 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 函数与任何其他函数?
  • @n.m.对不起,我犯了一个错误......我只能处理没有参数的函数调用......
  • 为什么需要知道参数是什么?汇编语言不关心参数。它只知道一堆寄存器和一堆存储单元。 “参数”是所说的一些寄存器和单元格。 CPU 不在乎。只需执行程序员手册中关于每条指令的内容即可。
  • 祝你好运,使用优化编译器,它可能会优化掉许多操作,以在嵌套函数调用或相互紧随的调用的上下文中保持堆栈“正常”。我非常怀疑在这样的环境中猜测每个函数的参数数量是可能的。
  • @n.m.他可能希望他的模拟器在遇到“调用某事”指令时从堆栈中拉出参数,调用“真正的”libc 函数,然后返回到模拟器。

标签: c assembly compiler-construction compilation


【解决方案1】:

要直接调用库函数,您必须知道它们的参数是什么以及调用约定是什么,因此您可以在模拟堆栈中从后者中提取前者,调用函数,然后调整您的模拟堆栈以反映该调用的结果。

【讨论】:

    【解决方案2】:

    如果您正在模拟的代码在二进制文件中有足够的调试信息,您知道函数调用是 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。而您只需处理该系统调用...

    【讨论】:

    • 您好 dwelch,再次感谢您的大力帮助!好吧,基本上汇编代码是从二进制反汇编(如 bzip、gzip 和其他......)所以看来我 必须 处理 libc 调用...... :( 我想我必须处理他们一一...再次,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 2019-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多