簡體   English   中英

匯編代碼到C代碼(添加指令問題)

[英]Assembly Code to C Code (Add Instruction Issues)

因此,對於我的課堂項目,我得到了一個二進制文件,而我要做的是繞過安全身份驗證。 現在,一旦更改二進制文件以繞過身份驗證,就必須創建一個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  

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(這是字符串的地址。它可能用引號引起來:“示例”)。 另一個是指針加載+ 4被取消引用。 我建議:(1)查看這些地址以查看存儲在其中的地址,以及(2)如果您對程序集指針追逐感到困惑,請嘗試編寫調用strcmp的簡單C程序並查看生成的程序集。

祝好運。

這是按照driveon9所指稱的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的結果值將存儲在寄存器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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM