Wargame/HackCTF

[HackCTF] Random_key

핏디 2021. 8. 23. 12:45
SMALL

[문제]

 

 


[풀이]

바이너리를 실행해보면 key 값을 입력 받아 인증이 되면 flag를 출력하고 그렇지 않으면 Nah.. 를 출력하도록 되어 있는 것 같다.

 

file 명령어를 통해 64bit 바이너리임을 확인할 수 있고,

 

GOT Overwrite는 가능하지만 shellcode 삽입은 불가하다는 것을 알 수 있다.

 

코드를 확인해보면 15~17에서 rand 함수를 호출해서 random 값과 입력 값이 일치해야 flag를 출력하도록 되어있다. 

 

rand 함수를 그냥 쓸 경우 seed 값이 없어 한 번 설정된 random 값이 실행할 때마다 고정적으로 출력된다.

if) 1 2 3 4 5가 처음 rand 함수 실행해서 출력되었다면 다시 실행해도 1 2 3 4 5가 출력된다는 것!

 

따라서 seed 값을 부여한 srand함수를 통해 매번 rand값을 다르게 생성할 수 있는데, 0~32767의 범위 내의 값이 무작위로 출력된다.

 

문제에서 설정한 srand(time(0))은 1970년 1월 1일 이후의 경과된 시간을 초 단위로 반환하는 함수이다. 이를 현재 시간을 seed로 설정하였다고 판단할 수 있다.

 

그렇다면 서버에 접속하는 시간을 기준으로 seed 값이 생성되기 때문에 rand값을 구하는 코드를 작성해서 서버 접속과 연속적으로 연결되도록 설정하면 해결할 수 있을 것으로 보인다. 

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

int main(void){

        srand(time(0));
        printf("%d\n", rand());
        return 0;
}

이렇게 간단한 코드를 작성한 뒤에 컴파일 하여 실행해보면 다음과 같다.

이것이 가능한 이유는 바이너리 실행과 접속을 연속적으로 할 수 있다는 의미는 아래의 캡쳐본과 같이 초 단위로 seed 값이 바뀌기 때문에 그 안에 바이너리 실행까지 된다면 고정된 seed 값으로 문제까지 해결할 수 있기 때문이다!

 

* pwntool 속의 ctypes 모듈을 이용해서도 할 수 있다고 한다..!

LIST

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

[HackCTF] 1996  (0) 2021.08.23
[HackCTF] Poet  (0) 2021.08.22
[HackCTF] yes_or_no  (0) 2021.08.15
[HackCTF] BOF_PIE  (0) 2021.07.26
[HackCTF] Offset  (0) 2021.07.25