pwnable.kr [Toddler's Bottle] - random

Daddy, teach me how to use random value in programming!

ssh random@pwnable.kr -p2222 (pw:guest)

c语言中取随机数函数rand()为伪随机,需要依赖srand()提供的随机数种子seed。如果每次seed都设相同值,rand()所产生的随机数值每次就会一样。没有置随机数种子直接调用rand(),得到的结果也是一样。
题目源码如下:

/* ssh random@pwnable.kr -p2222 (pw:guest) */
#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;
}

使用gdb调试查看random的值,或者本体直接跑rand()得到固定的一个random的值。(这里需要严格在Linux中取指,不同的操作系统会影响这个定值的结果。)
笔者在这里使用本地调试取这个random的值:(这里注意数据定义为unsigned int 或long,因为结果3039230856>2^31,超出了int的上限)

#include <stdio.h>

int main()
{
    unsigned int random;
    random = rand();
    unsigned int temp = 0xdeadbeef ^ random;
    printf("%u\n", random);
    printf("%u\n", temp);
    return 0;
}

结果如下:

./random
1804289383
3039230856

正确输入后即可得到flag。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容