0%

填数游戏&Nonstandard Writeup

填数游戏

分析

IDA打开,发现是C++代码。

check函数

看对象名字就是数独啊,初始化的内存大小为324=4*9*9,把_data_start_数据导出,脚本跑出数表,然后在线解一下。在线解数独
问题:005300000800000020070010500400005300010070006003200080060500009004000030000009700
答案:145327698839654127672918543496185372218473956753296481367542819984761235521839764
提交flag提示错误,所以没那么简单。
前面还有个set_sudu函数,点进去看看

要成功走到下一步就需要set_sudu返回0,也就是需要set_number返回1
点开set_number

需要*(_DWORD *)(a1 + 4 * (row + 9 * (_DWORD)this))为0,才能返回1。而这个指针指向的就是题目对应位置的数字,所以flag对应位置的要为0

脚本

1
2
3
4
5
6
7
8
9
10
11
def printList(li):
for i in range(len(li)):
print(li[i],end='')
quiz = list("005300000800000020070010500400005300010070006003200080060500009004000030000009700")
printList(quiz)
print()
solve=list("145327698839654127672918543496185372218473956753296481367542819984761235521839764")
for x in range(81):
if(solve[x]==quiz[x]):
solve[x] = '0'
printList(solve)

参考

【逆向笔记】2017年全国大学生信息安全竞赛 Reverse 填数游戏

Nonstandard

分析



输入的flag长度为28,加密后跟指定数据逐字比较,一致才能返回
根据byte_402120段的数据 gQwjoQ66gQwioQ71jMQS2QBvggajnQy1gHpEjQHEjnrZ7===推测是变形的base32算法,查看加密函数sub_401070发现确实是(照应标题)


点开加密函数sub_401070的初始化函数sub_401000

我是直接执行后动态调试,下断点得到pLoKiMjUnHyBgTvFrCdExSwZaQ765321

  1. 将偶数位变为小写字母
  2. 再将字符串进行逆序
  3. 后面加上765321
    i春秋2017第二届广东省强网杯线上赛Nonstandard题目writeup

解密脚本

1
2
3
4
5
6
7
8
9
import base64
import string

s = "gQwjoQ66gQwioQ71jMQS2QBvggajnQy1gHpEjQHEjnrZ7==="
table = "pLoKiMjUnHyBgTvFrCdExSwZaQ765321"
tr = str.maketrans(table,"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567")
strEnBase32 = s.translate(tr)
print(strEnBase32)
print(base64.b32decode(strEnBase32))

PS:有个字符串ZmxhZ3tmbGFnX2lzX25vdF9tZSF9没有引用,base64解出来是flag{flag_is_not_me!}

拓展

base64编码是用64(2的6次方)个ASCII字符来表示256(2的8次方)个ASCII字符,也就是三位二进制数组经过编码后变为四位的ASCII字符显示,长度比原来增加1/3。
同样,base32就是用32(2的5次方)个特定ASCII码来表示256个ASCII码。所以,5个ASCII字符经过base32编码后会变为8个字符(公约数为40),长度增加3/5.不足8n用“=”补足。
base16就是用16(2的4次方)个特定ASCII码表示256个ASCII字符。1个ASCII字符经过base16编码后会变为2个字符,长度增加一倍。不足2n用“=”补足