1

私は最近、Aleph Oneが楽しみと利益のためにスタックを壊しているのを読み、「TheShellcoder'sHanbook」を見てきました。私は次のアセンブリコードをいじっていました:

section .text
    global _start

_start:
    jmp short GotoCall

shellcode:
    pop ebx
    xor eax, eax
    mov [ebx + 7], al
    mov [ebx + 8], ebx
    mov [ebx + 12], eax
    mov al, 0x0b
    lea ecx, [ebx + 8]
    lea edx, [ebx + 12]
    int 80h

    xor eax, eax
    mov al, 0x01
    int 80h

GotoCall:
    Call shellcode
    db '/bin/shJAAAAKKKK'

GDBを使用してウォークスルーすると、次のアドレスに書き込もうとするたびにセグメンテーション違反が発生します。

mov [ebx + 7], al

ただし、これを実行すると、segfaultを実行せずにルートシェルをポップできます。

section .text
    global _start

_start:
    xor eax, eax
    push eax
    push 0x68732f2f
    push 0x6e69622f
    mov  ebx, esp
    push eax
    push ebx
    mov  ecx, esp
    xor  edx,edx
    mov  al, 0xb
    int  80h

基本的に、彼らは同じことをしています(はい、実際にはそうではないことはわかっていますが、両方でルートシェルをポップしようとしています)。私はOpenSuse11.4で実行しており、学習目的でスタックランダム化(ASLR)をオフにしています。何か案は?

4

1 に答える 1

4

通常は書き込み不可db '/bin/shJAAAAKKKK'のセクションに文字列を配置しました。.text

に入れると.data、クラッシュはなくなりますが、別の方法で文字列のアドレスを取得する必要があります。 CALLinの直後には続きませんGotoCall

于 2011-11-14T04:12:18.400 に答える