
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-리버싱-엔지니어링-기초
제공된 chall2.exe파일을 실행하면 input : 이라는 문자열이 출력되며 사용자의 입력을 받는 프로그램임을 알 수 있습니다. 플래그 값을 입력하면 "Correct"가 뜨는 구조입니다.
x64dbg을 이용해 chall2.exe 파일을 열어봅니다.
우클릭 후 다음을 찾기 > 모든 시스템 모듈 > 문자열 참조 을 통해 "Correct" 문자열을 검색합니다.

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

input : 을 출력합니다.[rsp+20] 주소에 저장합니다.[rsp+20]을 검사합니다.eax == 0 라면 wrong, 같다면 correct을 출력합니다.입력한 값이 정답인지 검사하는 함수인 00007FF74947116E | E8 8DFEFFFF| call chall2.7FF749471000| 이 핵심함수임을 알 수 있었습니다.
더블클릭해 그 함수에 들어가 보았습니다.
아래와 같은 함수들이 나옵니다.

cmp dword ptr [rcx + rax*4], edx : rcx + rax*4 위치의 4바이트 값과 입력 문자의 1바이트 값(4바이트로 확장된 값)을 비교합니다.rcx = 0x7FF749473000 을 lea 로 잡았기 때문에 기준(base) 주소가 0x7FF749473000 이라는 걸 알 수 있습니다.lea 는 메모리에서 값을 가져오는 게 아니라, 주소 자체를 레지스터에 넣는 명령입니다.lea로 잡은 주소는 플래그, 시리얼, 암호화 테이블 시작 주소일 확률이 높습니다!)ASCII를 확인합니다. 나타난 문자를 순서대로 조합하면 플래그를 획득할 수 있습니다.
chall2.exe) prompts for user input and prints "Correct" or "Wrong" based on the input.[rsp+20] by calling call chall2.7FF749471000.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).