DreamHack - rev-basic-2

m0ng·2025년 4월 9일

[Reversing] rev-basic-2 문제풀이

correct를 출력하는 입력값을 찾으라고 한다.

파일을 받아서 실행을 해보면 아래와 같이
Input:에 특정 문자열이 flag 인거 같다.

Input 화면


값을 찾기 위해 x64dbg 툴 사용

input이 입력 받는 부분이라 문자열을 검색해본다.

문자열 검색

문자열을 보면 Input, correct, wrong을 출력하는 것을 확인할 수 있다.

일단 Input 문자열 기준으로 들어가본다.

Input 진입

Input 출력 이후 Correct, Wrong을 판별하는 흐름 사이의
00007FF7D01D116E 부분이 입력값을 판별하는 함수로 보인다.


흐름 분석

00007FF7D01D114C | lea rcx,[7FF7D01D2210]       ; rcx = "Input : "
00007FF7D01D1153 | call chall2.7FF7D01D11B0     ; puts("Input : ")
00007FF7D01D1158 | lea rdx,[rsp+20]             ; rdx = 입력 저장 위치
00007FF7D01D115D | lea rcx,[7FF7D01D221C]       ; rcx = "%256s"
00007FF7D01D1164 | call chall2.7FF7D01D1210     ; scanf("%256s", input)
00007FF7D01D1169 | lea rcx,[rsp+20]             ; rcx = input
00007FF7D01D116E | call chall2.7FF7D01D1000     ; 비교 함수 호출
입력값을 [rsp+20]에 저장
그걸 rcx에 담아 call로 함수 호출

내부 분석

00007FF7D01D1000 | mov [rsp+8], rcx        ; rcx (입력 주소) 저장
00007FF7D01D1005 | sub rsp,18              ; 스택 공간 확보
00007FF7D01D1009 | mov [rsp], 0            ; 인덱스 i = 0 초기화
00007FF7D01D1010 | jmp 0x101A              ; 루프 진입

  movsxd rax, [rsp]        ; rax ← i
  cmp rax, 12              ; i >= 12?
  jae 0x1048               ; 12바이트 다 확인 → 성공

  lea rcx, [0x7FF7D01D3000]         ; 비교 대상 테이블 주소
  mov r8, [rsp+20]                  ; r8 ← 입력 문자열 주소
  movzx edx, byte ptr [r8 + rdx]    ; edx ← 입력[i]
  cmp [rcx + rax*4], edx            ; 입력[i] == 정답[i]?

→ 0x7FF7D01D3000 주소부터 4바이트 간격으로 정답 배열이 저장되어 있음
→ 총 12바이트의 입력을 비교함

결과

0x7FF7D01D3000 주소를 Dump 창에서 확인해보면:

해당 위치에 4바이트 간격으로 문자열 "Comp4re_the_arr4y"가 들어 있다.

결론은 "Comp4re_the_arr4y"이라는 flag 값이 나온다.

0개의 댓글