약간 리버싱느낌도 나는데, 기드라로까보자.
void main(void)
{
time_t tVar1;
long in_FS_OFFSET;
int local_18;
int local_14;
undefined8 local_10;
local_10 = *(undefined8 *)(in_FS_OFFSET + 0x28);
setbuf(stdout,(char *)0x0);
local_14 = 0;
local_18 = 0;
tVar1 = time((time_t *)0x0);
srand((uint)tVar1);
local_14 = rand();
puts("============================");
puts("======= 인증 프로그램 ======");
puts("============================");
printf("Input Key : ");
__isoc99_scanf(&DAT_00400978,&local_18);
if (local_14 == local_18) {
puts("Correct!");
system("cat /home/random/flag");
/* WARNING: Subroutine does not return */
exit(0);
}
puts("Nah...");
/* WARNING: Subroutine does not return */
exit(0);
}
int 로 입력을 받아서 BOF 로 랜덤값을 조작할 수 없다.
하지만, time 값을 가져와 rand 함수로 난수를 생성하는걸 볼 수 있다.
seed 값이 같으면 rand() 로 생성하는 값도 같다.
내컴퓨터에서 난수를 생성하는 프로그램과,
서버에서 난수를 생성하는 프로그램이 동시에 실행되면
rand() 값이 같을것이다.
내컴퓨터에서 난수를 생성하는 동시에 서버에 입력해보자.
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(void){
int seed=time(NULL);
srand(seed);
printf("%d\n",rand());
}
개행문자 ( '\n' ) 꼭 붙여줘야한다.