将大会翻译成C程序

时间:2015-11-10 04:40:51

标签: c assembly binary gdb hex

以下是汇编代码:

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。所以这就是我到目前为止的解释:

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

到目前为止,任何人都看到任何瑕疵?

此时,我已经陷入困境,而我所尝试的并没有奏效。十进制的0x804a170是134521200.但是传递给它的函数是期待字符串。那么0x804a170应该转换为字符串?那个字符串是输入应该等于什么?

我不知道。如果有人看到任何瑕疵或者可以给我指针,我们非常感激!

2 个答案:

答案 0 :(得分:2)

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

这本身不是字符串。

答案 1 :(得分:0)

评论代码:

        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