rev-basic-3
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