铁三决赛interpreter wp
感觉最近好不想写博客了,这篇稍微水一点吧,主要是记录一下自己的做题笔记 这个题看题看的时间不长,大体逻辑很快就能看完,难点主要在他自己实现的一个格式的逆向,和软件安全赛encoder那道题感觉可以归为一类 题目分析 题目让我们输入的是他自己的一种指令格式,所以我们首先要把他的指令格式逆出来,进入vuln函数查看,这也是这个题的主要函数 根据字符串可知,题目有增删查,没有改,同时根据"\x00"," ",":"这三种字符作为分隔符,想要触发add分支,根据第9行if语句可知,要用分隔符做间隔,所以…
2025软件安全赛pwn encoder
本文首发于先知社区:https://xz.aliyun.com/news/17415 赛后总结发现这是一个漏洞百出的题,有各种各样的打法,这里我的打法是基于patch的结果来写的,下面就详细说一下 题目分析 题目是2.31的libc,不是传统的增删改查,出题思路是一个文件上传后压缩解压的功能,但实际上就是增删查都齐全,没有传统意义上的改 upload对应的是增,release对应的是删,download对应的是查,encode,decode需要逆向分析一下 首先看upload 这里要输入一个in…
NSS新生赛fruit ninja
虽然是新生赛,但这个题个人觉得并不水,是一个挺有意思的httpd,感觉出题参考了西湖论剑里的一道题,原理也是base64解码溢出,题目的源码应该是改编自tinyhttpd这个开源项目,下面一起来逆向分析一下 首先创建一个端口,然后开启监听,每次接收到数据包就创建新的线程处理数据包,处理函数是accept_request函数。 进入accept_request函数,我们继续进行分析 前面就是在做一些检查,判断当前请求的类型,然后把请求路径拼接进去,并且判断了路径中是否存在"..",避免了路径穿越,…
CTF入门——从零开始的栈迁移
什么是栈迁移 所谓栈迁移,一般而言,是在栈溢出量很小(一般只能溢出到返回地址处),无法打一个完整的ROP链的情况下,利用两次leave ret,将栈帧位置改变到我可控的地址上,在这个地址上我预先已经写好了一段payload,于是在栈迁移过后程序就会继续执行我预先在别处布置好的payload,那么接下来我们就好好地来解释一下栈迁移的原理是什么 栈迁移的原理 首先,我们编写一个demo函数,来展示一个程序栈帧的建立与消亡过成 void demo() { char buf[0x20]; ret…
qemu系统级模拟启动路由器
如果发现虚拟机没有ens33网卡的话,可以手动配置一下 sudo ip link set ens33 up sudo dhclient ens33 用户级调试的话需要配一下网卡 sudo brctl addbr br0 sudo brctl addif br0 eth0 sudo ifconfig br0 172.21.198.73/24 up 首先创建一张网卡 sudo tunctl -t tap0 sudo ifconfig tap0 192.168.0.4/24 up 启用端口转发 ech…
CTF入门——系统调用、shellcode、沙箱(orw)与srop
何为系统调用 那些深奥的难懂的解释网上有一大堆,在这里我解释的通俗一些,最起码让你在CTF中够用即可 简单来说,系统调用(这是个名词哦)就是程序调用底层设备,比如显示屏等等的汇编命令,比如你所熟知的printf函数,最终要调用write这个系统调用,来把你想输出的东西打印到屏幕上,scanf函数,最重要调用read这个系统调用,把你输入的东西放到程序里,如果没有这些系统调用作为交互接口,你该如何和电脑做交互呢? 所以,所谓系统调用,就是调用系统设备的接口,他和函数很像,都需要传入参数,在x86中…
春秋杯day3 pwn rogue_like半非预期解法
前面的思路和官方wp一样,后面我利用了一个magic gadget,省去了栈迁移的繁琐 from pwnplus import * context.arch = 'amd64' context.log_level = 'debug' p=mypwn('./pwn') elf=ELF('./pwn') libc=ELF('./libc-2.27.so') def choose(num): p.sla(b'> ',str(num)) offset1=0x002528 choose(1) p.sla(…
春秋杯冬季赛day3 pwn toys非预期解
先上结论:非预期解利用ret2dl 题目分析 题目很简单,由于fgets遇到\0不会截断,所以那个if判断很容易绕过 问题是没有可以用的gadget,唯一能操作的就是fgets(s,4919,stdin)里面的s是根据rbp来寻址的,所以可以根据这一点打一个栈迁移 思路分析 第一次,修改rbp到bss上,这样下一次fgets时就可以输入到bss段上 第二次,向bss段上输入fake_link_map和rop链,利用ret2dl将puts函数解析为onegadget(64位可以这样操作,32位是根…
春秋杯冬季赛day2 easy_http复现
这个题比较恶心的地方有两个,第一个是这个题没有libc,把所有libc的函数自己重写了一下,符号表全部抹掉了,所以有很大的逆向难度,第二个是这个题有很多进程,多进程调试也是比较繁琐的一个点,看过官方题解后,发现漏洞点本身其实是比较简单的,就是逆向难度确实比较大,ida有些地方反编译的也跟狗屎一样,所以这里我从一个做题者看ida的角度来分析这道题 题目分析 iot类型的题目,3成靠看,7成靠猜,这里猜测if里面的函数应该是某个检查,核心应该是红框里的函数 主体长这样,第16行的函数一开始乍一看比较…
如何在C++里调用python详细教程
最近在做有关无人机视觉的项目,由于superpoint网络和ros系统的联动比较困难复杂,故最后决定直接将superpoint的代码集成到C++里,用C++直接去调用,省去了节点之间通信的繁琐,故在此记录一下我一点一点摸索的历程。 什么是PyObject? 在一切的开始,你务必要知道什么是PyObject,简单来说,一切python里的东西都是PyObject,无论你是想要传参,还是接受返回值,还是调用某个函数,某个类等等,他们都是PyObject,你也必须用一个PyObject类型的指针来接受…