2014-10-01 95 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)