这个比赛当时出来的时候 工作室的人 都说要做,, 结果 杂项 还有web 的学弟自闭了 然后当时因为自己配mips 的环境 然后也没有仔细看(感觉自己 肝不出来) 然后就把题目给下载了下来 然后这里是重新做一下题目,
逆向:
这个题目算是送分题目 重点在于动态调试 ,,我静态看的很懵, 一开始我输入的字符比较 单调(比如都是5)
然后 我一开始以为一开始的加密 只是简单的base加密0。。。
然后我就好好看了一下 test 那个比较的函数
重点在于这一行,
这里的 v14 是 a2的下标的 所在地址 , 所以 这个其实是返回 a2的字符串下标 然后 参数是我们输入的字符,
可以动态调试得出结论
可以用ida 取出来他们的值 然后 把 字符串逆向出来
本来直接 base64 然后发现,,
emm 感觉事情不太对,, 然后我就去od里面 着重分析了一下 对输入字符串的 处理那个函数
发现确实用到了 这个字符串
然后解密可得。
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import base64
import string
code=[8,59,1,32,7,52,9,31,24,36,19,3,16,56,9,27,8,52,19,2,8,34,18,3,5,6,18,3,15,34,18,23,8,1,41,34,6,36,50,36,15,31,43,36,3,21,65,65]
strs="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
if __name__ =="__main__":
flag_base64=""
for i in code:
flag_base64+=strs[i-1]
string1 = str.maketrans("0123456789QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm+/","ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/")
strEnBase64 = flag_base64.translate(string1)
flag = base64.b64decode(strEnBase64)
print(flag)
Cplusplus
这个题目 参考了一下 星盟安全团队的题解,,,, 一开始看的时候真的是 一脸懵,,
这个题目的关键点 其实就那么多的地方,
这里大概调了一下 形式 就是 word0@word1#word2
然后 word0 其实很好看
根据这个映射表 然后把这个给word1求出
然后 word1 有了
范围还是比较小的,,
直接 脚本爆破就可以了 (提示给了 md5)
看算法 估计能看的头疼死,,
这里直接用星盟团队的脚本 吧,,,,,,,,,,
#!/usr/bin/env python2
# -*- coding:utf-8 -*-
import hashlib
word1 = '20637'
for word0 in range(0x6f):
for word2 in range(0xffff):
m = hashlib.md5()
m.update('de1ctf{' + str(word0) + '@' + word1 + '#' + str(word2) + '}')
if m.hexdigest() == '0e3c375c8112a7c7c00547e54895fdcc':
print 'de1ctf{' + str(word0) + '@' + word1 + '#' + str(word2) + '}'
exit()
调试确实很重要。。。。。。。。。。。。。这里调试确实 死在了第一步
第一步验证就死了,,,,,,
参考链接
https://mp.weixin.qq.com/s?__biz=MzU3ODc2NTg1OA==&mid=2247484089&idx=1&sn=3f41f1d65595f47dc72918b22cffc128&chksm=fd7117f4ca069ee292d6bbabe37d5aa9445747d0c13dd8b2d2f1d274f7afa32f910fe28ff07e&mpshare=1&scene=23&srcid=&sharer_sharetime=1565060951010&sharer_shareid=0ed84c079a78a485e04fa50e826c0770#rd