1

おそらく非常に初心者の質問ですが、それを機能させる方法に本当に興味があります。

私は次のアセンブリコードを持っています ( here、 rename() の例から大いにインスピレーションを得ています):

[SECTION .text]
global _start

_start:
    mov             esi, msg        ; saves pointer to string to ESI
    xor             eax, eax
    mov byte        [esi+6], al     ; terminates first string with NULL char
    mov byte        [esi+13], al    ; terminates second string with NULL char
    mov byte        al, 38          ; syscall number (38 = rename)
    lea             ebx, [esi]      ; put the adress of /tmp/a in EBX
    lea             ecx, [esi+7]    ; put the adress of /tmp/b in ECX
    int             0x80            ; syscall execution

    mov             al, 0x01        ; prepare to exit!
    xor             ebx, ebx
    int             0x80            ; exit!

[SECTION .data]
msg:            db '/tmp/a#/tmp/b#'

説明させてください: このプログラムは syscall を呼び出して、ファイルの名前をrenameに変更します。セクション .data の文字列には、ソース ファイルの名前とターゲット ファイルの名前が含まれています。/tmp/a/tmp/b

NULL を避けたいので、NULL の代わりに # を入れて実行時に変更することにしました。ただし、プログラムは SEGFAULT で終了します。.data セグメントの # 文字の書き換えに問題があるようです。私の質問は、どのように対処して機能させるべきですか? 私はそれが初心者の質問であることを知っています.おそらく私は何か非常に重要なものを見逃しています.

アドバイスをありがとう。

EDIT - アセンブルとリンクに使用されるコマンド

これはNASM用です:

nasm -f elf -o ThisWorks.o ThisWorks.asm

これはリンカ用です (私は 64 ビットの Phenom II を持っていますが、32 ビットとしてビルドしていることに注意してください)。

ld -melf_i386 -o ThisWorks.aout ThisWorks.o

私がそれを実行するよりも:

./ThisWorks.aout

結果は次のとおりです。

Segmentation fault

分解

による分解ですobjdump -D ThisWorks.aout

ThisWorks.aout:     file format elf32-i386


Disassembly of section .text:

08048080 <_start>:
 8048080:   be 9c 90 04 08          mov    $0x804909c,%esi
 8048085:   31 c0                   xor    %eax,%eax
 8048087:   88 46 06                mov    %al,0x6(%esi)
 804808a:   88 46 0d                mov    %al,0xd(%esi)
 804808d:   b0 26                   mov    $0x26,%al
 804808f:   8d 1e                   lea    (%esi),%ebx
 8048091:   8d 4e 07                lea    0x7(%esi),%ecx
 8048094:   cd 80                   int    $0x80
 8048096:   b0 01                   mov    $0x1,%al
 8048098:   31 db                   xor    %ebx,%ebx
 804809a:   cd 80                   int    $0x80

Disassembly of section .data:

0804909c <msg>:
 804909c:   2f                      das    
 804909d:   74 6d                   je     804910c <_end+0x60>
 804909f:   70 2f                   jo     80490d0 <_end+0x24>
 80490a1:   61                      popa   
 80490a2:   23 2f                   and    (%edi),%ebp
 80490a4:   74 6d                   je     8049113 <_end+0x67>
 80490a6:   70 2f                   jo     80490d7 <_end+0x2b>
 80490a8:   62 23                   bound  %esp,(%ebx)

解決

デバッグは、そのプログラムが正常に動作することを示しましたが、名前を変更するファイルがない場合、segfault に陥ります。それ以外の場合、私のコードは期待どおりに機能します。そのために残念。

4

2 に答える 2

2

strace show の下で probram を実行します。

execve("./a.out", ["./a.out"], [/* 67 vars */]) = 0
[ Process PID=7054 runs in 32 bit mode. ]
rename("/tmp/a", "/tmp/b")              = -1 ENOENT (No such file or directory)
syscall_4294967041(0, 0x80490a3, 0, 0x804909c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) = -1 (errno 38)
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
+++ killed by SIGSEGV +++
Segmentation fault

結論:

  1. あなたの問題は、セクションの書き直しとは何の関係もありません.data。名前変更システムコールは、期待どおりに実行されます。
  2. の設定exitが正しくありません。

    それを修正するには、に変更mov al, 0x01mov eax, 0x01ます。

于 2012-04-21T20:39:15.683 に答える
1

.dataシェルコードを作成していると仮定すると、シェルコードは悪用されたソフトウェアのプロセスで実行され、そこにはデータ セグメントが存在しないため (より正確には、データ セグメントのみが存在するため)、シェルコードからセグメント内の何にもアクセスできません。悪用されたプロセスの)。シェルコードにはセグメント化された構造はなく、通常は単なるバイトの線形バッファーです。いずれにせよ、シェルコードの最後にデータを挿入する必要があります。

于 2012-04-21T11:46:42.680 に答える