❤️NewStar2023
2024-3-5
| 2024-3-12
0  |  Read Time 0 min
type
status
date
slug
summary
tags
category
icon
password
newstarctf 2023是我觉得难度比0xgame要小,但是相对应的,它的广度要更大一点,每一道题目都是比较容易进行payload的,但是就是题目的类型非常非常多,导致我现在都还做不完

Week 1

随便乱搞的shellcode

收获:
  • 使用rjust将命令放在一串地址的最后部分,前面填充\x90 :这个是一个nop 指令,意思就是什么都没干

Week 2

stack_migration

notion image
收获:
  • libc.sym["system"]直接就是system函数的地址,不是相对位置

shellcode revenge

syscall调用read很容易,在执行syscall这个命令时,只要满足以下条件即可:
RAX = 0 RDI = 0 RSI = 要写入的地址 RDX = 很大的数
相当于执行了read(RDI,RSI,RDX),你就可以往RSI这个地方写很多数据。 其中,RAX是函数的调用号,没有这个,syscall不知道你要调用什么函数。以下是64位系统调用表:https://blog.csdn.net/SUKI547/article/details/103315487
 
以上是两个和汇编相关的网站
 
收获:
  • 学会了怎么直接用二进制机器码来构造shellcode,特别是在针对限制了输入范围的情况下,通过搜索上面两个网站可以得到相关的机器码
  • 主要是通过xor 来进行值的赋予,我们先从gdb中可以知晓当前的寄存器情况,发现是可以满足一个read函数的形式的,然后我们通过0x4e^0x41=0xf 0x44^0x41=0x5\x4e\x44\x4e\x44 变成了\x0f\x05\x0f\x05 (注意,这里的0f 05就是syscall的字节码)
  • 我们通过这份payload将eax变为0,将其余寄存器保存后直接进行syscall即可,进行read函数输入就没有字符的限制了,就可以直接进行shellcode注入
  • 有一个疑问就是连续两个syscall真的没有影响吗?但是确实是正常运行了,也没有输入第二次

Week 3

puts or system?

ezorw

在无法找寻二进制文件ROP的情况下,可以使用libcROP,只要知晓libc基地址,就可以将其ROP进行使用
orw 这个词,意思是指“openreadwrite”这三个函数的组成。意思就是用这三个函数来将系统中的文件泄露出来
在二进制程序被禁用了exec系统调用(称之为被sandbox,我也不知道为什么),在这个情况下是无法使用system('/bin/sh') 的,因为system函数是会使用exec系统调用的,所以我们只能使用其他方式来进行flag的找寻
shellcraft 模块,在我们想要写出orw函数的shellcode的时候,可以用shellcraft 模块构造,它生成了相关的汇编代码,然后我们使用asm() 函数,将这个汇编代码变成了二进制机器码,输入进拥有执行权限的

srop

dlresolve

Week 4

Double

这是一道很基础简单的UAF类型题,也可以说是fastbin poisoning
主要是由于有UAF的漏洞,导致可以和fastbin dup联合。这种题只需要通过修改fastbin中的fd指针,即可完成对任意地址写的实现
步骤:
  • free,但是有UAF所以我们可以改fd指针
  • 改fd指针,bin中多了一个我们想要任意写的地址
  • malloc,得到这个地址的chunk
  • 写入content
即可完成,很简单

ezheap

很经典的一道heap题,考察的是UAF
它是一个具有管理chunk的系统,add、edit、delete函数如下:
notion image
notion image
notion image
不能用poisoning的原因是因为edit函数有条件判断,必须要和一个chunk数组(这个数组是用来进行存储对应的chunk的大小)中的size相等,才能进行edit
我们发现上图中free函数只free了管理块,没有free内容块,这点可以被利用。
当我们free掉两个管理块时,如果我们在malloc一个和管理块相同的大小chunk时,就可以直接将一个管理块变成我们的内容块,这样就可以进行一开始的修改
为什么这样就可以绕过edit函数的检测了呢?因为可以在edit的时候将我们的新内容块(原管理块内容修改,将其头部对应size大小,然后再通过原管理块进行其指针修改
说起来很抽象难懂,举例子说明
一开始我们申请三个块
然后删除两个块
就会得到
notion image
notion image
可以看到我们第4个内容块的chunk就是第一个管理块
意思是我们更改第4个内容块就是把第一个管理块内容改了
然后将第一个管理块前面三个字节覆盖后,就能得到第一个内容块的地址,这个地址是mmap获取,所以可以泄露出libc地址
然后使用edit函数,参数是第4个块,由于size也没变,所以可以更改,将第一个内容块的地址变成free_hook,同时把头改为第一个块的大小,方便修改free_hook指向。再使用edit函数,参数是第1个块,将free_hook的函数指向system
然后再找个管理块改成/bin/sh,进行free就好了

god of change

这道题让我理解了unsorted bin的用法,这个bin我确实之前有点看得不是很懂,这个题涉及了一点unsorted bin的用法,还有一点关于chunk的fd和bk指针的获取技巧
这道题只有3个功能,add、del和show
notion image
notion image
notion image
同时程序保护全开
notion image
我们可以发现add函数中其实是有off-by-one的,所以是可以更改后一个chunk的大小,实现overlap。
但是我们发现这个show函数其实是要看另一个叫做byte的数组,这个数组标记heaparray中是否存在,哪怕我们更改了下一个chunk的头,将它释放成unsorted bin,也是不能show出来的(我就是卡在这里)
💡
然后看wp才知道,原来在存在unsorted bin的情况下,后续申请的小chunk是直接从unsorted bin中切割出来的,这样的话我们后续申请的chunk的开始两个8字节头都是存在main_arena的,这个技巧真好
剩下的就是直接用__free_hook了
exp如下
 
  • CTF-WP
  • GeekChallenge 20230xgame2023
    • Giscus
    • Cusdis
    Catalog