XYCTF 2024
2024-5-1
| 2024-10-13
0  |  Read Time 0 min
type
status
date
slug
summary
tags
category
icon
password
虽然中途有这不少的问题,还是磕磕碰碰复现一下

baby_gift

这个题是用时较久的题所以最先拿出来进行复盘

反汇编代码

题目是这样:
notion image
汇编代码:
notion image
 
其中gift是这样
notion image
可以看出来,getInfo函数是有一个栈溢出,可以溢出0x20字节
其中gift中的功能是说可以将[rbp-0x8]的地方变成rdi的值。

思路

初看

做题的时候我觉得对gift的使用应该是:
  • 我们可以修改rbp和返回地址,将返回地址修改为:0x4012a0,就可以修改掉rdi的值,作为一个参数,然后让其再返回到system之类的函数,就可以直接拿到shell了
但是后面我发现首先还要泄露libc,不知道怎么泄露,卡了很久没有思路,因为没有程序没有关于参数的ROP链,同时也没有除printf之外的输出(当时没有反应过来printf是有用的)

细看

再然后第二天看的时候,突然发现可以先不修改rdi,因为[rbp-0x20]地址中的值最开始是我们输入的passwd ,同时gift函数执行完后其实也没有将rdi改变,所以直接将返回地址改为printf 函数可以造成格式化字符串漏洞
但是这就遇到了一个问题,不知道为什么printf("%27$p")输出结果

printf

很奇怪,问了其他师傅才知道,原来printf函数中有这样的一份判断:
不知道是不是所有版本的printf函数都有这个判断,有时间去看看源码。这个判断的意义是检查al寄存器,查看printf的参数量是多少
notion image
对于用 varargs 或 stdargs 的函数,%al 当作隐藏参数使用,表明 SSE 寄存器的用量。%al 的内容不必和寄存器用量吻合,但是一定要是 SSE 寄存器用量的一个上界而且落在开区间 0-8 里。
SSE: 8个128位寄存器(从xmm0到xmm7)
但是这些只是简要一提,主要涉及就是对printf 函数使用的时候需要将eax归零,不然会进入奇怪的逻辑中

exp

fmt

notion image
这个题有点意思,它涉及fmt,但不是用的printf来进行fmt,而是用了scanf,但是原理是一模一样的
💡
fmt的原理可以在网上多查查,主要就是由于字符串指针内存可以随便修改,且每当一个%号变量出现就要去寻找是否有相关变量(尤其是在栈中寻找),这就导致了可以进行任意写的漏洞。对栈中的地址指向的值进行修改

低版本的exit_hook

其中也涉及到了exit_hook的知识:
_rtld_global是GNU C Library (glibc) 中动态链接器用于维护自身状态的一个全局结构体。
在exit的调用中,调用链是exit __run_exit_handlers _dl_fini__rtld_lock_lock_recursive 或者__rtld_lock_unlock_recursive
这里就不多赘述了,给出exp
收获:
  • ld基地址与libc基地址偏移量相同(起码在2.31为止是这样)
  • __rtld_lock_lock_recursive 指针地址为__rtld_global+0xf08 ,当修改了这个指针为任意地址,就可以将exit函数hook指向其他地方(但是2.34之后就用不了了)
 
涉及exit_hook的链接在这里

simple_srop

notion image
notion image
其实SROP的功能就是一长串ROP链的功能,只不过它在没有ROP的时候也可以进行使用,主要是依靠syscall
这道题是利用了SROP,在没有输出函数,没有ROP的时候,让它成为主角,特别是当SROP中的rsp被设置为下一个SROP的地址的时候,这就达成了SROP链
SROP这里也有详细的参考
在可以使用SROP链的时候,他是一个非常方便的trick
先给出exp
可以看出虽然弄出来的段很多,但是从逻辑上来看SROP能达成的效果的利用相当的简便(在你弄懂了的情况下)

fastfastfast

这个题真的卡了我好久,谢谢ret2o.O师傅的提点
打开ida
notion image
经典的堆题,接下来看看漏洞
notion image
UAF漏洞,同时add函数中
notion image
可以看出是只有fastbin的大小,这就有个问题,我们不能申请到unsorted_bin,libc基地址就很难泄露,这就卡住我了

