SSCTF-Final-Re-Play
SSCTF-Final-Re-Play
比赛时花了一晚上搞定了,结果写脚本的时候发送的内容忘记base64加密然后异或8了,手动测试的时候当然是这样做了,写脚本的时候脑抽了。这个题只有forx做出来了,白白损失了一个打全场的机会,赛后大家估算了下要是没弄错了的话,应该是在前5名。补丁打好了,但是这个程序本身就是一个服务端,必须手动地停止服务再重新启动,结果并没有这么做,所以补丁白打了,还是被打。
最初还以为是个PWN的题,因为还没见过攻防形式下的Reverse题。傻傻地去找格式化字符漏洞和溢出。后来弄清楚题意后知道是个逆向题目,和龙少花了一晚上搞了搞,一个人的话真得很容易放弃。
是一个QT的程序,启动后会不断地连接192.168.199.1:1234,自身监听9527端口。192.168.199.1:1234是主办方的服务端,我们并不能控制,主办方给了一个文件里给了192.168.199.1:1234给这个QT的程序发送的数据,在调试的时候,我也模拟192.168.199.1:1234向程序发送数据。
程序会监听9527端口,我连接上后,可以发送数据,并返回一定的结果,发送随机字符串的话,会返回0;发送一个数字的时候,会返回数字的2倍。

看程序的界面,会发现发送的东西以乱码的形式呈现到界面,分明是经过了某种处理。

在知道了这些东西后,开始上IDA分析。

在MainWindow的构造函数中,发现了saddddd....HP这个函数,进去后发现做了一些初始化的造作,以及信号和槽的连接。
初始化后可以看到MainWindow的结构
+ 8 QTimer
+ 9 QTCPserver
+10 QTCPSocket
+11 QUDPSocket

这个TCPSocket会在Timer的作用下不断的连接192.168.199.1:1234,直到成功。
QTCPServer则会监听9527端口。

信号与槽通过Qobject::connect联系:




重点看第二个和第三个,第二个说一旦QtcpServer监听的9527端口有新的连接来到,则调用MainWindow::cST()函数,第三个说一旦QtcpSocket接受192.168.199.1:1234的数据时,调用MainWindow::rD()函数。
除此之外,函数中还有其他的信号与槽的联系,在这里先不说。我们把重点放到MainWindow::cST()上,因为只有这部分是我们可以控制的,我们向9527端口连接,并发送内容。在MainWindow::cST()中,首先创建了一个socketThread,来与客户端进行通信。

在socketThread的构造函数里,看到建立了QTcpSocket和SocketThread的信号与槽的联系。

这里的a1+28就是连接到9527端口的QTcpSocket,a1则是socketThread本身。从这里可以知道如果客户端连接到9527端口并发送数据时(readyRead),将会调用socketThead::rD()函数。
在socketThead::rD()逛的时候,发现了这些东东。

看到了异或和解base64,感觉挺可疑的,就在这下断点,竟然发现是对输入先异或了8后进行解base64。这个时候,我将测试发送的内容进行base64编码,异或8后发送过去,在界面上看到了明文哦。

做题的时候,一直在想这个逆向题目是怎么获取到对方的flag的。隐隐中觉得是发送一定的内容就会返回flag。继续在socketThead::rD()中逛,会发现有打开文件操作、base64操作等,这些都是可疑操作,就在上面下断点。竟然发现,会尝试以刚才发送的数据的解码结果为名打开文件。

接着就一个存在的文件做实验(文件名经过base64加密后异或上8),发现竟然返回结果了!!!

这明显不是文件的内容,但是应该是某种形式的加密。继续在socketThead::rD()中逛,突然想到好像在函数列表中有进行密码学运算的库函数,赶紧交叉引用找到调用点,下断点。

