【问题标题】:Translating Assembly to C program将汇编翻译成 C 程序
【发布时间】:2016-02-10 22:02:08
【问题描述】:

这是我正在查看的汇编代码:

push   %ebp
mov    %esp, %epb
sub    $0x18, %esp
movl   $0x804a170, 0x4(%esp)
mov    0x8(%ebp), %eax
mov    %eax, (%esp)
call   0x8048f9b <strings_not_equal>
test   %eax, %eax
je     0x8048f78 <phase_1+34>
call   0x8049198 <failed>
leave
ret

目标是为程序集的函数提供正确的输入,以便跳转到函数phase_1+34。所以这是我到目前为止的解释:

前两行是函数的设置代码。第一个 'sub' 行通过向下移动 '%esp' 来分配空间以存储调用 strings_not_equal 函数的参数。我认为传递给strings_not_equal 的两个参数是0x804a170 和输入值。我假设 &lt;strings_not_equal&gt; 将返回 0 如果传递的字符串 相等。然后je 检查%eax &amp; %eax 是否为零,这只会在%eax = 0 时发生。所以基本上,输入字符串似乎必须等于0x804a170

到目前为止,有人发现任何缺陷吗?

此时,我被卡住了,我尝试过的方法不起作用。十进制的0x804a170 是 134521200。但是传递给它的函数需要 strings。那么0x804a170应该转换成字符串吗?那个字符串是输入应该等于什么?

我不知道。如果有人看到任何缺陷或可以给我指点,非常感谢!

【问题讨论】:

    标签: c assembly binary gdb hex


    【解决方案1】:

    注释代码:

            push   %ebp                     ;function name is apparently phase_1
            mov    %esp, %epb
            sub    $0x18, %esp              ;allocate 24 bytes from stack
            movl   $0x804a170, 0x4(%esp)    ;[esp+4] = pointer to literal, static, or global string
            mov    0x8(%ebp), %eax          ;[esp  ] = [ebp + 8] (this and next instruction)
            mov    %eax, (%esp)
            call   0x8048f9b <strings_not_equal>
            test   %eax, %eax
            je     0x8048f78 <phase_1+34>   ;probably branches to next instruction after ret
            call   0x8049198 <failed>
            leave
            ret
            ...                             ;padding here, nop (0x90) or int 3 (0xcc) are common 
    phase_1 + 34 ...                        ;continuation of phase_1
    

    【讨论】:

      【解决方案2】:

      0x804a170 是一个指针,指向运行时认为是“字符串”的东西。由于您没有提供有关它是什么的信息,我们只能猜测它是指向第一个字符的指针,后跟更多字符并以 0 结尾,或者它是指向第一个字符的指针,前一个 1/2 /4/8 字节将长度描述为整数。

      它本身不是一个字符串。

      【讨论】:

      • 啊当然。所以在 gdb 中我可以让他们使用x 命令来检查内存位置0x804a170,它返回0x20656854。然后,当您说“前 1/2/4/8 个字节将长度描述为整数”时,我对您的意思感到困惑。以前是什么?在那个记忆位置之前?
      • 如果0x804a170 指向的是0x20656854,那么这应该是字符串中的第一个字符,是吗?但是这么长的十六进制数字如何转换为单个字符?
      • @jphollowed - 他的意思是一个 pstring(类似帕斯卡的字符串)。如果这是一个 pstring,则 0x804a170 指向字符串中字符数的计数。计数的大小可以是一个字节,一个短的(16 位),一个长的(32 位),......但是,由于您看到 0x20656854(反转字节,因为它是一个小端序的 32 位整数),那么它是最可能是 ac 类型字符串的前 4 个字节(无计数)=“The”。
      • 这也是我得到的,“The”,但它也不起作用。我是否正确地解释了它想要我做的只是输入一个等于0x20656854 的字符串?
      • @rcgldr 答案是“明天会更好。”。如果在使用x 0x804a170 之后我再使用x 0x804a174 我会看到接下来的 4 个字符,并继续直到句子的结尾。但这真的是运气。我怎么知道要继续检查多少内存地址?仅仅因为它应该填补了为函数调用分配的 18 字节宽的空白吗?
      猜你喜欢
      • 2015-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-17
      • 1970-01-01
      相关资源
      最近更新 更多