2016-05-06 9 views
0

64bit AsmでSecurity Tubeのexecveチュートリアル(http://hackoftheday.securitytube.net/2013/04/demystifying-execve-shellcode-stack.html)を模倣しようとしています。バスエラーがどこから来ているのか分かりません。私はGDBのアプリケーションを踏みとどったが、エラーは私がフレーム外になるまで起きなかった。誰かが何が起こっているか知っているなら、私はあなたから聞くのが大好きです。ExecveのOSX x86_64のバスエラー

.section __DATA,__data 
.section __TEXT,__text 
.globl _start 
_start: 
    xor %rax, %rax 
    push %rax 
    movabsq $0x68732f6e69622f2f, %rdi 
    push %rax 
    mov %rsp, %rsi 
    push %rdi 
    mov %rsp, %rdx 
    mov $0x2000059, %rax 
    syscall 
+0

、 'push'は、32ビットの符号が即時に拡張して、64ビットから64ビットモードになっています。だから実際にスタック上に '2f 2f 62 69 00 00 00 00 6e 2f 73 68 00 00 00 00'となってしまいます。代わりに 'movabsq $ 0x68732f6e69622f2f、%rax;を試すことができます。 push%rax' – Jester

+0

ありがとう@Jester。しかし、まだバスのエラーを取得します。あなたの指示を反映するためにコードを更新します。 – JLegendre

+1

'rdi'をロードしましたが、' rax'をプッシュしましたか? – Jester

答えて

2

以下がより良い動作するはずですが、私はテストにOSXを持っていない。一つには

.globl _start 
_start: 
    xor %edx, %edx     ; NULL for env 
    movabsq $0x0068732f6e69622f, %rax ; /bin/sh<0> 
    push %rax 
    mov %rsp, %rdi     ; filename 
    push %rdx       ; NULL for argv terminator 
    push %rdi       ; argv[0] = filename 
    mov %rsp, %rsi     ; argv 
    mov $0x200003b, %eax    ; I think 59 is decimal 
    syscall 
+0

これはうまくいった!ありがとうございました! – JLegendre

+0

私は間違っている部分を絞り込むためにコードを使いました。私はあなたが '%rdxを押した 'ことに気づいた(7行目)。そのプッシュの目的は何ですか?私がそれをコメントアウトすると、バスエラーが戻ってきたことに気づいた。 – JLegendre

+3

@JLegendre: 'sys_execve'は、argv []やenvp []がヌル終端の文字ポインタ配列になる必要があるためです。 NULLポインタの終了がなければ、カーネルは配列の終わりがどこであるかを知らない。配列の長さはパラメーターとして渡されないため、NuLLターミネーターは処理中に配列の終わりを識別する方法です。文字の配列がNUL(0)文字で終わる理由と似ています - 文字列の終わりが実際の長さを知らされずに見つかるようになる前に –

関連する問題