汇编代码到C代码(添加指令问题)

时间:2014-10-01 06:16:16

标签: c assembly x86

因此,对于我的类项目,我获得了二进制文件,我要做的就是绕过安全认证。现在,一旦你更改二进制文件以绕过身份验证,你必须创建一个C程序,它将复制"相同的"二进制文件。现在,我一直在努力理解我获得的汇编代码转储的这个区域。

0x08048a59 <function8+54>:  mov    0x8049e50,%eax
0x08048a5e <function8+59>:  add    $0x4,%eax
0x08048a61 <function8+62>:  mov    (%eax),%eax
0x08048a63 <function8+64>:  movl   $0x8048cd4,0x4(%esp)

我对装配并不熟悉,但我发现大部分都是如此。这是我使用GDB获得的原始/整个程序集转储。

0x08048a23 <function8+0>:   push   %ebp
0x08048a24 <function8+1>:   mov    %esp,%ebp
0x08048a26 <function8+3>:   sub    $0x28,%esp
0x08048a29 <function8+6>:   movl   $0xd6a1a,-0x18(%ebp)
0x08048a30 <function8+13>:  mov    0x8(%ebp),%eax
0x08048a33 <function8+16>:  mov    %eax,-0x14(%ebp)
0x08048a36 <function8+19>:  mov    0xc(%ebp),%eax
0x08048a39 <function8+22>:  mov    %eax,-0x10(%ebp)
0x08048a3c <function8+25>:  movl   $0x0,-0xc(%ebp)
0x08048a43 <function8+32>:  mov    -0xc(%ebp),%eax
0x08048a46 <function8+35>:  mov    %eax,%edx
0x08048a48 <function8+37>:  sar    $0x1f,%edx
0x08048a4b <function8+40>:  idivl  -0x18(%ebp)
0x08048a4e <function8+43>:  imul   -0x14(%ebp),%eax
0x08048a52 <function8+47>:  imul   -0x10(%ebp),%eax
0x08048a56 <function8+51>:  mov    %eax,-0xc(%ebp)
0x08048a59 <function8+54>:  mov    0x8049e50,%eax
0x08048a5e <function8+59>:  add    $0x4,%eax
0x08048a61 <function8+62>:  mov    (%eax),%eax
0x08048a63 <function8+64>:  movl   $0x8048cd4,0x4(%esp)
0x08048a6b <function8+72>:  mov    %eax,(%esp)
0x08048a6e <function8+75>:  call   0x8048434 <strcmp@plt>
0x08048a73 <function8+80>:  test   %eax,%eax
0x08048a75 <function8+82>:  jne    0x8048a8d <function8+106>
0x08048a77 <function8+84>:  mov    $0x8048cdc,%eax
0x08048a7c <function8+89>:  mov    -0xc(%ebp),%edx
0x08048a7f <function8+92>:  mov    %edx,0x4(%esp)
0x08048a83 <function8+96>:  mov    %eax,(%esp)
0x08048a86 <function8+99>:  call   0x8048414 <printf@plt>
0x08048a8b <function8+104>: jmp    0x8048a99 <function8+118>
0x08048a8d <function8+106>: movl   $0x8048cfa,(%esp)
0x08048a94 <function8+113>: call   0x8048424 <puts@plt>
0x08048a99 <function8+118>: mov    -0xc(%ebp),%eax
0x08048a9c <function8+121>: leave  
0x08048a9d <function8+122>: ret    

到目前为止,我已设法将其转换为C:

    int function8(one, two){
        int a = 879130;
        int b = one;
        int c = two;
        int d = 0;

        d = (d / a * b * c);

        if(strcmp(b, (d + 4)) == 0){
            printf("You may enter using token %d", d);
        }
        else{
            puts("You may not enter.");
        }

        return d; 
    }

    int main(){
        int one, two = 0;
        function8(one, two); 
    }

我知道

0x08048a59 <function8+54>:  mov    0x8049e50,%eax

0x08048a63 <function8+64>:  movl   $0x8048cd4,0x4(%esp)

分别指向一个特定的地址和值(如果我错了,请纠正我),但不知道我是否必须打电话给它。如果是这样,我该如何调用该特定地址?

任何帮助将不胜感激!

万一你们需要它,这是我当前的输出,当我使用GCC创建一个二进制文件,然后运行GDB来获取转储:

