-
-
[原创]kctf2021 第二题
-
2021-5-12 11:00 4418
-
程序分析
之前写注释的idb,被我删了,我就大概描述下算法流程,其实这题就是一题走迷宫,不过和普通的迷宫题不同,这题不止可以走四个方向,还可以左上,右下等,非常灵活,最后getflag的条件,就是必须把迷宫的所有零,都变成1,dump下迷宫后,发现有46个零,然后前面有一个我们输入转换opcode的过程,opcode就是我们指导方向的东西,先不用管转换过程,先通过走迷宫,然后得到opcode,再反推回去,我用ipad画了下迷宫,把路径走出来了
然后发现迷宫是设计好的,opcode挺好反推的,得出opcode是这个
1234321234321101210050543450501210121234322321
通过opcode反推输入字符
这里有点坑,我卡这里卡了很久,之前一直以为是输入的字符一个对应一个opcode,但是我在写脚本,反推,再输入调试的时候,发现不对,跟流程的时候发现,是一个字符对应的两个opcode,所以我微调了下我的脚本,直接跑出来了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | tt = "1234321234321161216656543456561216121234322321" print len (tt) tt = tt.replace( "6" , "0" ) print tt for i in range ( 1 , 44 ): for j in range ( 1 , 36 ): if tt[i - 1 ] = = str (tranform(i,j)): w.append(j) #print i,j break print len (w) flag = "" yenk = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" #G1555531555544266655333315331533315531555422 for t in range ( 43 ): flag + = yenk[w[t]] flag = "" kt = 0 for g in range ( 23 ): for w in range ( 36 ): if tt[kt] = = str (tranform(g,w)) and (g + w / 6 ) % 6 = = int (tt[kt + 1 ]): flag + = yenk[w] break kt + = 2 print flag |
flag为GJ0V4LA4VKEVQZSVCNGJ00N
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法
最后于 2021-5-12 12:05
被kanxue编辑
,原因:
赞赏
他的文章
看原图