이 문제의 풀이 방법은 아래와 같다.
- 프로그램은 난수를 생성(v6)하고, 사용자 입력(v7)을 받음.
- v6과 v7을 XOR 연산한 결과를 16진수로 변환하여 s에 저장.
- s를 뒤집어 s1에 저장.
- s1이 "a0b4c1d7"와 일치하면 "Congrats!"와 함께 "./flag" 파일 내용을 출력.
- 다르면 "Try again" 출력.
즉, 이 프로그램은 XOR 연산을 활용한 간단한 난수 기반 패스코드 확인 방식이다.
v6 ^ v7의 16진수 결과가 "d7c1b4a0"(역순 저장된 "a0b4c1d7")가 되어야 통과할 수 있다.
따라서 XOR 연산, 랜덤값 생성 원리에 대해 알아보겠다.
1. XOR 연산
XOR(배타적 논리합) 연산은 두 개의 비트가 다를 때 1을 반환하고, 같을 때 0을 반환하는 논리 연산이다. 이 연산은 숫자와 문자 모두에 적용될 수 있다. 아래에서 숫자와 문자에 대한 XOR 연산을 자세히 보겠다.
숫자의 XOR 연산
이진수 비트 단위 연산: 숫자에 대한 XOR 연산은 이진수로 표현된 각 비트에 대해 수행된다. 예를 들어, 두 숫자 5와 3의 XOR 연산은 아래와 같다.
5의 이진수 표현: 0101
3의 이진수 표현: 0011
XOR 연산 수행:
0101
⊕ 0011
-------------
0110
결과는 6.
즉, 5⊕3=6
문자의 XOR 연산
ASCII 값 기반 연산: 문자의 XOR 연산은 각 문자의 ASCII 값에 대해 수행된다. 예를 들어, 문자 'A'와 'B'의 XOR 연산을 해보겠다.
'A'의 ASCII 값: 65 (이진수: 01000001)
'B'의 ASCII 값: 66 (이진수: 01000010)
XOR 연산 수행:
01000001
⊕ 01000010
---------------------
00000011
결과는 3.
즉, A⊕B=3
XOR 연산의 특징
- 대칭성: XOR 연산은 대칭적이며, A⊕B=B⊕A가 성립한다.
- 자기 역원: 어떤 수와 자기 자신을 XOR 연산하면 0이 됩니다. 즉, A⊕A=0이다.
- 암호화 기법: XOR 연산은 데이터 암호화 및 복호화에 널리 사용된다. 예를 들어, 비밀 키와 데이터를 XOR하여 암호화할 수 있다.
2. 랜덤값 생성 원리
C 언어에서 랜덤값을 생성하고 출력하는 원리는 주로 stdlib.h 헤더 파일에 포함된 함수들을 사용하여 구현된다. 랜덤값을 생성하기 위해 일반적으로 rand() 함수를 사용하며, 이 함수는 0부터 RAND_MAX (보통 32767)까지의 정수형 랜덤값을 반환한다.
랜덤값을 생성하는 기본적인 과정은 다음과 같다.
- 헤더 파일 포함: stdlib.h와 time.h를 포함합니다. time.h는 시드 값을 설정하기 위해 사용
- 시드 설정: srand() 함수를 사용하여 랜덤 숫자의 시드를 설정. 일반적으로 현재 시간을 시드로 사용하여 매번 다른 랜덤값을 생성
- 랜덤값 생성: rand() 함수를 호출하여 랜덤값을 생성
- 출력: 생성된 랜덤값을 출력
srand 함수는 C 언어에서 난수 생성기의 초기화를 담당하는 함수이다. 이 함수는 난수 생성에 사용될 시드 값을 설정하여, rand 함수가 생성하는 난수의 패턴을 결정한다.
srand 함수의 기본 개념
정의: srand는 "seed random"의 약자로, 난수 생성기의 시드를 설정하는 함수이다.
헤더 파일: 이 함수를 사용하기 위해서는 <stdlib.h> 헤더 파일을 포함해야 한다.
함수 원형: void srand(unsigned int seed);
srand 함수의 작동 원리
시드 값: srand 함수는 매개변수로 전달된 시드 값을 사용하여 난수 생성기의 초기 상태를 설정한다. 이 시드 값이 동일하면, rand 함수는 항상 동일한 난수 시퀀스를 생성한다.
예시: srand(997);는 난수 생성기가 997번 시드에 해당하는 난수 리스트를 선택하게 한다.
난수 생성 과정
1. 시드 설정: 일반적으로 srand는 프로그램 실행 시 매번 다른 난수를 생성하기 위해 time(NULL)을 사용하여 현재 시간을 시드로 설정한다. 이 방법은 매초마다 다른 시드 값을 제공하여 난수의 예측 가능성을 줄인다.
2. 난수 생성: rand 함수는 srand로 설정된 시드 값을 기반으로 난수를 생성한다. 이 함수는 0부터 RAND_MAX까지의 정수를 반환한다.
srand와 rand의 관계
srand로 시드를 설정한 후, rand를 호출하면 그 시드에 따라 난수가 생성된다. 만약 동일한 시드를 사용하면, 매번 동일한 난수 시퀀스가 생성된다.
정리
srand 함수는 난수 생성기의 시드를 설정하여 난수의 패턴을 결정하는 중요한 역할을 한다. 이를 통해 프로그래머는 예측 가능한 난수 시퀀스를 생성하거나, 매번 다른 난수를 생성할 수 있다.
'SWUFORCE 워게임👊🏻' 카테고리의 다른 글
| [Dreamhack] web ; xss -1 추가 공부 (0) | 2025.04.08 |
|---|---|
| [Dreamhack] level 1 ; web ; xss -1 (0) | 2025.04.02 |
| [Dreamhack] Beginner ; rev ; simple-operation (0) | 2025.04.01 |
| [Dreamhack] level1 ; web ; ctrl-c (0) | 2025.03.25 |
| [Dreamhack] baby-ai ; misc (0) | 2025.02.11 |