0x08048434 <function8+0>:   push   %ebp
0x08048435 <function8+1>:   mov    %esp,%ebp
0x08048437 <function8+3>:   sub    $0x28,%esp
0x0804843a <function8+6>:   movl   $0xd6a1a,-0x18(%ebp)
0x08048441 <function8+13>:  mov    0x8(%ebp),%eax
0x08048444 <function8+16>:  mov    %eax,-0x14(%ebp)
0x08048447 <function8+19>:  mov    0xc(%ebp),%eax
0x0804844a <function8+22>:  mov    %eax,-0x10(%ebp)
0x0804844d <function8+25>:  movl   $0x0,-0xc(%ebp)
0x08048454 <function8+32>:  mov    -0xc(%ebp),%eax
0x08048457 <function8+35>:  mov    %eax,%edx
0x08048459 <function8+37>:  sar    $0x1f,%edx
0x0804845c <function8+40>:  idivl  -0x18(%ebp)
0x0804845f <function8+43>:  imul   -0x14(%ebp),%eax
0x08048463 <function8+47>:  imul   -0x10(%ebp),%eax
0x08048467 <function8+51>:  mov    %eax,-0xc(%ebp)
0x0804846a <function8+54>:  mov    -0xc(%ebp),%eax
0x0804846d <function8+57>:  add    $0x4,%eax
0x08048470 <function8+60>:  mov    %eax,0x4(%esp)
0x08048474 <function8+64>:  mov    -0x14(%ebp),%eax
0x08048477 <function8+67>:  mov    %eax,(%esp)
0x0804847a <function8+70>:  call   0x8048364 <strcmp@plt>
0x0804847f <function8+75>:  test   %eax,%eax
0x08048481 <function8+77>:  jne    0x8048499 <function8+101>
0x08048483 <function8+79>:  mov    $0x80485a0,%eax
0x08048488 <function8+84>:  mov    -0xc(%ebp),%edx
0x0804848b <function8+87>:  mov    %edx,0x4(%esp)
0x0804848f <function8+91>:  mov    %eax,(%esp)
0x08048492 <function8+94>:  call   0x8048344 <printf@plt>
0x08048497 <function8+99>:  jmp    0x80484a5 <function8+113>
0x08048499 <function8+101>: movl   $0x80485bd,(%esp)
0x080484a0 <function8+108>: call   0x8048354 <puts@plt>
0x080484a5 <function8+113>: mov    -0xc(%ebp),%eax
0x080484a8 <function8+116>: leave  
0x080484a9 <function8+117>: ret  

2 个答案:

答案 0 :(得分:0)

strcmp比较两个作为指针传入的字符串。代码在这里:

0x08048a59 <function8+54>:  mov    0x8049e50,%eax
0x08048a5e <function8+59>:  add    $0x4,%eax
0x08048a61 <function8+62>:  mov    (%eax),%eax
0x08048a63 <function8+64>:  movl   $0x8048cd4,0x4(%esp)
0x08048a6b <function8+72>:  mov    %eax,(%esp)
0x08048a6e <function8+75>:  call   0x8048434 <strcmp@plt>

传递两个指向strcmp的指针,这两个指针都是静态/全局数据(不是本地数据,就像你在C代码中那样)。一个是0x8048cd4(这是字符串的地址..它可能是引号中的内容:“example”)。另一个是指针加载+ 4,它被解除引用。我建议:(1)查看这些地址以查看存储在其中的内容,以及(2)如果您对程序集指针的追逐感到困惑,请尝试编写调用strcmp并查看生成的程序集的简单C程序。

祝你好运。

答案 1 :(得分:0)

这是将strcmp称为drivingon9指向的部分。

0x08048a59 <function8+54>:  mov    0x8049e50,%eax
0x08048a5e <function8+59>:  add    $0x4,%eax
0x08048a61 <function8+62>:  mov    (%eax),%eax
0x08048a63 <function8+64>:  movl   $0x8048cd4,0x4(%esp)
0x08048a6b <function8+72>:  mov    %eax,(%esp)
0x08048a6e <function8+75>:  call   0x8048434 <strcmp@plt>

strcmp的结果值将存储在寄存器EAX中。 这就是为什么我们在下面的代码中有一个测试eax,eax:

0x0804847f <function8+75>:  test   %eax,%eax
0x08048481 <function8+77>:  jne    0x8048499 <function8+101>
0x08048483 <function8+79>:  mov    $0x80485a0,%eax
0x08048488 <function8+84>:  mov    -0xc(%ebp),%edx

测试eax,eax测试eax寄存器是否等于0。

我不确定代码的哪一部分可以让你做你想做的事,但你可以尝试更改行

0x08048481 <function8+77>:  jne    0x8048499 <function8+101>

并将指令更改为je(JUMP IF EQUAL)或英语跳跃(JMP)