Pwnable.kr的第6道题目random的writeup。
首先连接题目,查看当前目录:
查看题目的源码random.c:
可以看到程序首先调用rand()生成随机数random,若输入的key与random异或的值为0xdeadbeef,即可得到flag,关键是要知道随机数random的值。rand函数并不是真正的随机数生成器,rand()根据srand函数提供的种子生成随机序列,若在第一次调用rand函数之前没有调用srand生成种子seed,系统会将种子seed设置为1。若种子相同,则得到的随机序列也相同。因此,在该程序中,每次产生的随机数random其实是不变的。可以使用gdb调试程序,查看生成的random的值。
我们知道,程序在执行完rand函数后,随机数即返回值存储在eax寄存器中,在0x400606处设置断点,查看eax的值:
因此,key = random ^ 0xdeadbeef = 1804289383 ^ 0xdeadbeef = 3039230856,输入3039230856,得到flag: