2021看雪kctf CrackeMe

这道题是2021看雪ctf的第四题,这道题输入的key是9x9数独游戏的唯一解,然后根据这个密钥转换为这个数独中应该填写的数字,判断其行是否合法、列是否合法以及粗线宫是否合法。如果合法则计算其md5,然后aes解密shellcode。解密正确的话则会正确执行shellcode,从而弹出input correct的消息框,否则就没有这个消息框,自动退出程序。


dos程序,输入之后没有错误信息。主要逻辑在主函数里面,查看主函数。

大致看if的三个条件应该是校验条件。查看第一个校验函数。

这个函数里面给出了一个字符表,是将输入通过这个表转换成一串0-9的数字。查看第二个函数

第二个函数是将0-9数字依次填充到9*9矩阵的0值位上,并进行校验是否求解成功。

第一个校验函数的作用是,先检查输入字符是否是数字字符,如果是且与某个位置计数相加为0x39,

则位置计数清零,字符表查询范围减少9个字符。否则结束遍历失败返回。如果输入字符不是数字字符

则搜表得到该字符在表中的位置值,经过模9加1计算后记录,作为数独的求解结果。这里猜测应该是

将81个元素的字符表分成9组,每组9个字符,第i组的输入字符出现在第i组的字符表中。

0   4   0   7   0   0   0   0   0
9   2   0   0   0   0   6   0   7
8   3   0   0   0   5   4   0   0
0   1   0   0   0   3   0   0   0
0   0   0   2   0   1   0   0   0
0   0   0   5   0   0   0   4   0
0   0   4   9   0   0   0   7   1
3   0   5   0   0   0   0   9   4
0   0   0   0   0   8   0   6   0

已知数独是这样,找个求解。

table = "$BPV:ubfYp}]DtN>aT^MGmJQ#*Hr`O'wjic0!hdy{oZz-@n+?&%s_/g<e[W)XUxRFSLRA;.l=CEkvK-(q"
idx = [[5,6,1,9,2,3,8],[1,8,3,4,5],[7,6,2,1,9],
        [7,8,4,6,9,2,5],[4,5,3,9,7,8,6],[6,9,2,8,7,1,3],
        [2,8,5,6,3],[6,1,7,2,8],[1,7,9,3,4,5,2]]
length = 64
l = [0]*length
pos = 0
for i in range(9):
  n = len(idx[i])   
  for j in range(n):
    l[pos+j] = table[i*9+idx[i][j]-1]
 
  l[pos+n] = chr(0x39-n)  
  print chr(0x39-n) ,
  pos += n+1
  print ''.join(l[:pos])
 
print ''.join(l)

反解得到u$YBPf2pa]Dt4#QM^H4ic'j0`w2y{d-Zzo2%/n_s@+2<UW)e4AR;F.4=-qEkvC2。

 

posted @ 2021-05-20 22:14  Sk2rw  阅读(269)  评论(0编辑  收藏  举报