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 ...
随机推荐
- JQuery中阻止事件冒泡方式及其区别
JQuery 提供了两种方式来阻止事件冒泡. 方式一:event.stopPropagation(); $("#div1").mousedown(function( ...
- [Android4.4.3] Nubia Z5S Mokee4.4.3 RC2.0 by syhost
这个ROM先前在Mokee官网公布过,但一些人測试bug不少,因此已经撤下, 但又有人反馈跟之前RC1.0版的bug差点儿相同, 所以再次在网盘单独公布, 截图以及注意事项见之前的RC1.0的帖子, ...
- C# 之 抽象类与接口
抽象类 C#同意把类和方法声明为abstract,即抽象类和抽象方法.抽象类通常代表一个抽象概念,它提供一个继承的出发点,当设计一个新的对象类时,一定是用来继承的,所以,在一个以继承关系形成的等级结构 ...
- 【特殊的图+DP】【11月校赛】大家一起玩游戏
大家一起玩游戏 Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submi ...
- 疯狂Android第二章:Adapter以及部分控件使用
第二章 重点:1.理解View以及各种布局的优缺点,适用场景. 2.熟练掌握adapter原理与用法. 3.熟悉其它控件的基本使用方法. /////////////////////////////// ...
- C# HTML转换为WORD
使用aspose.words仅需要4句代码,即可搞定. Document doc = new Document(); DocumentBuilder builder = new DocumentBui ...
- 我们为什么要遵循W3C标准规范
大部分的站长和拥有网站的企业负责人都会知道,每当有浏览器发布大更新的时候,我们刚建立不久的网站就会发生无法预知的严重错误,我们只能重新建立或改版网站,使其可以应归新发布的浏览器.好比1996-1999 ...
- WEB标准:标准定义、好处、名词解释、常用术语、命名习惯、浏览器兼容、代码书写规范
1. WEB标准是什么? “WEB标准”是一系列标准的总称.一般的误区经常把WEB标准说成DIV+CSS.准确的说法应该是:采用W3C推荐的WEB标准中的XHTML1.1结合CSS2.0 样式表制作页 ...
- J - A + B Problem II(第二季水)
Description I have a very simple problem for you. Given two integers A and B, your job is to calcula ...
- Ubuntu修改计算机名称造成无法解析主机问题解决方法
在通过修改/etc/hostname文件方法修改计算机名称后导致有时候出现无法解析主机的问题. 解决方法: 找到/etc/hosts文件,打开找到如下一行 127.0.1.1 旧主机名 将 ...