Linux-Kernel

Linux 核心 3.2 系統呼叫

  • May 19, 2017

只是試圖獲取以下程式碼的 <__execve> 的彙程式序指令,因為我想建構 shell spawn 操作碼列表:

#include &lt;stdio.h&gt;
int main()
{
    char *happy[2];
    happy[0] = "/bin/sh";
    happy[1] = NULL;
    execve (happy[0], happy, NULL);
}

Objdump 給了我這個:

8053a20:    53                      push   %ebx
8053a21:    8b 54 24 10             mov    0x10(%esp),%edx
8053a25:    8b 4c 24 0c             mov    0xc(%esp),%ecx
8053a29:    8b 5c 24 08             mov    0x8(%esp),%ebx
8053a2d:    b8 0b 00 00 00          mov    $0xb,%eax
8053a32:    ff 15 a4 d5 0e 08       call   *0x80ed5a4
8053a38:    3d 00 f0 ff ff          cmp    $0xfffff000,%eax
8053a3d:    77 02                   ja     8053a41 &lt;__execve+0x21&gt;
8053a3f:    5b                      pop    %ebx
8053a40:    c3                      ret    
8053a41:    c7 c2 e8 ff ff ff       mov    $0xffffffe8,%edx
8053a47:    f7 d8                   neg    %eax
8053a49:    65 8b 0d 00 00 00 00    mov    %gs:0x0,%ecx
8053a50:    89 04 11                mov    %eax,(%ecx,%edx,1)
8053a53:    83 c8 ff                or     $0xffffffff,%eax
8053a56:    5b                      pop    %ebx
8053a57:    c3                      ret    
8053a58:    90                      nop
8053a59:    90                      nop
8053a5a:    90                      nop

從我讀過的幾篇文章中,上面的輸出中應該有一個int 0x80。為什麼沒有一個?

3.2 核心中是否有任何關於系統呼叫如何工作的重大變化,這些變化可能會影響 3-4 年前寫的書中介紹的 shellcode 建構算法(特定寄存器載入等)?上面的轉儲看起來與“Shellcoders Handbook”或“Smash the Stack”中呈現的輸出非常不同

謝謝!

系統呼叫實現依賴於硬體(嚴重) - 請參閱關於syscalls的維基百科文章和關於kerneltrap的文章。在現代 x86 上,它似乎int 0x80已在一段時間前被新的SYSENTERet al所取代。

對我來說 __execve 看起來像這樣:

000000000040f7c0 &lt;__execve&gt;:
 40f7c0:    b8 3b 00 00 00          mov    $0x3b,%eax
 40f7c5:    0f 05                   syscall 
 40f7c7:    48 3d 00 f0 ff ff       cmp    $0xfffffffffffff000,%rax
 40f7cd:    77 02                   ja     40f7d1 &lt;__execve+0x11&gt;
 40f7cf:    f3 c3                   repz retq 
 40f7d1:    48 c7 c2 c0 ff ff ff    mov    $0xffffffffffffffc0,%rdx
 40f7d8:    f7 d8                   neg    %eax
 40f7da:    64 89 02                mov    %eax,%fs:(%rdx)
 40f7dd:    48 83 c8 ff             or     $0xffffffffffffffff,%rax
 40f7e1:    c3                      retq   
 40f7e2:    66 90                   xchg   %ax,%ax
 40f7e4:    66 2e 0f 1f 84 00 00    nopw   %cs:0x0(%rax,%rax,1)
 40f7eb:    00 00 00 
 40f7ee:    66 90                   xchg   %ax,%ax

注意syscall開頭的。函式的確切形式取決於編譯標誌和編譯程式碼的體系結構 - 請參閱gcc選項-mtune-march.

**編輯:**其他有趣的連結:

引用自:https://unix.stackexchange.com/questions/61891