[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함수에 대한 기본적인 개형을 봅시다.
위 링크를 봐도 되고, 정리를 하자면 보통 이런 식으로 사용이 됩니다
#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;
}
그리고나서 컴파일 후 확인해보면?
그럼 이 값이 random이라는 변수 안에 들어있는 값일거고, key는?
1804289383(dec) > 6B8B4567(hex)
B526FB88(hex) > 3039230856(dec)
즉 key는 30393039230856 :)
딱 1점짜리 문제였네요!
'War Games > pwnable.kr' 카테고리의 다른 글
[pwnable.kr] leg(2 pts) :: Write-Up (0) | 2020.07.06 |
---|---|
[pwnable.kr] input(4 pts) :: Write-Up (0) | 2020.02.25 |
[pwnable.kr] passcode(10 pts) :: Write-Up (0) | 2020.01.28 |
[pwnable.kr] flag (7 pts) :: Write-Up (0) | 2019.11.10 |
[pwnable.kr] bof(5 pts) :: Write-Up (0) | 2019.11.09 |