2014-10-01 87 views
0

所以对于我的类项目,我得到一个二进制文件,我必须做的是绕过安全认证。现在,一旦更改二进制文件以绕过认证,您必须创建一个C程序来复制“相同”二进制文件。现在,我一直在努力去理解我获得的汇编代码转储的这个领域。汇编代码到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 <[email protected]> 
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 <[email protected]> 
0x08048a8b <function8+104>: jmp 0x8048a99 <function8+118> 
0x08048a8d <function8+106>: movl $0x8048cfa,(%esp) 
0x08048a94 <function8+113>: call 0x8048424 <[email protected]> 
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 <[email protected]> 
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 <[email protected]> 
0x08048497 <function8+99>: jmp 0x80484a5 <function8+113> 
0x08048499 <function8+101>: movl $0x80485bd,(%esp) 
0x080484a0 <function8+108>: call 0x8048354 <[email protected]> 
0x080484a5 <function8+113>: mov -0xc(%ebp),%eax 
0x080484a8 <function8+116>: leave 
0x080484a9 <function8+117>: ret 
+1

其安全性是它,你'重试克要破解? – 2014-10-01 06:49:33

+0

这是一个班级项目。基本上,我们必须通过改变二进制文件来改变跳转不等于跳转,然后创建一个C程序来创建“相同”二进制文件。 – jetmas 2014-10-01 06:54:24

+0

评论每一行,我会评论你的问题。 – 2014-10-01 07:39:26

回答

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 <[email protected]> 

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

祝你好运。

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 <[email protected]> 

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如果相等)或incondicional跳跃(JMP)