728x90

내가 하는 스터디 활동중에 리버싱 문제를 만드는 활동이 있다. 그 활동을 하면서 구글링도 많이 해보고 주위에 잘하는 분들께도 많이 물어봤는데 구글링을 하면서 리버싱 문제를 푸는 블로그는 진짜 많은데 리버싱 문제를 만드는 블로그는 거의 없었다. 그래서 이번 포스팅은 내가 잘하시는 분들께 들은 것들과 내가 구글링하면서 찾은것들을 모아서 아주 간단한 리버싱 문제를 만들어 보는것으로 하려고한다.

 

 

일단 나는 visual studio 2017를 이용해서 문제를 만들었다. 컴퓨터를 포맷해서 버젼은 15.5.2이다. 기본적으로 이번 문제는 c++를 이용해서 만들어보려고 한다. c++를 좀더 능숙하게 쓰는데도 도움이 될것같다. 위와같이 기본적인 틀을 잡아보았다.

 

 

일단 이번 컨셉은 암호다. 간단한 암호를 코딩했다.

 

 

다른곳에서 미리 키를 암호화 해놓고 그 암호화된 암호문을 가지고 그 암호문을 복호화한 값을, 즉 평문을 넣었을때 cc를 리턴하는 함수 tt를 만들었다.

 

 

그리고 위와 같이 aa를 정의해주고 tt함수의 값을 #pragma를 이용하여 data segment에 있는 .bbs(비초기화 데이터 영역)에 올려준다. 이러면 헥스덤프를 떠도 나오지 않는다.

 

 

그리고 main문도 이렇게 완성해주면 된다.

#include 
#include 
using namespace std;

char *decrypt(char *dest, const char *encryptstr);

char *tt() {
	char *cc = new char[100];
	cc = decrypt(cc, "TzdsRecUbswJ");
	return cc;
}

string aa;
int count = 0;
#pragma data_seg (."kpnc")
string passwd = tt();
#pragma data_seg ()
string buff = " ";

int main() {
	cout << "input pw: ";
	cin >> aa;

	if (aa != passwd)
		cout << "input error!" << endl;
	else
		cout << "correct!" << endl;

	system("pause");

	return 0;
}

char *decrypt(char *dest, const char *encryptstr) {
	char *origin;
	for (origin = dest; *encryptstr; dest++, encryptstr++) {
		if (isupper(*encryptstr)) {
			*dest = (*encryptstr - 'A' + 21) % 26 + 'A';
		}
		if (islower(*encryptstr)) {
			*dest = (*encryptstr - 'a' + 16) % 26 + 'a';
		}
		if (isdigit(*encryptstr)) {
			*dest = (*encryptstr - '0' + 7) % 10 + '0';
		}
		if (isalnum(*encryptstr) == 0) {
			*dest = *encryptstr;
		}
	}
	*dest = '\0';

	return origin;
}

 

이렇게 하면 완성본이 나오게 된다. 아주 기본적인 암호+리버싱 문제가 완성되었다.

 

 

+ Recent posts