rev-basic-5,6
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}