GHCTF
GHCTF 2025 新生赛WP PWN
- 个人信息
战队名:猛猛爆零
比赛排名:23
联系方式(QQ):2667734939
PWN
Hello_world
存在栈溢出和后门函数,但是开启pie保护了,但是覆盖前两位就可以了
1 | from pwn import * |
ret2libc1
购买商店能够触发栈溢出,并且冥币与钱换算错误,很轻松的便能两手一倒得到足够多的钱,然后就可以标准的ret2libc
1 | from pwn import * |
ret2libc2
没有自带的pop_rdi函数,无法实现传参,但是查看汇编
结尾时rax没有清零,反而置为刚刚写入的地址,这样就可以利用printf函数来格式化字符串漏洞泄露libc基地址,然后利用libc的pop_rdi打
1 | io = remote("node2.anna.nssctf.cn", 28522) |
真会布置栈吗?
代码不长,给了栈的地址,考虑打ret2syscall,可以利用控制传参的代码段中每次jmp都是到r15,为了避免循环注意到:
可以把r15设置成这个地方,再合理布置栈,能够操作寄存器
1 | from pwn import * |
my_vm
代码量不大的vm,逆起来难度不高,输入几个数字分解成为命令进行操作,reg数组存在溢出,可以修改SP,把sp变成负数,使得指向funcptr,然后把其改变成后门函数,就可以get shell了
1 | from pwn import * |
my_v8
V8得一个漏洞观察diff文件
新增两个函数Myread和Mywrite,可以泄露和修改数组后面的数据,这个数据代表了该数组存储的数据类型,所以就导致可以修改其类型使对类型解析的利用
比如说,如果是一个标准数据类型,就数组存储的是本身的值,调用该数就直接操作这个数据
如果是一个引用数据类型,数组存的是一个指针,对数据的操作会进行一层解引用
那么就可以对一个地址进行任意的读写
原理就是伪造一块数据,这个伪造的数据就是可控的,把这个伪造的数据的数组当作对象数组处理时,我们能对伪造的数据中的伪指针解引用,从而读写想要的修改的地址
再根据一块可读可写的地址写入shellcode执行,然后拿到shell
Exp:
1 | // ××××××××1. 无符号64位整数和64位浮点数的转换代码×××××××× |
Fruit Ninja
本题最大难点在于逆向,逆完后发现漏洞点在于
V21 b64解密后没有限制输出数组的长度,造成v18存在溢出
V18后面是dest
dest是一个文件路径,在一个条件语句中能被执行,我们就控制程序执行我们想要执行的程序
需要注意的是,要进入这个分支需要最开始输入的那个文件可执行的,就可以利用rule.cgi文件
执行我们想要执行的程序后由于没有回显,我们使用反弹shell的方法来cat flag
我们需要开启一个端口来进行监听,exp如下(注意后面的的命令需要是我们开启监听的ip,端口,没有公网可以使用内网穿透)
1 | from pwn import * |
Show Me The Code
llvm
代码:
1 | class edoc { |
使用
clang-12 -emit-llvm -S exp.cpp -o exp.ll
进行编译
1 | from pwn import |
然后运行就行,多试几次,就能够得到shell