一直在忙,晚上抽空打开题目,看到大佬们300多秒就解出来了,我只能写个详细点的wp来混存在感了。 首先查壳,VC程序,没壳
直接导入IDA定位到关键算法部分 通过F5可以看到伪C代码,主要讲的是我们输入的假码如果在0-9之间,就把对应的ASCII减0x30,假码如果在a-z之间,就把对应的ASCII减0x57,假码如果在A-Z之间,就把对应的ASCII减0x1D
大佬看到这里就可以关掉IDA开始写脚本了,但是我还是决定用OD来找找捷径 首先载入OD定位到关键点
004018B5处的GetWindowsTextA函数获取输入 00401908这里就开始进行算法变换
出了大循环之后,004019C3这里是关键比较CALL
进CALL看看
我们看到了字符串比较函数,我们在字符串比较函数下个CC断点,然后我们就可以通过穷举字母和数字来手动建立密码的对应关系
我们先观察和假码比较的那个字符串KanXueCTF2019JustForhappy 这个字符串包含了字母大写小写和数字 接下来就可以缩小举例的范围(排除某些符号) 0123456789对应abcdefghiAa
abcdefghijklmnopqrstuvwxyz对应BCDEFGHIJKLMNjklmn01234567
ABCDEFGHIJKLMNOPQRSTUVWXYZ对应89opqrstuvwxyzOPQRSTUVWXYZ
最后得出关系表 abcdefghiAa对应0123456789 BCDEFGHIJKLMNjklmn01234567对应abcdefghijklmnopqrstuvwxyz 89opqrstuvwxyzOPQRSTUVWXYZ对应ABCDEFGHIJKLMNOPQRSTUVWXYZ 通过手动计算可以得出: KanXueCTF2019JustForhappy对应j0rXI4bTeustBiIGHeCF70DDM 通过验证,flag正确
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
|