填数游戏
分析
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 | def printList(li): |
参考
【逆向笔记】2017年全国大学生信息安全竞赛 Reverse 填数游戏
Nonstandard
分析
输入的flag长度为28,加密后跟指定数据逐字比较,一致才能返回
根据byte_402120
段的数据 gQwjoQ66gQwioQ71jMQS2QBvggajnQy1gHpEjQHEjnrZ7===
推测是变形的base32算法,查看加密函数sub_401070
发现确实是(照应标题)
点开加密函数sub_401070
的初始化函数sub_401000
我是直接执行后动态调试,下断点得到pLoKiMjUnHyBgTvFrCdExSwZaQ765321
- 将偶数位变为小写字母
- 再将字符串进行逆序
- 后面加上765321
i春秋2017第二届广东省强网杯线上赛Nonstandard题目writeup
解密脚本
1 | import base64 |
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用“=”补足