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 ...
随机推荐
- Unity 调用android插件
1. Unity的Bundle Identifier必须和你的android报名一致 Activity和View的区别: Activity应该是一个展示页面,View是页面上一些按钮视图等等. 如何调 ...
- [Node.js]在windows下不得不防的小错误
TypeError: Arguments to path.join must be strings at f (path.js:204:15) at Object.filter (native) at ...
- iOS开发系列--打造自己的“美图秀秀”
概述 在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功系统的设计,另一方面得益于它强大的开发框架.今天我们将围绕iOS中两大图形.图像绘图框架进行介绍:Quartz 2D绘制2D图形和Co ...
- 【快速选择算法与nth_element函数】【续UVA11300 】
在白书中提到了一种O(n)级别的寻找中位数算法 就是我们今天要介绍的主角 快速选择算法 类似快排 选择一个比较元素 进行递归处理寻找第k大元素 假设最后比较元素到了i 以下描述是我写快排的常用字符 所 ...
- Intel 编译Boost库
C:\Windows\SysWOW64\cmd.exe /E:ON /V:ON /K ""C:\Program Files (x86)\Intel\Composer XE 2013 ...
- [ofbiz]screen中应用form和ftl,控制页面元素属性
可以在screen中定义form与ftl两个文件,ftl中可以使用js控制form中的页面元素属性. 控制元素是否可编辑: $("#oaDataReport_budget&qu ...
- 优酷播放器demo
<!DOCTYPE html> <html lang="en-US"> <head> <meta http-equiv="Con ...
- Windows下Redis的安装
1.安装Redis 官方网站:http://redis.io/ 官方下载:http://redis.io/download 可以根据需要下载不同版本 windows版:https://github.c ...
- 使用runtime 实现weex 跳转原生页面
一.简述 最近项目组打算引入weex,并选定了一个页面进行试水.页面很简单,主要是获取数据渲染页面,并可以跳转到指定的页面.跟之前使用RN 相比,weex 确实要简单很多.从下图中我们可以看到,wee ...
- PHP实现简单爬虫
<?php /** * 爬虫程序 -- 原型 * * 从给定的url获取html内容 * * @param string $url * @return string */ func ...