Linuxカーネル3.2システムコール[閉じる]

Linuxカーネル3.2システムコール[閉じる]

opcodeリストを生成するためのシェルを構築したいので、以下のコードの<__execve>のアセンブリ命令を取得しようとしています。

#include <stdio.h>
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 <__execve+0x21>
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

私が読んだいくつかの記事では、次のようなものが必要です。整数 0x80上記の出力はどこかにあります。なぜ一つもないのですか?

3.2 3〜4年前に書かれた本に記載されているシェルコード構築アルゴリズム(特定のレジスタのロードなど)に影響を与える可能性があるシステムコールの仕組みに関して、カーネルに重要な変更はありますか?上記のダンプは、「Shellcoders Handbook」または「Smash the Stack」で提供された出力とは非常に異なって見えます。

ありがとうございます!

ベストアンサー1

システムコールの実装はハードウェアに大きく依存します。 Wikipediaの記事をご覧ください。システムコールそして薬カーネルトラップ。最新のx86では、int 0x80最新バージョンのために捨てられたようです。SYSENTER他。電子。

私にとって、__execveは次のとおりです。

000000000040f7c0 <__execve>:
  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 <__execve+0x11>
  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

編集する:他の興味深いリンク:

おすすめ記事