흰싸라기 2022. 4. 9. 00:30

rev-vasic-5 : https://dreamhack.io/wargame/challenges/19/

 

rev-basic-5

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

dreamhack.io

코드를 보면

add eax, ecx에서, (현재 인덱스를 i라 하면)

eax는 입력한 값 중 i번째 문자,

ecx는 입력한 값 중 i+1번째 문자이다.

 

만약 입력한 문자가 abcdef면

a+b, b+c, c+d ... 이런식으로 배열에 저장된 값과 비교하는 것이다. 

 

해결방법은, 마지막 값이 x라 하면, 마지막은 x+0이 되므로 마지막부터 계산하면 이 문제를 해결할 수 있다.

 

여기서 비교배열을 한번 보면, 

마지막 값 4C만 아스키코드값으로 표현할 수 있는 범위에 해당되는 것을 알 수 있다.

 

따라서 코드를 작성하면 아래와 같다.

#include <iostream>
#include <stack>
using namespace std;

int main() {
	stack<int> data;
	stack<char> ch;

	while (true) {
		int a;
		cin >> hex >> a;
		if (a == 0) break;

		data.push(a);
	}

	int d = 0;
	while (!data.empty()) { // 계산
		d = data.top() - d;
		ch.push((char)d);
		data.pop();
	}
	// 출력
	while (!ch.empty()) {
		cout << ch.top();
		ch.pop();
	}
	return 0;
}

 

  • 계산을 마지막 값부터 진행해야하므로, stack을 사용해 hex값을 저장한다.
  • 계산은 stack의 top에 저장된 값을 빼내어 계산한다
  • 계산한 값은 다시 stack 저장하고 모든 계산이 끝나면 출력한다
    • 뒤에서 부터 계산했기 때문에, 다시 반대로 출력해야 입력해야하는 값이 알맞게 나옴 

 

정답

더보기

답 : DH{All_l1fe_3nds_w1th_NULL}

 

 

rev-basic-6 : https://dreamhack.io/wargame/challenges/20/

 

rev-basic-6

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

dreamhack.io

basic6에서는 특이하게 두개의 주소에서 hex값을 받아와 비교하는데,

첫번째 값은 140003020에서 입력한 값만큼 +하여 hex값을 가져오고

두번째 값은 140003000에서 순서대로 가져와 두 값을 비교한다.

주소에 저장된 값은 다음과 같다.

따라서 140003020 ~ 14000309F 까지의 값을 find 배열에 저장하고 (아스키 코드값이 0~127이기 때문에)

140003000에 저장된 값을 find 배열에 몇번째에 같은 값이 있는지 순서대로 찾는다. 

 

이를 바탕으로 아래와 같이 코드를 작성한다

#include <iostream>
using namespace std;

int main() {
	int find[128];
	
	for (int i = 0; i < 128; i++) {
		int a;
		cin >> hex >> a;
		
		find[i] = a;
	}

	for (int i = 0; i < 0x12; i++) {
		int h;
		cin >> hex >> h;
		for (int j = 0; j < 128; j++) {
			if (find[j] == h) {
				cout << (char)j;
				break;
			}
		}
	}
	return 0;
}

 

  • int find[128] : 140003020 ~ 14000309F 주소에 저장된 hex값을 저장하는 배열
  • for(int i = 0; i < 0x12; i++){...} : 입력한 문자열이 find 배열에 몇번째에 위치했는지 확인 후, 그 위치의 인덱스를 ascii 코드 값으로 출력

위 코드에 맞는 값을 입력하면 정답이 나온다

 

정답

더보기

답 : DH{Replac3_the_w0rld}