网址:http://whalectf.xin/challenges

RE

0x01 PE格式

flag格式为:BJWXB_CTF{[块数目的值]-[文件时间戳值]-[文件入口点地址]-[文件信息标识]}

考察PE结构,打开CFF Explorer:

WhaleCTF 二进制题目解题笔记-Alkaid

节数即为块数,时间日期戳就在下方,文件信息标识为特征,入口处在可选头里。

 

0x02 Warmup

使用IDA打开目标文件,找到关键字符串:

WhaleCTF 二进制题目解题笔记-Alkaid

可以看出,是一段简单的异或,将flag每一位和0xe进行异或操作:

WhaleCTF 二进制题目解题笔记-Alkaid

解题脚本为:

 

0x03 app-release

一道安卓逆向,用Androidkiller打开,可以看到java源码:

WhaleCTF 二进制题目解题笔记-Alkaid

WhaleCTF 二进制题目解题笔记-Alkaid

可以看到和上图一样都是异或,这次是和0x12进行按位异或,脚本如下:

 

0x04 r100(defcamp)

使用IDA打开,发现有ptrace函数,ptrace会在什么时候出现呢?在执行系统调用之前,内核会先检查当前进程是否处于被“跟踪”(traced)的状态。如果是的话,内核暂停当前进程并将控制权交给跟踪进程,使跟踪进程得以察看或者修改被跟踪进程的寄存器。直接将ptrace给nop掉,在关键函数中发现有花指令,直接无视:

WhaleCTF 二进制题目解题笔记-Alkaid

直接看汇编有点难受,放到gdb里动调一下,发现逻辑为总共三组字符串,每组的第0,2,4,6个的ASCII值减一后组合在一起即为flag

WhaleCTF 二进制题目解题笔记-Alkaid

 

0x05 逆向练习

放到IDA看下程序流程,发现关键加密:

WhaleCTF 二进制题目解题笔记-Alkaid

解出前17字符的flag,在和1024}拼接起来就是完整的flag,脚本如下:

0x07 rev2

用IDA打开找到关键函数

WhaleCTF 二进制题目解题笔记-Alkaid

显而易见,sub_401000就是对已有字符串的操作函数,题目没有输入点,flag被写入了内存,直接上OD动态调试,关键函数是在int3后面,所以必须先把int3 nop 掉,再f7进入到函数内部,在循环结束后可以看到EBX寄存器中的地址中就是完整flag:

WhaleCTF 二进制题目解题笔记-Alkaid

 

PWN

0x01 pwn-100

nc bamboofox.cs.nctu.edu.tw 22001
FLAG 在 /home/ctf 底下

看下保护,全关:

WhaleCTF 二进制题目解题笔记-Alkaid

用IDA打开程序,看到很明显的溢出,以及利用点:

WhaleCTF 二进制题目解题笔记-Alkaid

我们只需要将变量s覆盖掉v5,并且将v5的值控制为0xABCD1234就能得到shell,于是脚本如下:

 

0x02 pwn-200

nc bamboofox.cs.nctu.edu.tw 22002
FLAG 在 /home/ctf 底下

看下保护,开了栈保护和堆栈不可执行:

WhaleCTF 二进制题目解题笔记-Alkaid

用IDA打开程序,看到很明显的格式化字符串漏洞和可利用的后门函数:

WhaleCTF 二进制题目解题笔记-Alkaid

利用格式化字符串漏洞修改got表,脚本如下:

0x03 pwn-300

nc bamboofox.cs.nctu.edu.tw 22003
FLAG 在 /home/ctf 底下

看下保护,和上题一样:

WhaleCTF 二进制题目解题笔记-Alkaid

扔到IDA里,看到两个printf格式化字符漏洞:

WhaleCTF 二进制题目解题笔记-Alkaid

这次没有直接可以用的后门了,但是plt表里有system函数,可以通过直接把got表修改的方式调用system函数,但是这时候问题来了,缺少/bin/sh参数,于是思考可以在第二个fget函数这里将/bin/sh压到栈上,之后printf的got表改为system函数地址,正好符合将参数入栈,调用函数的函数调用约定,于是脚本如下: