pwnable.kr
查看源碼
#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
,這個key
異或random
要等于0xdeadbeef
,而這個random
的值來源于rand()
函數,這就牽扯到rand()
的知識了。
看下菜鳥教程中對rand()
的解釋
rand()
的內部實現是用線性同余法做的,它不是真的隨機數,因其周期特別長,故在一定的范圍里可看成是隨機的。
rand()
返回一隨機數值的范圍在0 至 RAND_MAX
間。RAND_MAX
的范圍最少是在32767
之間(int)
。用unsigned int
雙字節是65535
,四字節是4294967295
的整數范圍。0~RAND_MAX
每個數字被選中的機率是相同的。
用戶未設定隨機數種子時,系統默認的隨機數種子為1
。
rand()
產生的是偽隨機數字,每次執行時是相同的; 若要不同, 用函數srand()
初始化它。
也就是說事實上random
的值是固定地。。。。
我們用gdb
調試,看下random
的值
random
=0x6b8b4567
我們將random
與 0xdeadbeef
異或就可以求得 key
,0x6b8b4567 ^ 0xdeadbeef = 0xb526fb88
,但是因為key
的傳入是%d
,所以要傳換成十進制:3039230856
flag
= Mommy, I thought libc random is unpredictable...