-
rev-basic-4리버싱 엔지니어링/드림핵 2022. 4. 5. 21:04
rev-basic-4 : https://dreamhack.io/wargame/challenges/18/
rev-basic-4
Reversing Basic Challenge #4 이 문제는 사용자에게 문자열 입력을 받아 정해진 방법으로 입력값을 검증하여 correct 또는 wrong을 출력하는 프로그램이 주어집니다. 해당 바이너리를 분석하여 correct를 출
dreamhack.io
IDA로 실행해 보면,
코드는 rev-basic-3과 유사해보인다.
다만, 연산이 좀 늘어났다.
sar eax, 4
는 오른쪽으로 4번 시프트한다.
shl ecx, 4
는 왼쪽으로 4번 시프트
추가로 and, or 연산도 있기 때문에 rev-basic-3처럼 역연산을 하긴 힘들어보임
역연산이 불가능해서 좀 고민했는데, 아스키코드가 0~127이기 때문에 아스키코드별로 위의 연산을 진행하고
변환된 값과 변환되기 전 값을 배열로 저장하여 이용하는 방법이 생각났다.
따라서, 비교배열에 저장된 값을 입력하면
① 변환된 아스키코드값과 동일한 것을 찾고
② 찾은 값의 변환되기전 아스키코드값을 출력한다.
#include <iostream> using namespace std; int main() { int conv[256]; // 0h~ffh for (int i = 0; i < 128; i++) { // ascii 0~127 int eax = i / 16; int ecx = i * 16; ecx &= 240; // F0h eax |= ecx; conv[eax] = i; } for (int i = 0; i < 28; i++) { int h; cin >> hex >> h; cout << (char)conv[h]; } return 0;
- conv[] : 변환된 값이 인덱스, 저장된 데이터 값은 변환되기 전 값을 저장
- 4번 시프트는 2^4 = 16, 따라서 각각 /16, *16을 해준다.
- 코드와 동일하게 and, or 연산 진행
- conv[변환 값] = 변환 전 값
- 비교배열의 값은 변환 후 값이므로 인덱스를 통해 확인할 수 있음, 그리고 그 인덱스에 대응하는 데이터 값은 찾아야하는 문자가 된다.
이 코드에 비교배열에 저장된 값,
24 27 13 C6 C6 13 16 E6 47 F5 26 96 47 F5 46 27 13 26 26 C6 56 F5 C3 C3 F5 E3 E3 00
를 입력해 실행하면 정답을 찾을 수 있다.
정답
더보기답 : Br1ll1ant_bit_dr1bble_<<_>>
'리버싱 엔지니어링 > 드림핵' 카테고리의 다른 글
rev-baic-7,8 (0) 2022.04.19 rev-basic-5,6 (0) 2022.04.09 rev-basic-3 (0) 2022.04.05 rev-basic-1,2 (0) 2022.04.02 rev-basic-0 (0) 2022.03.31 - conv[] : 변환된 값이 인덱스, 저장된 데이터 값은 변환되기 전 값을 저장