random
先file看一下
IDA打开
可以看到程序读入 v4 ,跟 v5 进行异或操作,若结果为 0xDEADBEEF ,则可以读取到flag。其中 v5的初始值由 rand()指定。
rand()
rand()产生伪随机数。伪随机数的“随机”之处是它的种子(seed)。种子确定后,按照一定算法所计算出来的随机数序列也就完全确定了。
C语言中,可以通过 srand() 来指定种子(seed)。如果用户在调用 rand()之前没有调用过 srand(),则系统默认种子为 1 。测试如下:
|
|
Exp
由以上分析可知,v5的值其实是确定的,为 1804289383。
而判断条件(v5 ^ v4) == 0xDEADBEEF 等价于 v4 == 0xDEADBEEF ^ v5 。运算可得 1804289383 ^ 0xDEADBEEF = 3039230856。所以我们要给 v4 传入 3039230856 。
|
|
FLAG: Mommy, I thought libc random is unpredictable…