HackCTF의 Random Key 문제다. 전에 참여했던 ctf에서 비슷한 유형의 문제를 풀어봤기(삽질했기) 때문에 굉장히 쉽게 풀 수 있었다.
문제 바이너리를 실행해보면 다음과 같이 인증 프로그램이라는 문구가 출력되고 input key 입력을 받는다. 그 후 어떠한 로직을 통해 입력한 키 값이 올바른지 검증 후 결과를 출력해주는 것 같다.
코드는 간단하다. 문구들을 출력하고 scanf로 입력을 받는데(%d로 입력 받는다. 취약점 없다 ㅋㅋ), 입력 받은 값이 rand 함수를 통해 랜덤으로 생성한 값과 일치하다면 flag를 준다. 참고로 이 srand(time(NULL));를 써줬기 때문에 매번 생성되는 값은 랜덤하다.
겉보기에는 취약해보이지 않지만, 들으면 아!하고 무릎을 탁 칠만큼 기발한 공격 방법이 존재한다. srand 함수를 통해 현재 시간을 seed로 랜덤 값을 생성하기 때문에, 클라이언트에서도 똑같이 현재 시간을 시드로 랜덤 값을 생성한 뒤 그 값을 전달한다면 통과할 수 있을 것이다.
다만 서버에 요청하는 시간도 있으므로 아다리가 딱딱 맞아야지 인증에 성공할 수 있다.(그래도 브루트포스보다는 낫지 않을까..)
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main()
{
srand(time(NULL));
int a = rand();
printf("%d\n", a);
}
위와 같은 c언어 코드를 짰다. ctypes 모듈을 이용한다면 python으로 exploit을 할 수 있겠지만, 너무 간단하기 때문에 굳이 그럴 필요성은 못 느꼈다.
|(파이프)를 이용해 현재 시간을 시드로 생성한 랜덤 값을 서버에 전송해주면 Flag를 얻을 수 있다. 나 같은 경우는 한 번에 안됐기 때문에 여러 번 해보니 됐다.
GG!
'Wargame > HackCTF' 카테고리의 다른 글
[HackCTF] ROP (0) | 2021.07.21 |
---|---|
[HackCTF] RTL_Core (0) | 2021.07.20 |
[HackCTF] g++ pwn (0) | 2021.07.05 |
[HackCTF] RTL_World (0) | 2021.06.30 |
[HackCTF] Yes or no (0) | 2021.05.25 |