<드림핵_비기너_리버싱_simple-operation>



1. 서버 생성

2. 다운받은 문제 파일은 chall, flag 파일 두 개

3. 아이다로 코드 확인
<코드 분석>
char s1[9]; // 변환된 결과 저장
char s[9]; // XOR 연산 후 16진수로 변환된 값 저장
int v6, v7; // v6: 랜덤 숫자, v7: 사용자 입력 값
char *s2; // 비교할 문자열
int fd; // 파일 디스크립터
void *buf; // 파일에서 읽어온 데이터 저장
int v11, i; // v11: v6 XOR v7 저장, i: 루프 변수
v7 = 0;
v6 = 0;
v11 = 0;
get_rand_num(&v6); // v6에 난수 저장
printf("Random number: %#x\n", v6);
printf("Input? ");
__isoc99_scanf("%d", &v7);
- get_rand_num(&v6): v6에 랜덤 숫자 저장
- 랜덤 숫자를 16진수(%#x)로 출력
- 사용자 입력을 받아 v7에 저장
v11 = v6 ^ v7;
snprintf(s, 9u, "%08x", v6 ^ v7);
- v6과 v7을 XOR 연산하여 v11에 저장
- snprintf()를 이용해 16진수 형식("%08x")으로 s에 저장 (8자리 16진수 문자열)
for ( i = 0; i <= 7; ++i )
s1[i] = s[7 - i];
- s의 문자열을 뒤집어 s1에 저장
- s1에는 s의 역순이 저장됨
s2 = "a0b4c1d7";
if ( !strcmp(s1, "a0b4c1d7") )
{
puts("Congrats!");
puts((const char *)buf);
}
else
{
puts("Try again");
}
- s1과 "a0b4c1d7" 비교
- 같으면 "Congrats!"와 함께 buf(파일 내용) 출력
- 다르면 "Try again" 출력
=>
- 프로그램은 난수를 생성(v6)하고, 사용자 입력(v7)을 받음.
- v6과 v7을 XOR 연산한 결과를 16진수로 변환하여 s에 저장.
- s를 뒤집어 s1에 저장.
- s1이 "a0b4c1d7"와 일치하면 "Congrats!"와 함께 "./flag" 파일 내용을 출력.
- 다르면 "Try again" 출력.
즉, 이 프로그램은 XOR 연산을 활용한 간단한 난수 기반 패스코드 확인 방식이다.
v6 ^ v7의 16진수 결과가 "d7c1b4a0"(역순 저장된 "a0b4c1d7")가 되어야 통과할 수 있다.

4. input 계산하는 코드 작성

5. nc 접속하여 플래그 얻음

해결 완!! 👊🏻
'SWUFORCE 워게임👊🏻' 카테고리의 다른 글
| [Dreamhack] level 1 ; web ; xss -1 (0) | 2025.04.02 |
|---|---|
| [Dreamhack] rev ; simple-operation 추가 공부 (1) | 2025.04.01 |
| [Dreamhack] level1 ; web ; ctrl-c (0) | 2025.03.25 |
| [Dreamhack] baby-ai ; misc (0) | 2025.02.11 |
| [Webhacking] old-54 ; web (1) | 2025.02.08 |