Dreamhack - rev-basic-2 (리버싱 엔지니어링)

·2025년 7월 4일

Dreamhack-Writeups

목록 보기
14/52
post-thumbnail

rev-basic-2

문제 링크

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

문제 설명

이 문제는 사용자에게 문자열 입력을 받아 정해진 방법으로 입력값을 검증하여 correct 또는 wrong을 출력하는 프로그램이 주어집니다.
해당 바이너리를 분석하여 correct를 출력하는 입력값을 찾는 문제입니다.

드림핵의 rev-basic-0, rev-basic-1 문제와 매우 유사합니다.
rev-basic-0 문제 풀이 링크 : https://velog.io/@yunaa/Dreamhack-rev-basic-0-리버스-엔지니어링-기초
rev-basic-1 문제 풀이 링크 : https://velog.io/@yunaa/Dreamhack-rev-basic-1-리버싱-엔지니어링-기초

풀이과정

  1. 제공된 chall2.exe파일을 실행하면 input : 이라는 문자열이 출력되며 사용자의 입력을 받는 프로그램임을 알 수 있습니다. 플래그 값을 입력하면 "Correct"가 뜨는 구조입니다.

  2. x64dbg을 이용해 chall2.exe 파일을 열어봅니다.

  3. 우클릭 후 다음을 찾기 > 모든 시스템 모듈 > 문자열 참조 을 통해 "Correct" 문자열을 검색합니다.

  4. "Correct" 문자열이 출력되는 코드 근처에서 다음과 같은 흐름을 확인할 수 있습니다.

    • 먼저 사용자에게 input : 을 출력합니다.
    • 이후 사용자의 입력 포인터를 [rsp+20] 주소에 저장합니다.
    • 00007FF74947116E | E8 8DFEFFFF| call chall2.7FF749471000| 는 검사함수로, 입력을 저장한 [rsp+20]을 검사합니다.
    • 입력값이 플래그 값과 다르다면, 즉 eax == 0 라면 wrong, 같다면 correct을 출력합니다.
  5. 입력한 값이 정답인지 검사하는 함수인 00007FF74947116E | E8 8DFEFFFF| call chall2.7FF749471000| 이 핵심함수임을 알 수 있었습니다.

  6. 더블클릭해 그 함수에 들어가 보았습니다.

  7. 아래와 같은 함수들이 나옵니다.

  • cmp dword ptr [rcx + rax*4], edx : rcx + rax*4 위치의 4바이트 값과 입력 문자의 1바이트 값(4바이트로 확장된 값)을 비교합니다.
  • rcx = 0x7FF749473000lea 로 잡았기 때문에 기준(base) 주소가 0x7FF749473000 이라는 걸 알 수 있습니다.
  • 이때 lea 는 메모리에서 값을 가져오는 게 아니라, 주소 자체를 레지스터에 넣는 명령입니다.
    -> 이후 rcx 를 기준으로 플래그(혹은 비교 테이블) 값을 배열처럼 접근하려는 목적입니다.
    (+ lea로 잡은 주소는 플래그, 시리얼, 암호화 테이블 시작 주소일 확률이 높습니다!)
  1. 00007FF749471028 | 48:8D0D D11F0000 | lea rcx, qword ptr ds:[7FF749473000] 을 더블클릭해 ASCII를 확인합니다. 나타난 문자를 순서대로 조합하면 플래그를 획득할 수 있습니다.

배운점

  • 기본적인 리버싱에 대해 익힐 수 있었습니다.
  • x64dbg 사용법을 익히고, 디버거를 통해 실제 실행 흐름을 분석할 수 있었습니다.
  • 어셈블리 언어로 입력된 코드를 해석하는 법을 배워볼 수 있었습니다.
  • lea 명령어가 주소 자체를 레지스터에 넣기 위한 용도임을 이해할 수 있었습니다.
  • 주소를 기준으로 레지스터에 담긴 값의 의미를 분석하고 추적하는 것이 중요하다는 것을 배웠습니다.
  • 리버싱 문제를 풀 때 디버깅 툴로 동작을 실시간으로 관찰하며 접근하면 문제를 빠르게 풀 수 있다는 것을 깨달았습니다.

Summary (English)

  • The given binary (chall2.exe) prompts for user input and prints "Correct" or "Wrong" based on the input.
  • Opened the binary in x64dbg and searched for the "Correct" string to locate the validation routine.
  • Found the program checks user input stored at [rsp+20] by calling call chall2.7FF749471000.
  • Inside this function:
    • lea rcx, [0x7FF749473000] loads the base address into rcx.
    • cmp dword ptr [rcx + rax*4], edx compares input characters with values at this base address (likely the flag).
  • By following this address in the ASCII dump, we could directly read and reconstruct the flag from memory.
  • This allowed flag extraction without brute-forcing by using live debugging to analyze the program’s input check mechanism.
profile
CTF 풀이 및 실습 중심 학습을 기록합니다.

0개의 댓글