MozhuCY's blog.

kctf2019-晋级赛Q1

字数统计: 1k阅读时长: 3 min
1970/01/01 Share

第一题 流浪者

  • 一个单表替换,输入范围是0-9,a-z,A-Z,分别对应表的0 - 9,10 - 35,36 - 61
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
table = "abcdefghiABCDEFGHIJKLMNjklmn0123456789opqrstuvwxyzOPQRSTUVWXYZ"
s = "KanXueCTF2019JustForhappy"
ff = []
for i in s:
ff.append(table.index(i))

flag = ""
for i in ff:
if 0 <= i <= 9:
flag += chr(i + 48)
elif 9 < i <= 35:
flag += chr(i + 87)
elif i > 36:
flag += chr(i + 29)

print flag

第二题 变形金刚

  • 安卓逆向,解压apk,拿出来class.dex
  • 将dex反编译成.jar文件,解压以后获得class文件,放入IDEA中,发现没有什么运算的过程,找到so文件,去查了一下,可以找到里面有一个类似于rc4的运算,还有一个字符串异或解密的函数,逐一解密后得到几个字符串,对应的分别是一串uuid,一串字符被base64部分引用,而这个base64也是魔改过的
  • 在sub_784中,可以看到另外的rc4部分,但是rc4也是被改过了一些.直接复现算法即可,最后在模拟器中输入就看到flag字样弹出

第三题 影分身之术

  • 这个题目出的非常的神奇了,之前没有逆过delphi,所以还是有一点难度
  • 程序是一个窗口,输入以后点击check,会有一个弹窗提示wrong,查看了一下内置字符串,发现了一些script的东西,确定了一下是js
  • 后面就比较神奇了,程序用到的数据写到了代码段里,这个在逆向的时候就有一些小干扰了..,在字符串中,可以看到<input type=button value="checkMyFlag" onclick="ckpswd();">的字符串,按钮事件
  • 在程序中可以在492BA8的位置看到一段js代码,大概内容是eval(packed),其实就是js混淆,寻找在线网站即可解密这段代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function ckpswd() {
key = "simpower91";
a = document.all.pswd.value;
if (a.indexOf(key) == 0) {
l = a.length;
i = key.length;
sptWBCallback(a.substring(i, l));
} else {
alert("wrong!<" + a + "> is not my GUID ;-)");
return "1234";
}
}
function ok() {
alert("congratulations!");
}
  • 其实就是个字符串比较函数,所以可以知道前几位是simpower91,输入后没有什么反应,于是继续跟进
  • 在后面程序会检查属否存在data.txt并且打开读取文件,不过好像没有什么影响= =,但是会看到一个比较长度是否等于4的运算,也就是输入是simpower91 + xxxx.
  • 程序在0xa4000的位置做了一些数据操作,在函数4734b0中,还有一些写入0x90,0xc3的循环,跟进发现跳出这个函数以后的sub_4734B0中jmp [esp-4+var_40],是一个向刚才的虚拟空间的跳转,跟进进刚才写入的数据可以看到在执行逐位对比的操作,从eax,edx寄存器中可以找到数据,将每位加上7f就能拿到后四位
  • 提取数据逆向得到后四位a123,输入验证通过

第六题 RePwn

  • 这是一个比较神奇的题目,有好多组多解= =
  • 题目逻辑不是很难,输入一个字符串,进行一个明文字符串比较.
  • 跟到里面,是一个类似于方程的东西,变量是输入的前8个字符,根据约束条件很容易用z3等约束求解器解出来
  • 到了后面,将输入的最后四个字节进行了简单的减法运算,然后将flag拷贝进栈内,注意这里存在一个溢出,只要构造后四个字节,就可以劫持执行流
  • 具体劫持到哪里呢,搜索字符串发现了一个加密过的字符串,按照xref找到的运算,异或回去可以看到这就是提示correct的字符串,向上回溯,找到sub_401BF0
  • 后四位注意小段序,可以算出来实际上就是HaCk,继续整理函数,发现了des的几个特征变量以及运算,后调试得知就是des,按照规则反解即可得到第二个flag,拼接起来就是可以提交的flag了
CATALOG
  1. 1. 第一题 流浪者
  2. 2. 第二题 变形金刚
  3. 3. 第三题 影分身之术
  4. 4. 第六题 RePwn