发现了奥秘,原来是文件的每3个字节进行md5运算,最后拼接后,发送到客户端。
至此,弄清楚了程序的意思,只要发送base64encode('/home/user2/flag')^0x8,就能得到flag每3个字节进行md5后拼接的结果,3个字节的md5是很容易爆破的,因此就能拿到flag。
感觉做Linux下的逆向还是IDA debugger好用,做pwn的话GDB好用。
SSCTF-Final-Re-Play的更多相关文章
- SSCTF Final PWN
比赛过去了两个月了,抽出时间,将当时的PWN给总结一下. 和线上塞的题的背景一样,只不过洞不一样了.Checksec一样,发现各种防护措施都开了. 程序模拟了简单的堆的管理,以及cookie的保护机制 ...
- java抽象、接口 和final
抽象 一.抽象类:不知道是具体什么东西的类. abstract class 类名 1.抽象类不能直接new出来. 2.抽象类可以没有抽象方法. public abstract class USB { ...
- Java内部类final语义实现
本文描述在java内部类中,经常会引用外部类的变量信息.但是这些变量信息是如何传递给内部类的,在表面上并没有相应的线索.本文从字节码层描述在内部类中是如何实现这些语义的. 本地临时变量 基本类型 fi ...
- Java关键字final、static
一.final根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效率. final ...
- JavaSE 之 final 初探
我们先看一道面试题: 请问 final 的含义是什么?可以用在哪里?其初始化的方式有哪些? 首先我们回答一下这道题,然后再探究其所以然. 1.final 表示“最终的”.“不可改变的”,意指其修饰类 ...
- PHP的final关键字、static关键字、const关键字
在PHP5中新增加了final关键字,它可以加载类或类中方法前.但不能使用final标识成员属性,虽然final有常量的意思,但在php中定义常量是使用define()函数来完成的. final关键字 ...
- final修饰符
final本身的含义是"最终的,不可变的",它可以修饰非抽象类,非抽象方法和变量.注意:构造方法不能使用final修饰,因为构造方法不能被继承,肯定是最终的. final修饰的类: ...
- 浅析Java中的final关键字(转载)
自http://www.cnblogs.com/dolphin0520/p/3736238.html转载 一.final关键字的基本用法 在Java中,final关键字可以用来修饰类.方法和变量(包括 ...
- java关键字extends(继承)、Supe(父类引用空间)、 This(方法调用者对象)、Instanceof(实例类型-判断对象是否属于某个类)、final(最终)、abstract(抽象) 、interface(接口)0
java 继承使用关键字extends 继承的作用:减少代码量,优化代码 继承的使用注意点: 1子类不能继承父类的私有变量 2.子类不能继承父类的构造方法 3.子类在调用自己的构造方法时 会默认调 ...
- files list file for package 'xxx' is missing final newline
#!/usr/bin/python # 8th November, 2009 # update manager failed, giving me the error: # 'files list f ...
随机推荐
- Vue.js快速入门
Vue.js介绍 Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的.相比于Angular.js,Vue.js提供了更加简洁.更易于理解的API,使得我们 ...
- HEVC测试序列(百度云网盘分享)
巧妇难为无米之炊,身为一个码农怎能碗里没有米呢?想必很多朋友都碰到下载测试序列的困惑,为了减少麻烦,现提供HEVC所有测试序列的下载,上传到百度云网盘上,方便大家下载.主要的测试序列如下: Test ...
- 如何改变word修订模型下的视图
在Word中执行与Find.Range等相关的操作时,需对修订模式下的文档进行特殊处理. 核心知识点 Word中的 RevisionsView 属性只有两种设置:显示标记的最终状态(Final Sho ...
- c# 面相对象4-多态性
一.定义: 多态是面向对象程序设计的又一个特性.在面向过程的程序设计中,主要工作是编写一个个的过程或函数,这些过程和函数不能重名.例如在一个应用中,需要对数值型数据进行排序,还需要对字符型数据进行排序 ...
- MSDTC问题集
一.链接服务器的 OLE DB 访问接口 "SQLNCLI" 无法启动分布式事务. 尊重原著作:本文转载自http://sfwxw456.blog.163.com/blog/sta ...
- OC学习中遇到的问题总结
1.不要在初始化的时候用self.方法,因为在初始化的时候self.,此时系统还没有alloc开辟空间,这样做违背了系统流程. 2.善于运用宏定义来控制程序中的变量,这样程序可修改性高. 3.obje ...
- WCF如何在浏览器访问
1.新建wcf服务看到有如下两个方法,在浏览器调用框中的方法.
- S - stl 的mapⅠ
先来介绍一下stl中的map这个功能 头文件#include<map> map是STL的一个关联容器,它提供一对一的数据处理能力 就像一个人对应一个编号一样 定义 为 map<in ...
- inflate, findViewById与setContentView的区别与联系
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentV ...
- android的数据存储方式
数据存储在开发中是使用最频繁的,在这里主要介绍Android平台中实现数据存储的5种方式,分别是: 1 使用SharedPreferences存储数据 2 文件存储数据 3 SQLite数据库存储数据 ...