pwn 练习笔记 暑假的第三天 rand函数

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)


猜你喜欢

转载自blog.csdn.net/qq_38783875/article/details/81055962