[HackCTF] Random Key 풀이 (200p)
Wargame/HackCTF

[HackCTF] Random Key 풀이 (200p)

풀이

Arch:     amd64 - 64 - little
RELRO : Partial RELRO
Stack : No canary found
NX : NX enabled
PIE : No PIE(0x400000)


먼저 random을 실행해보자.

단순한 Key값 검증 프로그램인가?

IDA를 이용해 슈도코드를 확인해보자.

int __cdecl __noreturn main(int argc, const char **argv, const char **envp)
{
  unsigned int v3; // eax
  int v4; // [rsp+0h] [rbp-10h]
  int v5; // [rsp+4h] [rbp-Ch]
  unsigned __int64 v6; // [rsp+8h] [rbp-8h]

  v6 = __readfsqword(0x28u);
  setbuf(_bss_start, 0LL);
  v4 = 0;
  v3 = time(0LL);
  srand(v3);
  v5 = rand();
  puts("============================");
  puts(asc_400948);
  puts("============================");
  printf("Input Key : ", 0LL, *(_QWORD *)&v4, v6);
  __isoc99_scanf("%d", &v4);
  if ( v5 == v4 )
  {
    puts("Correct!");
    system("cat /home/random/flag");
    exit(0);
  }
  puts("Nah...");
  exit(0);
}

pwnable.kr에서는 seed값을 사용하지 않은, rand 함수의 취약점을 이용한 문제였다.

그러나 이번 문제에서는 time(0) 값이 seed값으로 설정되어있다.

우리가 입력한 값과, rand 함수로 출력된 값이 같아야 하는데.. 방법이 없을까?

 

이 문제는 바로 seed값을 time(0)으로 설정한게 문제다.

파이썬의 ctypes 모듈을 이용해, time(0)이 seed로 설정되어 있는 rand 함수를 호출할 수 있다면?

 

먼저, 랜덤 값을 받기 위한 C 파일 하나를 생성해준다.

여기서 srand(tm+1) 해준 이유는, CTF 서버에 들어가는 시간을 계산한 것이다.

    //time.c
  1 #include <stdio.h>
  2 #include <time.h>
  3
  4 int whattime()
  5 {
  6         int tm = time(0);
  7         srand(tm+1);
  8         int random = rand();
  9         return random;
 10 }

다음 time.c를 컴파일 해준다.

gcc -o time.so -shared -fPIC time.c

파이썬을 이용한 페이로드는 다음과 같다.

  1 from pwn import *
  2 import ctypes
  3
  4 p = remote('ctf.j0n9hyun.xyz', 3014)
  5
  6 c_code = ctypes.cdll.LoadLibrary('./time.so')
  7 c_func = c_code.whattime
  8
  9 p.sendlineafter(': ', str(c_func()))
 10 p.interactive()

'Wargame > HackCTF' 카테고리의 다른 글

[HackCTF] Beginner_Heap 풀이 (250p)  (0) 2020.12.28
[HackCTF] RTL_Core 풀이 (250p)  (0) 2020.08.24
[HackCTF] 1996 풀이 (200p)  (0) 2020.08.23
[HackCTF] poet 풀이 (200p)  (0) 2020.08.23
[HackCTF] g++ pwn 풀이 (200p)  (0) 2020.08.23