Fastbin reverse into tcache

同时学到关于fastbin dup的另一种说法:Fastbin reverse into tcache
具体上就是说tcache bin的stash机制:
在tcache bin中相同长度的chunk超过7个之后,会根据大小将其放入fastbin或者是unsorted bin中,同时如果,当我们重新进行申请chunk,在tcache bin中申请结束之后,会将fastbin的其他chunk放进tcache bin中(逆序)
如下图:
notion image
申请8个之后变成:
notion image
💡
在和dup相关的构造的时候都要注意:如果你构造的fake_chunk不能有脏数据,就是说那片地址最好是直接指向的是\x00,这样被识别的时候不会引起其他的问题,不然再利用的时候扫描bin链就是会出问题

stdout

我一直对stdout这个函数不是很理解,因为这总是让我想到__IO_2_1_stdout来泄露libc基址,但是我能知道stdout地址的时候不是就直接知道libc基址了吗?不知道有无大佬可以教教我
但是这道题并没有用到这个知识,它只是利用了在bss中的stdout指针附近的地址,因为我们的show函数是这样
notion image
意思是不会因为\x00就结束输出,所以可以把后面的内容全部输出出来
只要我们将fake_chunk地址放在stdout上方:
notion image
可以看到它的后面都是0,这就很符合我们之前的要求
exp:

mips

通过这道题学会了mips的栈溢出攻击,相关的mips教程有很多,这里列两个:
相关的理论知识在上面都有,这里主要总结一下关于它的栈溢出
mips的栈溢出和x86存在不同,主要体现在ROP链的运用,因为x86中栈存在入栈和出栈操作:pushpop,但在mips中由于栈空间大小是一开始就准备好的,不存在对栈的push和pop,同时也没有ret 指令这种方便用来进行
💡
主要的是在mips中需要跳转到一个中间的ROP,用于调整寄存器的值。在这些寄存器调整完之后就可以将程序跳转到想要的内存地址进行指令的运行了

ptmalloc2 it's myheap

这个题涉及到堆风水
堆题经典的笔记题,有add、delete和show
其中add是申请0x18的管理块和内容块
notion image
delete有UAF
notion image
然后有一个后门gift:
notion image
最后,libc是2.35,这就是全部信息

解法

解法也是被ret2o.O师傅提点过
使用堆风水(说人话就是控制堆申请的位置),让申请的内容块地址是之前的管理块,这样就可以达到任意读,show出heap基地址。
再通过申请让内容块的地址被指向heap基地址,也就是tcache_perthread_struct。
通过delete和add来将要的内容写入tcache_perthread_struct,就凭空捏造了一个bin链中的chunk。再将它申请出来修改为system
notion image
notion image

ptmalloc2 it's myheap pro

这道题看的是后面的wp,只能说不愧是排名前三的队伍,这个解题思路真的厉害

原理

高版本的exit_hook:对tls_dtor_list的修改

exit__run_exit_handlers__call_tls_dtors

当程序使用exit函数退出后,会进入 __run_exit_handlers函数
__run_exit_handlers函数后,会首先判断 __call_tls_dtorsrun_dtors是否为空,如果不为空就会调用 __call_tls_dtors函数
相关示意:
  • __call_tls_dtors+10 将rbx赋值为0xffffffffffffffa8(-88)
  • __call_tls_dtors+17 将fs-88(tls_dtor_list) 赋值给rbp(这为我们的栈迁移提供了条件)
  • __call_tls_dtors+21 其实就是在判断tls_dtor_list是否为空
  • __call_tls_dtors+36 将tls_dtor_list的第一个成员变量(偏移0,8 byte)赋值给rax
  • __call_tls_dtors+40与 __call_tls_dtors+53 是对rax进行解密,先向右循环移位,再与fs+0x30上的值(一个随机数)进行异或
  • __call_tls_dtors+57 将tls_dtor_list的第二个成员变量(偏移8,8 byte)赋值给rdi
  • __call_tls_dtors+61 调用rax
 
这里给出链表结构体:

exp

  • CTF-WP
  • how2heapHgame 2024 复现
    • Giscus
    • Cusdis
    Catalog