Pwnable.kr [Toddler's Bottle]의 6번째 문제인 random 입니다. 

늑대 일러스트네요

바로 파일 확인하고 C코드 해석해보겠습니다.

#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;
}

분명 random코드지만 헤더 <stdlib.h>이 포함 되어 있지 않고 seed값도 들어있지 않기 때문에 rand함수에서 나오는 난수는 항상 규칙적일 것입니다.

 

이제 코드를 요약해보자면 저희가 필요한 값은 입력한 값, rand() 함수를 xor 한 값이 0xdeadbeef여야 한다는것입니다.

 

리눅스 환경에서 rand 코드를 실행시켜 보면 항상 규치적으로 난수가 나옴을 알 수 있습니다.

 

 

rand 함수에서 처음 나온 값인 1804289383 과 0xdeadbeef를 xor 연산해보면 3039230856이라는 값이 나옵니다.

 

이 값을 ./random 함수를 실행시킨 뒤 입력시켜주면 성공적으로 Flag를 얻을 수 있습니다.

 

성공적으로 Flag가 출력되었습니다!!

FLAG: Mommy, I thought libc random is unpredictable...

 

 

 

반응형
복사했습니다!