2012-04-18 10 views
0

i386:x86_64で作業しています。シェルを起動する簡単なプログラムを作成しています。ベローは私の集会です。セグメンテーションフォールトアセンブリi386:x86_64

.section .data 
.section .text 
.globl _start 

_start: 
    xor %rax, %rax 
    mov $70, %al 
    xor %rbx, %rbx 
    xor %rcx, %rcx 
    int $0x80 

    jmp ender 

starter: 
    pop %rbx 
    xor %rax, %rax 
    mov %al, 0x07(%rbx) 
    mov %rbx, 0x08(%rbx) 
    mov %rax, 0x0c(%rbx) 
    mov $11, %al 
    lea 0x08(%rbx), %rcx 
    lea 0x0c(%rbx), %rdx 
    int $0x80 

ender: 
    call starter 
    .string "/bin/sh" 

問題は、セグメント化エラーが発生し続けていることです。私は推測を取り、それがマークされているアドレスがあることを言うつもりです

0000000000400078 <_start>: 
    400078: 48 31 c0    xor %rax,%rax 
    40007b: b0 46     mov $0x46,%al 
    40007d: 48 31 db    xor %rbx,%rbx 
    400080: 48 31 c9    xor %rcx,%rcx 
    400083: cd 80     int $0x80 
    400085: eb 1b     jmp 4000a2 <ender> 

0000000000400087 <starter>: 
    400087: 5b      pop %rbx 
    400088: 48 31 c0    xor %rax,%rax 
    40008b: 88 43 07    mov %al,0x7(%rbx) 
    40008e: 48 89 5b 08    mov %rbx,0x8(%rbx) 
    400092: 48 89 43 0c    mov %rax,0xc(%rbx) 
    400096: b0 0b     mov $0xb,%al 
    400098: 48 8d 4b 08    lea 0x8(%rbx),%rcx 
    40009c: 48 8d 53 0c    lea 0xc(%rbx),%rdx 
    4000a0: cd 80     int $0x80 

00000000004000a2 <ender>: 
    4000a2: e8 e0 ff ff ff   callq 400087 <starter> 
    4000a7: 2f      (bad) 
    4000a8: 62      (bad) 
    4000a9: 69      .byte 0x69 
    4000aa: 6e      outsb %ds:(%rsi),(%dx) 
    4000ab: 2f      (bad) 
    4000ac: 73 68     jae 400116 <ender+0x74> 

(悪い):私はobjdumpの-D my_progを使用すると、出力はこの...

分解セクション.textのですsegフォルトが発生しています。私はそれが割り当てられていないmemへのmemアクセスを必要とするため、これが起こっていることを知っています。私は何をすべきか本当にわからない。私はLinuxを実行しています。

ありがとうございました!

+0

文字列をテキストセクションに入れたのはなぜですか? –

+0

私はチュートリアルに従っていて、コードを貼り付けてコピーしました。それは問題になる可能性があります。 –

答えて

2

メモリのコード(。テキスト)領域にデータを書き込もうとしているため、セグメンテーションが失敗します。実行可能コード領域は、ほとんどの場合、読み取り専用としてマークされます。

ここにあなたのコードといくつかのコメントがあります。

.section .data 
.section .text 
.globl _start 

_start: 
    xor %rax, %rax 
    mov $70, %al 
    xor %rbx, %rbx 
    xor %rcx, %rcx 
    ; call sys_setreuid(0,0) 
    int $0x80 

    jmp ender 

starter: 
    ; take the return address off the stack 
    ; rbx will point to the /bin/sh string after the call instruction 
    pop %rbx 
    ; zero rax 
    xor %rax, %rax 
    ; save a zero byte to the end of the /bin/sh string (it's 7 characters long)... 
    ; (it will segfault here because you're writing to a read-only area) 
    mov %al, 0x07(%rbx) 
    ; ...followed by a pointer to the string... 
    mov %rbx, 0x08(%rbx) 
    ; ...followed by another zero value 
    mov %rax, 0x0c(%rbx) 
    ; setup the parameters for a sys_execve call 
    mov $11, %al 
    lea 0x08(%rbx), %rcx 
    lea 0x0c(%rbx), %rdx 
    int $0x80 

    ; what happens when int 0x80 returns? 
    ; you should do something here or starter will be called again 

ender: 
    call starter 
    .string "/bin/sh" 

その他の問題があります。検討:

mov %rbx, 0x08(%rbx) 
mov %rax, 0x0c(%rbx) 

%のRBXは、8バイトの値であるが、コードは(0x0Cの-0×08 = 4)それを空間の価値4つのバイトを与えます。 有効にしたい場合は、文字列を.data領域に移動し(その後にスペースを入れて)、コードを変更して64ビットにする必要があります。

+0

ありがとう、私はかなりのPC用のアセンブリに新しいです。これは役に立ちます。 –

関連する問題