MQTT讲解 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。 MQTT最大优点在于,用极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。 作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。 协议原理 实现MQTT协议需要客户端和服务器端通讯…
学习文章来源于[RTOS] 基于VxWorks的TP-Link路由器固件的通用解压与修复思路 - 赤道企鹅的博客 | Eqqie Blog 固件来源 传送门:TL-WDR7660千兆版 V1.0升级软件20190830_2.0.30 固件下载链接:https://service.tp-link.com.cn/download/20207/TL-WDR7660%E5%8D%83%E5%85%86%E7%89%88%20V1.0%E5%8D%87%E7%BA%A7%E8%BD%AF%E4%BB%B6…
感觉最近好不想写博客了,这篇稍微水一点吧,主要是记录一下自己的做题笔记 这个题看题看的时间不长,大体逻辑很快就能看完,难点主要在他自己实现的一个格式的逆向,和软件安全赛encoder那道题感觉可以归为一类 题目分析 题目让我们输入的是他自己的一种指令格式,所以我们首先要把他的指令格式逆出来,进入vuln函数查看,这也是这个题的主要函数 根据字符串可知,题目有增删查,没有改,同时根据"\x00"," ",":"这三种字符作为分隔符,想要触发add分支,根据第9行if语句可知,要用分隔符做间隔,所以…
本文首发于先知社区:https://xz.aliyun.com/news/17415 赛后总结发现这是一个漏洞百出的题,有各种各样的打法,这里我的打法是基于patch的结果来写的,下面就详细说一下 题目分析 题目是2.31的libc,不是传统的增删改查,出题思路是一个文件上传后压缩解压的功能,但实际上就是增删查都齐全,没有传统意义上的改 upload对应的是增,release对应的是删,download对应的是查,encode,decode需要逆向分析一下 首先看upload 这里要输入一个in…
虽然是新生赛,但这个题个人觉得并不水,是一个挺有意思的httpd,感觉出题参考了西湖论剑里的一道题,原理也是base64解码溢出,题目的源码应该是改编自tinyhttpd这个开源项目,下面一起来逆向分析一下 首先创建一个端口,然后开启监听,每次接收到数据包就创建新的线程处理数据包,处理函数是accept_request函数。 进入accept_request函数,我们继续进行分析 前面就是在做一些检查,判断当前请求的类型,然后把请求路径拼接进去,并且判断了路径中是否存在"..",避免了路径穿越,…
什么是栈迁移 所谓栈迁移,一般而言,是在栈溢出量很小(一般只能溢出到返回地址处),无法打一个完整的ROP链的情况下,利用两次leave ret,将栈帧位置改变到我可控的地址上,在这个地址上我预先已经写好了一段payload,于是在栈迁移过后程序就会继续执行我预先在别处布置好的payload,那么接下来我们就好好地来解释一下栈迁移的原理是什么 栈迁移的原理 首先,我们编写一个demo函数,来展示一个程序栈帧的建立与消亡过成 void demo() { char buf[0x20]; ret…
如果发现虚拟机没有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中够用即可 简单来说,系统调用(这是个名词哦)就是程序调用底层设备,比如显示屏等等的汇编命令,比如你所熟知的printf函数,最终要调用write这个系统调用,来把你想输出的东西打印到屏幕上,scanf函数,最重要调用read这个系统调用,把你输入的东西放到程序里,如果没有这些系统调用作为交互接口,你该如何和电脑做交互呢? 所以,所谓系统调用,就是调用系统设备的接口,他和函数很像,都需要传入参数,在x86中…
前面的思路和官方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(…
先上结论:非预期解利用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位是根…