0x06 random
題目描述:
Daddy, teach me how to use random value in programming!
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;
}
分析代碼褒搔,本題主要是輸入一個(gè)key羞反,然后這個(gè)key與random隨機(jī)數(shù)異或后的結(jié)果等于0xdeadbeef观游,那么就可以得到flag了稽屏。
觀察代碼奖慌,發(fā)現(xiàn)這里的random隨機(jī)數(shù)是用rand()函數(shù)產(chǎn)生的一個(gè)偽隨機(jī)數(shù)抛虫,每次運(yùn)行程序的時(shí)候產(chǎn)生的隨機(jī)數(shù)都是相同的,所以在/tmp目錄下創(chuàng)建一個(gè)ran.c求出那個(gè)隨機(jī)數(shù)就好了简僧。代碼如下:
#include<stdio.h>
#include<stdlib.h>
void main(){
unsigned int random, result;
random = rand();
result = 0xdeadbeef ^ random;
printf("%x", result);
}
利用這段代碼得到了需要的key=0xb526fb88
這里有一個(gè)坑的地方就是一定要把這個(gè)書(shū)寫(xiě)成十進(jìn)制的數(shù)字建椰,即3039230856。
運(yùn)行./random 把3039230856輸入即可得到flag