查壳发现是ASPack壳,我用工具脱没脱下来,只好手动脱,根据栈平衡可以顺利找到eop,然后从内存中dump下来,载入IDA中,找到关键函数: sub_4011F0函数验证了用户输出的合法性,然后再经过sub_401240和sub_401C6A处理,再和正确字符串相比较
DDCTF_2019_re_reverse2_final
验证合法性的函数很简单,限制了0-9,A-F
DDCTF_2019_re_reverse2_final
接下来看数据处理函数,静态分析后也没明白是干什么的,通过交叉引用函数,发现sub_401000存在base64算法,但是这道题把索引表给隐藏起来了,题目所提供的索引表和0x76异或之后构成base64的索引表 动态调试的时候,我们输入123456789A的时候,发现sub_401000返回了一串字符串:
DDCTF_2019_re_reverse2_final
更加确定这个是base64加密了,解密发现,这个题目是将我门输入的字符串直接转成了数据
1
2
| import base64
print base64.b64decode("EjRWeJo=").encode("hex")
|
所以我们直接将正确字符串base64解密即可得到flag: 1
2
| import base64
print "DDCTF{"+base64.b64decode("reverse+").encode("hex").upper()+"}"
| flag:DDCTF{ADEBDEAEC7BE} |