흰싸라기 2022. 4. 5. 01:55

rev-basic-3 : https://dreamhack.io/wargame/challenges/17/

 

rev-basic-3

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

dreamhack.io

 

rev2와 동일하게 반복문 형태, 따라서 문자열 길이는 23으로 추측가능하다. 

 

다음 코드를 보면, 

movsxd  rax, [rsp+18h+var_18]
lea     rcx, byte_7FF7C1263000
movzx   eax, byte ptr [rcx+rax]

unk_7FF7B3203000에서 값을 현재 순서에 맞게 가져오는데 hex view에서 확인하면 아래와 같다. 

 

movsxd  rcx, [rsp+18h+var_18]
mov     rdx, [rsp+18h+arg_0]
movzx   ecx, byte ptr [rdx+rcx]

는, 내가 입력한 문자열 중 순서에 맞는 하나의 문자를 가져오는 코드이고

 

xor     ecx, [rsp+18h+var_18]
mov     edx, [rsp+18h+var_18]
lea     ecx, [rcx+rdx*2]

위와 같이 연산 후 값을 비교한다. 

([rsp+18h+var_18]는 rax값으로 생각하면 됨)

 

따라서, 연산의 반대로 적용해 풀어주면 되는데, 코드를 짜서 푸는 것이 좋을 것 같아 아래와 같이 코드를 작성해 풀었다. 

#include <iostream>
using namespace std;

int main() {
	for (int rax = 0; rax < 24; rax++) {
		int rcx;
		cin >> hex >> rcx; // 16진수로 입력받음

		rcx -= rax * 2;
		rcx ^= rax;

		cout << char(rcx); // 아스키코드로 변환
	}

	return 0;

 

코드를 실행해 정답을 확인하면,

더보기

 

답 : I_am_X0_xo_Xor_eXcit1ng