tmxklab

[HackCTF/Pwnable] Random Key 본문

War Game/HackCTF

[HackCTF/Pwnable] Random Key

tmxk4221 2020. 2. 23. 22:29

1. 문제확인

 

nc ctf.j0n9hyun.xyz 3014

 

1) 접속

key값을 입력하라는 출력창이 뜨고 입력을 받을 수 있는 프로그램

 

2) IDA(Pseudocode)확인 - main()

- time함수에 널 값을 넣어 1970년 1월 1일 0시(UTC 타임존)이후부터 인자 값까지 현재까지 흐른 초 수를 계산하여 v3에 저장하여 반환

- srand함수에 v3인자를 넣어 v3인자를 기반으로 난수를 초기화

- rand함수를 통해 실제 난수 값을 v5변수에 저장

- 사용자의 입력 값을 저장하는 v4와 난수 값이 저장된 v5와 비교하여 참이면 flag값을 보여주며 종료

 

3) $checksec를 통해 elf파일에 걸린 메모리 보호기법 확인


2. 접근방법

1) 사용자의 입력 값의 저장하는 변수와 난수를 저장하는 변수 확인

- [rbp-0x10] : 사용자의 입력 값의 저장하는 변수가 위치한 곳

- [rbp-0xc] : 난수를 저장하는 변수가 위치한 곳

- 따라서, 사용자가 입력하 값의 저장하는 변수보다 난수를 저장하는 변수가 스택 윗 부분(낮은 주소 방향)에 있으므로 bof를 통해 덮어쓸 수 있음

 

추측) rand함수는 srand를 통해 기준 값을 정하여 난수를 만드는 것이므로 서버의 seed와 자신이 만든 seed를 같게 한다면 동일한 난수 값을 찾을 것이다.

 

추측이 맞는지 확인하기 위해 간단한 코드를 작성하여 실행해보자

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

int main()
{
        int my, server;
        srand(time(NULL));
        my = random();
        srand(time(NULL));
        server = random();
        printf("my num : %d server: %d ", my, server);

        return 0;
}

 

- 실행 결과

똑같은 난수 값이 생성되는 것을 확인할 수 있다.

 

 

2) 결론

  • 서버 시작 시간과 맞춰서 로컬에서 작성한 난수 값을 출력하는 프로그램을 실행시키면 동일한 seed를 기반으로 난수 값이 나오므로 이를 통해 문제를 해결한다.

3. 풀이

1) 서버 프로그램과 동일하게 랜덤 값을 출력하는 프로그램 작성

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

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

        return 0;
}

 

2) 공격 실행

세미콜론(;)을 붙여 프로그램 실행과 동시에 서버를 시작함

 

'War Game > HackCTF' 카테고리의 다른 글

[HackCTF/Pwnable] Beginner_Heap  (0) 2020.03.07
[HackCTF/Pwnable] RTL_Core  (0) 2020.02.23
[HackCTF/Pwnable] 1996  (0) 2020.02.23
[HackCTF/Pwnable] Poet  (0) 2020.02.22
[HackCTF/Pwnable] g++ pwn  (0) 2020.02.22
Comments