2019湖湘杯线上 RE WriteUp

Author Avatar
kabeor 11月 12, 2019

2019湖湘杯线上 RE WriteUp

reverse

UPX壳,脱壳机即可
image.png

IDA分析

主函数逻辑如下
image.png

检测命令行输入格式为 文件名 flag.txt

flag.txt由如下脚本解得。

image.png

之后读入txt,检测输入为32位
然后进入两个处理函数

sub_4113B1(xmm0_4_0, &Buf, &unk_41A4E0);  // 处理1
if ( sub_4113B6(xmm0_4_0, &unk_41A4E0) ) // 处理2

处理1

image.png

将输入每两位一起进行处理,判断两位中的第一个值是否在与0-9或a-f中,如果在就减去48或87,
这里的数组将在处理2中作为验证数据。

处理2

image.png

第一位左移4位+第二位的结果加上1与dword_41A078数据进行比较。

flag脚本

flag = [0x50, 0xC6, 0xF1, 0xE4, 0xE3, 0xE2, 0x9A, 0xA1,0xA7,0xde,0xda,70,171,46,255,219]
s = ''

for i in flag:
i -= 1
s += str(hex(i>>4))[2:]
s += str(hex(i&0xf))[2:]

print s

esrever

迷宫,动态反调试没什么用

image.png
输入比较巧妙,过反调试以后动态调很复杂,但很清晰看到是控制7*7二维数组上下左右

image.png

提取迷宫
image.png

知道映射关系就不用考虑输入,直接考虑输出是什么就可以了。
image.png

#FFRFFF####ZZRZZZ##FF#FFFF

icekey

.NET程序,直接上dnSpy

定位到关键函数位置
image.png

image.png

关键算法如下
image.png

使用了IceKey公钥算法
Ice

这里加解密都已经封装好了,key是字符串iriszero的md5值
内部加密没有做任何改动,有兴趣可以对比官方实现 http://www.darkside.com.au/ice/

最后加密的密文和string b = "3ACF8D62AAA0B630C4AF43AF327CE129D46F0FEB98D9040F713BE65502A5107A";比较

既然下面给了解密流程,那就不好意思了
观察到bytes数组存放明文,array数组存放密文,因此只需要动态调试在解密前将array内的值改为b,解密后查看bytes值即可
注意:要构造和b/2等长即32位伪flag才能申请到足够的数组长度。

修改完记得右键刷新才能在局部变量中显示

运行解密函数后查看bytes数组内存如下,即为flag

flag:5acb06231724c8c369bae711166dbe85

验证一下

From https://kabeor.github.io/2019湖湘杯线上RE WriteUp/ bye

This blog is under a CC BY-NC-SA 4.0 Unported License
本文链接:https://kabeor.github.io/2019湖湘杯线上RE WriteUp/