💪SCU ctf-pwn部分
2024-3-4
| 2024-10-8
0  |  Read Time 0 min
type
status
date
slug
summary
tags
category
icon
password

nc

发现进行了stdoutstderror的修改,直接进行exec 1>&0 虽然是写到了标准输入,但是标准输入也是可以当成一种回显,没有问题

nc2

得到本地文件,通过对其进行分析,直接用gdb对其进行动态调试,按照提示的做法,对syscall进行跟踪,就能得到payload
 

新五子棋

这个五子棋可以通过对它的棋盘边界之外的地方进行调用,当user进行下棋的时候会将内存中值为-1的内存处的值变为0
同时,对于胜利的逻辑而言:这个dword_4020dword_4040数组,可以看出其中是有-1的,也就是说我们通过这个地方,进行将-1的数组值变为0,这样就能够直接将其胜利逻辑进行修改,变为0,这样的话逻辑就变为了:
对于其dword_4020dword_4040同时为0的值的时候,如果棋盘中有一个地方值为0,那么就会连续5次对其进行判断通过,结果就是胜利,这样的话就满足的拿到flag的后门条件

fmt

notion image
这个题我觉得有点怪,不知道为什么不能用ogg,我试着用ogg做了一个白天,但是总是会报各种各样的问题。
(不过在这个题中我才反应过来原来read函数如果没有输入满的话,是会一直等待输入的,所以他们封装了一个外部的函数,这样回车就可以被当作结束符了)
这个题目主要考察的就对于如何多次使用fmt的做法,答案也比较经典:就是构造循环
我们可以发现在栈末尾是有着一个指针的,这个指针所处位置正好就是栈中的一个地址
notion image
对这个位置进行修改,将其最后一位覆盖掉,就可以进行相当于修改其指针指向,如果将它修改到指向返回地址的位置,我们就可以进行相应的操作了,也就是把返回地址修改了
接着就是进入了第二、三次的修改
第二次修改和第三次修改因为直接使用了栈迁移,将rbp的值迁移为了前面我们输入的字符串的地址,同时因为fmt退出后main函数还退出,所以有两个leave指令,制作栈迁移即可
 

ret2dl

考察了ret2dl,这个题可以看作一个模板题,就是调试就行了,其中涉及了不少栈迁移的内容

blind2(可学习ret2csu和无限栈移)

这个题是是看了wp,它用了很多栈迁移,如果对栈迁移不熟悉的话,看着就会很头痛(比如我)
首先总结一下leave指令,这个指令的结果:rbp变成了rbp指向的内容,rsp变成了旧rbp+0x8(64位下),也就是说rbp进化了,然后rsp拿了旧的rbp部分上加一位栈地址。
然后我们看看这个wp:
首先给出exp:
有一部分有注释了,但是还要总结一下,不然太乱了

ret2csu

notion image
这个模板虽然和我那个不一样,但是看着更加的清晰,ret2csu就是通过这个init函数,先从0x4006CA走,然后走0x4006B0 。目的其实就是call一个函数,这个函数地址是call参数地址,然后rbp 寄存器变成rbp参数值。
这个rbp如果用来做栈迁移就很方便了。

exp解释

这里对返回值进行利用,返回到了这个位置
notion image
通过修改rbp达成任意写的效果。
修改bss中的一个read函数,这个函数是这样的
notion image
最后两个字节被填充了,很怪,这是出题人的问题,他将这道题设置成了read_got在bss中,导致我们直接用一次leave指令就将rsp变成了read_got+8的地址,这个地址是我们自己的输入地址。
然后进行ret2csu
💡
我们可以发现将ret2csu 和栈迁移一起使用可以达到任意栈地址迁移,使用ret2csu 可以更新rbp,然后和leave指令一起,无限栈迁移
将read_got的地址改两个字节改成\xd0 ,这样就可以使用read函数+0x10的地址,这是个syscall ,后面可以通过这个syscall 和ret2csu来进行任意函数的实现。
💡
同时可以看出来,对于下面这种构造链, 并没有执行完所有输入的链。在执行到p64(gadget) 的时候,就通过gadget 在main函数中这一特殊,直接用栈迁移去到了csu中的rbp所在位置
通过对syscall,来模拟write函数,来进行泄露libc,再进行

/bin/sh字符串查找

  • CTF-WP
  • i 春秋 冬季个人赛Wp-pwn部分GeekChallenge 2023
    • Giscus
    • Cusdis
    Catalog