상세 컨텐츠

본문 제목

순천향대 정보보호 페스티벌 2011 W번 문제풀이[Decrypter]

0x10 정보보안/0x14 Reverse Engineering

by sweetchip 2012. 11. 28. 21:43

본문

반응형


안녕하세요 pgnsc입니다....


코딩문제 때문에 하루정도 헤맸습니다. ㅜ-ㅜ


다른 블로거 님의 글을 보고 약간의 힌트를 얻어서 완성시켰습니다.



2012/11/26 - [0x10 정보보안/0x14 Reverse Engineering] - 순천향대 2011 정보보호 페스티벌 W번


위 링크는 1편입니다 ^-^



[잘 안보이시면 확대해서 보세요 - exe와 첨부된 문제파일입니다.]


지난포스팅에서 말했듯이 위 그림에서 시간과 암호화된 문장이 필요합니다.


2010년 11월 28일 오후 10시 2분입니다.


포스팅을 쓰는 지금으로 부터 딱 2년전이군요.. 와우!


우리의 목적은 I am password 를 구하는 것입니다.


이 포스팅 전편의 알고리즘 분석을 기초로 하고 다른 블로거 님의 소스에서 힌트를 얻어 다음 코드를 작성했습니다


우선 키젠 파일 입니다 [Decrypter]

순천향대 2011 W decrypter made by sweetchip.exe

#include

#include


void reverseString(char* s) {

size_t size = strlen(s);

char temp;


for (size_t i = 0; i < size / 2; i ) {

temp = s[i];

s[i] = s[(size - 1) - i];

s[(size - 1) - i] = temp;

}

}


int main()

{

char encrypted[0x100];

int time[12];

char tmp1[13];


puts("///////////////////////////////////////////////////");

puts("///// 순천향대 2011 정보보호 페스티벌 /////");

puts("///// W번 리버스 엔지니어링 Keygen /////");

puts("///// [De] Made By sweetchip /////");

puts("///////////////////////////////////////////////////");


printf("시간을 입력해주세요. [ex 201011282202] : ");

scanf("%s",&tmp1);


for(int i = 0; tmp1[i] != 0; i )

{

time[i] = tmp1[i] - '0';

}


printf("암호화된 문장을 입력해주세요. : ");

scanf("%s",&encrypted);


int timelen = sizeof(time) / sizeof(time[0]);

int namelen = strlen(encrypted);


printf("\nEncrypted : %s\n",encrypted);


for(int i = 0,j=0; i

{

char tmp;

if(j >= 0x0C) j = 0;


tmp = encrypted[i] - time[j];


if(isalpha(encrypted[i])==2)

{

if ((encrypted[i] - time[j]) <= 0x61)

{

encrypted[i] = encrypted[i] - (time[j] - 0x1A);

}

else

{

encrypted[i] = encrypted[i] - time[j];

}

}

else

{

if ((encrypted[i] - time[j]) <= 0x41)

{

encrypted[i] = encrypted[i] - (time[j] - 0x1A);

}

else

{

encrypted[i] = encrypted[i] - time[j];

}

}

}


reverseString(encrypted);


for(int i = 0; i

{

if(isalpha(encrypted[i])==2)

{

if ((encrypted[i] - i) <= 0x61)

{

encrypted[i] = encrypted[i] - (i - 0x19);

}

else

{

encrypted[i] = encrypted[i] - (i 1);

}

}

else

{

if ((encrypted[i] - i) <= 0x41)

{

encrypted[i] = encrypted[i] - (i - 0x19);

}

else

{

encrypted[i] = encrypted[i] - (i 1);

}

}

}

printf("Decode : %s\n\n",encrypted);

system("pause");

}



자.. 두가지 프로그램이 모두 완성되었습니다.


리버싱 공부에 정말 많이 도움이 된것 같네요 ㅠ-ㅠ



hellozzmynameissweetchip 이라는 평문을 암호화 시킨결과 pfezoyyvkiyaalyjvhhbrpir 이라는 암호문이 나왔습니다.



마찬가지로, 지난 포스팅때 소스를 공개했던 출제된 문제의 알고리즘을 그대로 적용한 프로그램입니다.


역시 hellozzmynameissweetchip 이라는 평문을 암호화 시킨결과 pfezoyyvkiyaalyjvhhbrpir 이라는 암호문이 나왔습니다.


시간은 2012년 11월 28일 21시 29분입니다.



이번에 새로 만든 디코더에 시간과 암호문을 입력해준 결과


처음 평문 hellozzmynameissweetchip 이라는 결과가 나왔습니다.


그러면 이제 모두다 성공한 것이니 정답을 알아보도록 하겠습니다.


암호화된 문장 : pzzgzfWbigqiqAmvvMkcEX

복호화된 문장 : UAreGoodReverseEngneer


Password is UAreGoodReverseEngneer


[당시 대회에 참가하지 않아 확실한 정답인지 모르겠으나 맞겟지요~]


반응형

관련글 더보기