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;
}
觀察邏輯,發(fā)現(xiàn)需要用戶輸入一個(gè)key
岔绸,這個(gè)key
異或random
要等于0xdeadbeef
,而這個(gè)random
的值來源于rand()
函數(shù),這就牽扯到rand()
的知識(shí)了默色。
看下菜鳥教程中對(duì)rand()
的解釋
rand()
的內(nèi)部實(shí)現(xiàn)是用線性同余法做的,它不是真的隨機(jī)數(shù),因其周期特別長撕攒,故在一定的范圍里可看成是隨機(jī)的蒸苇。
rand()
返回一隨機(jī)數(shù)值的范圍在0 至 RAND_MAX
間磷蛹。RAND_MAX
的范圍最少是在32767
之間(int)
。用unsigned int
雙字節(jié)是65535
溪烤,四字節(jié)是4294967295
的整數(shù)范圍味咳。0~RAND_MAX
每個(gè)數(shù)字被選中的機(jī)率是相同的。
用戶未設(shè)定隨機(jī)數(shù)種子時(shí)檬嘀,系統(tǒng)默認(rèn)的隨機(jī)數(shù)種子為1
槽驶。
rand()
產(chǎn)生的是偽隨機(jī)數(shù)字,每次執(zhí)行時(shí)是相同的; 若要不同, 用函數(shù)srand()
初始化它鸳兽。
也就是說事實(shí)上random
的值是固定地捺檬。。贸铜。堡纬。
我們用gdb
調(diào)試,看下random
的值
random
=0x6b8b4567
我們將random
與 0xdeadbeef
異或就可以求得 key
,0x6b8b4567 ^ 0xdeadbeef = 0xb526fb88
,但是因?yàn)?code>key的傳入是%d
蒿秦,所以要傳換成十進(jìn)制:3039230856
flag
= Mommy, I thought libc random is unpredictable...