#include <stdio.h>
#include <string.h>
unsigned long hashcode = 0x21DD09EC;
unsigned long check_password(const char* p){
int* ip = (int*)p;
int i;
int res=0;
for(i=0; i<5; i++){
res += ip[i];
}
return res;
}
int main(int argc, char* argv[]){
if(argc<2){
printf("usage : %s [passcode]\\n", argv[0]);
return 0;
}
if(strlen(argv[1]) != 20){
printf("passcode length should be 20 bytes\\n");
return 0;
}
if(hashcode == check_password( argv[1] )){
system("/bin/cat flag");
return 0;
}
else
printf("wrong passcode.\\n");
return 0;
}
main함수에서 명령어 창에서 argv[]를 받는다. 여기서 argv의 길이가 20바이트여야한다는 제한이 걸린다.
그리고 check_password에 argv[]를 넘긴다.
check_password함수에서는 인자로 받은 argv[]를 int형으로 변환한다. 여기서 형변환 시, 1 바이트의 크기를 갖던 char가 4바이트의 크기를 갖는 int로 바뀌면서 20바이트의 char를 4바이트씩 끊어 갖는다.
이렇게 5개의 int배열로 바뀌고 이를 다 더해서 hashcode와 같으면 패스워드를 출력하는 코드이다.
4바이트씩 5개를 더하는 것이므로 hashcode의 값을 우선 5로 나눠본다.
나눠보았을떄, 0x6C5CEC8라는 값이 나온다. 그런데 여기서 hashcode를 10진수로 바꿔서 다시 5로 나눠보면, 소수점자리까지 나온다는 것을 확인 할 수 있다. 이말은 나머지가 남는다는 것이다.
그렇다면, 0x6C5CEC8를 4번 곱했을떄와 hashcode의 차이를 확인하고 더해주면 된다.