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的更多相关文章

  1. SSCTF Final PWN

    比赛过去了两个月了,抽出时间,将当时的PWN给总结一下. 和线上塞的题的背景一样,只不过洞不一样了.Checksec一样,发现各种防护措施都开了. 程序模拟了简单的堆的管理,以及cookie的保护机制 ...

  2. java抽象、接口 和final

    抽象 一.抽象类:不知道是具体什么东西的类. abstract class 类名 1.抽象类不能直接new出来. 2.抽象类可以没有抽象方法. public abstract class USB { ...

  3. Java内部类final语义实现

    本文描述在java内部类中,经常会引用外部类的变量信息.但是这些变量信息是如何传递给内部类的,在表面上并没有相应的线索.本文从字节码层描述在内部类中是如何实现这些语义的. 本地临时变量 基本类型 fi ...

  4. Java关键字final、static

    一.final根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效率. final ...

  5. JavaSE 之 final 初探

    我们先看一道面试题: 请问 final 的含义是什么?可以用在哪里?其初始化的方式有哪些? 首先我们回答一下这道题,然后再探究其所以然.  1.final 表示“最终的”.“不可改变的”,意指其修饰类 ...

  6. PHP的final关键字、static关键字、const关键字

    在PHP5中新增加了final关键字,它可以加载类或类中方法前.但不能使用final标识成员属性,虽然final有常量的意思,但在php中定义常量是使用define()函数来完成的. final关键字 ...

  7. final修饰符

    final本身的含义是"最终的,不可变的",它可以修饰非抽象类,非抽象方法和变量.注意:构造方法不能使用final修饰,因为构造方法不能被继承,肯定是最终的. final修饰的类: ...

  8. 浅析Java中的final关键字(转载)

    自http://www.cnblogs.com/dolphin0520/p/3736238.html转载 一.final关键字的基本用法 在Java中,final关键字可以用来修饰类.方法和变量(包括 ...

  9. java关键字extends(继承)、Supe(父类引用空间)、 This(方法调用者对象)、Instanceof(实例类型-判断对象是否属于某个类)、final(最终)、abstract(抽象) 、interface(接口)0

    java 继承使用关键字extends   继承的作用:减少代码量,优化代码 继承的使用注意点: 1子类不能继承父类的私有变量 2.子类不能继承父类的构造方法 3.子类在调用自己的构造方法时 会默认调 ...

  10. 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 ...

随机推荐

  1. fullcalender

    http://blog.csdn.net/francislaw/article/details/7740630 引用 <link rel="stylesheet" href= ...

  2. Struts2(二)——配置文件struts2.xml的编写

    接上一篇博客,这篇博客讲述一下2——9小标题的内容,这些问题都可以在struts2配置文件中设置(当然有的也可以在Struts.properties属性文件,web.xml中进行设置),而且常规开发中 ...

  3. Spring的AOP1

    引用:http://my.oschina.net/huangyong/blog/161338 是一个周末,刚给宝宝喂完牛奶,终于让她睡着了.所以现在我才能腾出手来,坐在电脑面前给大家写这篇文章. 今天 ...

  4. c# 图片简单模糊 非高斯模糊

    /// <summary>        /// 图像模糊化        /// </summary>        /// <param name="bit ...

  5. 设置MySQL数据表主键

    设置MySQL数据表主键: 使用“primary key”关键字创建主键数据列.被设置为主键列不允许出现重复的值,很多情况下与“auto_increment”递增数字相结合.如下SQL语句所示: My ...

  6. 使用一个HttpModule拦截Http请求,来检测页面刷新(F5或正常的请求)

    在Web Application中,有个问题就是:“我怎么来判断一个http请求到底是通过按F5刷新的请求还是正常的提交请求?” 相信了解ASP.NET的人知道我在说什么,会有同感,而且这其实不是一个 ...

  7. 在Red Hat Enterprise Linux 5 64-bit安装oracle11g r2

    网上这种文档一搜就一堆,没别的目的,刚接触oracle为了加深理解记忆.只要是跟我的版本一样操作系统和oracle软件,按照步骤肯定可以成功安装 在虚拟机上安装Red Hat Enterprise L ...

  8. FtpClient的使用

    摘自:http://hi.baidu.com/yuanhotel/item/000b6334894d11f42784f4da Java的ftp操作 package com.why.ftp; impor ...

  9. ContextLoaderListener和Spring MVC中的DispatcherServlet加载内容的区别

    一:ContextLoaderListener加载内容 二:DispatcherServlt加载内容 ContextLoaderListener和DispatcherServlet都会在Web容器启动 ...

  10. Linux学习之fsck命令

    在windows下,磁盘的文件系统出错,需要运行chkdsk命令进行修复.而在linux下,则需要运行fsck命令.由于linux对于文件系统的错误非常敏感,由于意外断电或者其它原因导致linux系统 ...