Daddy, teach me how to use random value in programming!
ssh random@pwnable.kr -p2222 (pw:guest)
c語言中取隨機(jī)數(shù)函數(shù)rand()為偽隨機(jī),需要依賴srand()提供的隨機(jī)數(shù)種子seed官帘。如果每次seed都設(shè)相同值扔傅,rand()所產(chǎn)生的隨機(jī)數(shù)值每次就會(huì)一樣。沒有置隨機(jī)數(shù)種子直接調(diào)用rand(),得到的結(jié)果也是一樣义锥。
題目源碼如下:
/* 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調(diào)試查看random的值胃榕,或者本體直接跑rand()得到固定的一個(gè)random的值。(這里需要嚴(yán)格在Linux中取指僧家,不同的操作系統(tǒng)會(huì)影響這個(gè)定值的結(jié)果雀摘。)
筆者在這里使用本地調(diào)試取這個(gè)random的值:(這里注意數(shù)據(jù)定義為unsigned int 或long,因?yàn)榻Y(jié)果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;
}
結(jié)果如下:
./random
1804289383
3039230856
正確輸入后即可得到flag阵赠。