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。