本辣鸡要开始口胡了
前几天会长发了道练习题,本萌新尝试着做了一下,然后
第一次完全自己做出题真tm开心
随便看看
在Ubuntu里file得知是64位的文件
运行下试试
看起来就是要找到密码 废话!
一顿分析
用IDA打开
发现
- 密码长度为32个字符串
- 每4位组合成一个int类型的值
- 判断总共是8个方程
- 前四个int类型的数异或以后当成rand的种子
工具
- python的z3-solver库,linux下的
脚本
- 前四位(a,b,c,d)
1 | #!/usr/bin/env python |
解出来就得到密码前16位
- 后四位(e,f,g,h)
- 按照只要种子一样,得到的随机数数列也是相同的,所以很容易得到它的那些参数,但是这里我踩了个坑
- 这里随机数要用gdb单步出来
- 我开始没在Ubuntu里,在Windows下用C语言写的,然后得到的参数根本解不出来。。。
- 只要把前十六位解出来转换成字符串,再加上16位任意字符,凑成32位的密码,关注得到随机参数时eax的值,记录下来就是了,顺便还能检查一下前十六位有没有解错(解错会有跳转
- 至于为什么,
其实我也不知道大概是因为系统不同吧
1 | #!/usr/bin/env python |
同样,跑出来就是密码后16位
密码
将32位都跑出来以后,直接转换成字符串,就能得到密码
1 | int i; |
结果
然后就是激动人心的得到flag的过程了
看来没错了
总结
这个题讲真,虽然是很简单的那种题毕竟连我都会,但是那种激动的感觉真的没法用言语说明,就像发现新大陆的感觉,也可能是那种学了这么久能独立写出题的快乐吧