pwnable random
题目源码如下:
#include <stdio.h>
int main(){
unsigned int random;
random = rand(); // random value!
unsigned int key=0;
scanf("%d", &key);
if( (key ^ random) == 0xdeadbeef ){
printf("Good!\n");
system("/bin/cat flag");
return 0;
}
printf("Wrong, maybe you should try 2^32 cases.\n");
return 0;
}
程序意思就是我们输入的key,与rand()函数随机生成的一个数做异或运算,如果结果等于0xdeadbeef,就给flag。
然后查了一下rand()函数,这个函数调用时需要一个随机种子,srand()就是用来设定随机种子的函数,否则随机种子就会默认为1,就是假随机,每次其实都是同一个数
所以gdb打开,在main函数下断,然后一路ni,一直到执行完rand()函数,rand()函数的返回值存放在eax中,所以ni执行到给eax赋完值,然后查看eax里的值,就是rand()随机产生的数
可看出eax的值为0x6b8b4567,异或运算时可逆的(a^b=c, c^b=a),
3039230856就是我们需要的值,所以得到flag如下
今天本来打算练两个题,奈何下一个题太难,放过自己吧。明天找一个简单一点的 (T▽T)