-
rev-basic-5,6리버싱 엔지니어링/드림핵 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}
'리버싱 엔지니어링 > 드림핵' 카테고리의 다른 글
rev-baic-9 (0) 2022.05.03 rev-baic-7,8 (0) 2022.04.19 rev-basic-4 (0) 2022.04.05 rev-basic-3 (0) 2022.04.05 rev-basic-1,2 (0) 2022.04.02