문제를 보니 4글자의 NAME을 찾는 문제이다.
정답이 여러개인거 같은데 그중 숫자 소문자 대문자 순으로 가장 먼저오는 문자열이 정답인가보다.
바로 디컴파일 해보니 각설하고 name과 serial을 받아 check_serial함수에 인자로 넘겨줘 함수가 return 1을 하면 옳다고 나온다.
check_serial함수만 보면 끝날듯하다.
C++ STL을 사용해 구현한 프로그램이라 분석하는데 꽤 오래 걸렸지만
밑줄친 stringFindSecond함수를 두번 호출하고 값을 뺀 절대값이 5보다 같거나 작으면 된다.
함수 끝마칠때 v28을 리턴해주는데 저 조건문으로만 들어가지 않으면 v28은 원래 선언된 1 그대로 리턴된다.
반복문은 총 12번 돌아가는데 serial값의 길이만큼 돌아가며 name 한자리씩 가지고와 serial을 생성한다.
먼저 StringFindSecond(char* a,char b)함수는 사용자 정의함수인데 a라는 문자열에서 b라는 문자가 2번째로 나오는 인덱스를 리턴해준다.
두번의 호출에서 v30이라는 문자열을 인자로 넣어주는데 string으로 밖혀있는 밑의 문자열이다.
v9는 내가 입력한 serial이고 v8은 내가 입력한 name이다.
반복문이 12번 돌기 때문에 내가 만약 name을 abcd로 입력했다면 AAABBBCCCDDD 그리고 입력한 serial값 12자리를 가지고 검증을 한다.
여기서 소문자로 입력한다면 v30의 문자열에서는 대문자로 변환되어 검색한다.
검증 루틴을 분석했으니 간단한 brute forcing을 이용한 코드를 짜보았다.
문제에서 숫자 소문자 대문자 순서중 가장 먼저 오는 문자열이 답이라고 했으므로 가장 먼저오는 문자열을 출력해보았다.
'문제 > CodeEngn_Advance' 카테고리의 다른 글
CodeEngn Advance 09 (0) | 2017.01.10 |
---|---|
CodeEngn Advance 08 (0) | 2017.01.10 |
CodeEngn Advance 07 (0) | 2017.01.10 |
CodeEngn Advance 06 (0) | 2017.01.10 |
CodeEngn Advance 05 (0) | 2017.01.10 |