본문 바로가기
Wargame Write-Up/HackCTF

[HackCTF] (Pwnable) random 풀이

by snwo 2020. 5. 26.

약간 리버싱느낌도 나는데, 기드라로까보자.


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' ) 꼭 붙여줘야한다.