DASCTF八月赛的Crypto方向,拿下其他两道题很简单,但是这道最多人解出来的题反而解不出来。打完比赛回来看其他师傅写的wp,说是这是TSGCTF原题,所以直接放弃思考,上大佬的wp,我看看大佬这个wp,感觉这题还是有点东西的,里面涉及的基础的一些数学知识还是值得总结总结。
题目
assert(len(open('flag.txt', 'rb').read()) < 50)
assert(str(int.from_bytes(open('flag.txt', 'rb').read(), byteorder='big') << 10000).endswith('1862790884563160582365888530869690397667546628710795031544304378154769559410473276482265448754388655981091313419549689169381115573539422545933044902527020209259938095466283008')
题目就两行,意思大概就是有个长度不超过50的flag,让它右移10000个二进制位,然后截下来最后175个十进制位,让我们通过截下来的175个十进制位还原flag。
分析
本题最大的障碍就是没有用数学的方式来分析这道题,我之前在想最后这些十进制位和原来的flag之间有怎样的关联,比如flag的最后一个二进制位怎么影响最后剩下来的这些尾数,然后还想一位一位往上推,总之路子走错了。
题目也有提示,ezmath嘛,跟数学有关,这里最好的解决方案还是用数学式子来表示其中的关系。

本文解析了一道Crypto方向的竞赛题目,通过逆元思想解决右移并取尾数的加密问题,揭示了2**10000的逆元在还原Flag中的关键作用。最终给出了详细的求解步骤和flag:flag{90ee7e8df270bf5133a95ff904a059b8}

4087

被折叠的 条评论
为什么被折叠?



