[pwnable.kr] random(1 pt) :: Write-Up

두비니

·

2020. 2. 24. 22:08

 

 

 

 

 

 

Daddy, teach me how to use random value in programming!

ssh random@pwnable.kr -p2222 (pw:guest)

 

 

 

사실 이건 제목을 보자마자 알아버렸습니다,,

일단 random함수에 대한 기본적인 개형을 봅시다.

 

 

http://bitly.kr/lZJ4aJ3T

 

 

위 링크를 봐도 되고, 정리를 하자면 보통 이런 식으로 사용이 됩니다

 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(){
	srand(time(NULL));
    printf("%d", rand());
    
    return 0;
}

 

 

그냥 정말정말 간단한 코드를 짜보았는데, 여기서 중요한 것은 srand(time(NULL))이라는 부분입니다. 

일단 기존의 rand()함수는 난수가 생성되긴 하지만, 일정한 알고리즘을 따르기때문에 매번 같은 순서의 난수가 생성이 됩니다. 이렇게 이용한다면 진정한 "난수"라고 볼 수 없겠죠?

 

그래서 이용하는 함수가 srand()함수입니다. srand()함수는 rand함수에 이용하는 인자를 정해주는건데, 그걸 시간과 관련하여, 즉 time함수를 통해 정해주면 정말 무작위의 숫자가 선택되겠죠?

 

 

하여튼 이 기본지식을 가지고 문제코드를 봅시다.

 

 

random@pwnable:~$ cat 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;
}

 

srand함수로 seed를 정해주지 않았기때문에 그냥 첫번째난수를 알아내서, xor과정후 deadbeef가 되는 key를 알아내면 되겠군요.

 

 

그래서 첫번째 난수를 알아내기 위해 그냥 간단한 코딩을 하였습니다.

 

#include <stdio.h>

int main(){
	printf("%d\n", rand());

	return 0;
}

 

그리고나서 컴파일 후 확인해보면?

 

 

참고로 리눅스에서 컴파일하는방법은 gcc -o (컴파일후 파일명) (컴파일할 소스)

 

그럼 이 값이 random이라는 변수 안에 들어있는 값일거고, key는?

 

1804289383(dec) > 6B8B4567(hex)

 

xor은 역연산이 가능합니다.

B526FB88(hex) > 3039230856(dec)

 

 

즉 key는 30393039230856 :)

 

 

 

딱 1점짜리 문제였네요!