Dreamhack - rev-basic-4 (reversing)

·2026년 3월 24일

Dreamhack-Writeups

목록 보기
52/52

rev-basic-4 (reversing)

문제 링크

https://dreamhack.io/wargame/challenges/18

문제 설명

Reversing Basic Challenge #4
이 문제는 사용자에게 문자열 입력을 받아 정해진 방법으로 입력값을 검증하여 correct 또는 wrong을 출력하는 프로그램이 주어집니다.

해당 바이너리를 분석하여 correct를 출력하는 입력값을 알아내세요.

획득한 입력값은 DH{} 포맷에 넣어서 인증해주세요.

예시) 입력 값이 Apple_Banana일 경우 flag는 DH{Apple_Banana}

풀이과정

  1. 주어진 .exe 파일을 IDA를 이용해 디컴파일 해줍니다. (f5)
if ( (unsigned int)sub_140001000(v4) )
  • v4 (입력값)를 검사 함수에 넣음
  • 결과가 0이 아니면 → 참(true)
sub_140001000(v4)

이 함수는 입력값이 참인지 거짓인지 검사하는 함수입니다.
2. 위 함수를 더블클릭해 더 자세히 알아봅니다.

for ( i = 0; (unsigned __int64)i < 0x1C; ++i )
  • 반복문. 0xiC=28이므로, 총 28글자를 검사합니다.
if ( ((unsigned __int8)(16 * *(_BYTE *)(a1 + i)) 
    | ((int)*(unsigned __int8 *)(a1 + i) >> 4)) 
    != byte_140003000[i] )
  • *(_BYTE *)(a1 + i) = input[i] 이므로, 전체를 치환.(보기 편하게)
    - (_BYTE *) → 1바이트로 보겠다
    • a1 = 문자열 시작 주소
    • a1 + i = input[i]의 위치
((unsigned __int8)(16 * input[i]) | (input[i] >> 4))
  • 16 * input[i] : 왼족으로 4칸 이동.
    - 4칸인 이유 : 컴퓨터는 2진수 사용!
    001에 2를 곱하면? 010 -> 왼쪽으로 한칸 이동.
    16을 곱하면? 2^4=4칸 이동.
  • input[i] >> 4 : 오른쪽으로 4비트 이동
  • | : 두 결과를 합침
    => 입력값을 뒤집어서 비교하는 문제!
    if) 'A' = 0x41 -> 0x14
  • 이를 byte_140003000[i] 와 비교해야 함!
  1. Hex View에서 byte_140003000[i]를 찾습니다.
    a. IDA 상단 메뉴
    View → Open subviews → Hex View
    b. 주소 이동
    G -> 140003000 입력
0000000140003000 24 27 13 C6 C6 13 16 E6 47 F5 26 96 47 F5 46 27 $'........&.G... 
0000000140003010 13 26 26 C6 56 F5 C3 C3 F5 E3 E3 00 00 00 00 00 .&&.............

전체 데이터 : 24 27 13 C6 C6 13 16 E6 47 F5 26 96 47 F5 46 27
13 26 26 C6 56 F5 C3 C3 F5 E3 E3
입력값을 뒤집습니다.

원본변환
2442 (B)
2772 (r)
1331 (1)
C66C (l)
C66C (l)
1331 (1)
1661 (a)
E66E (n)
4774 (t)
F55F (_)
2662 (b)
9669 (i)
4774 (t)
F55F (_)
4664 (d)
2772 (r)
1331 (1)
2662 (b)
2662 (b)
C66C (l)
5665 (e)
F55F (_)
C33C (<)
C33C (<)
F55F (_)
E33E (>)
E33E (>)

-> 최종 문자열 : Br1ll1ant_bit_dr1bble_<<_>>

  1. DH{} 사이에 위의 문자열을 삽입하였더니 최종적으로 문제를 해결할 수 있었습니다.

배운점

  • 아직까지 리버싱 문제는 많이 어려운 것 같습니다.
  • IDA 툴의 사용법이나 어셈블리어 등에 아직 익숙하지 않아, 리버싱 문제를 많이 풀어보며 디코딩된 c 코드를 보는 연습과, 어셈블리어 등에 익숙해져야겠다는 생각이 들었습니다.
profile
CTF 풀이 및 실습 중심 학습을 기록합니다.

0개의 댓글