CodeEngn-advance10
CodeEngn advance10 문제는 지금까지 푼 문제 중 가장 어려웠던 문제라고 생각됩니다.
프로그램을 실행하고 name과 serial 을 각각입력하고 나면 무수히 많은 함수가 존재하고, 이 무수히 많은 함수들에 들어가면 또 무수히 많은 함수, 또 무수히 많은 함수 한 세번 정도 중첩되 있는 것같다.. 우리는 연산을 하는 부분을 찾아야하는데 찾기가 굉장히 힘들다.
따라서 중요한 부분의 함수들만 보면( 이 밑의 함수들도 굉장히 찾기 힘들다.)
이 문자열은 어딘가 중요해 보인다.(나중에 연산에서 중요하게 쓰임!!!)
이 함수는 입력한 name과 serial을 소문자에서 대문자로 바꾸어 주는 함수이다.
처음에 name을 대문자로 바꾸어 준후, 다른 명령을 실행하다 다시 호출되어 serial을 대문자로 변경한다.(우리는 serial이 대문자 이므로 name만 신경쓰면 된다.)
무수히 많은 함수들을 지나치면
첫번째 연산을 하는 함수를 발견할 수가 있다. 미리 말하자면 이 함수는 두번 호출되는데 처음에는 serial과 위의 이상한 문자열과의 연산을 하고, 두 번째는 name과 이상한 문자열과의 연산이 진행된다.
안으로 들어가보면 두개의 같은 함수가 호출 된다. 이는 연산 함수이다.
여기서 한번 더 함수에 들어가면...
연산 코드가 나온다.
즉 이 연산코드를 해석할 수 있으면 답을 찾을 수가 있다. 아까 보다 시키 연산코드 안으로 들어가면 첫번째, 두번째 연산코드가 있는데, 처음연산에서는
AJXGRFV6BKOW3Y9TM4S2ZU
I70H5Q81PDECLNAJXGRFV6BKOW3Y9TM4S2ZU
I70H5Q81PDECLNAJXGRFV6BKOW3Y9TM4S2ZU I70H5Q81PDECLN (이문자열은 이어져 있다. 공백을 포함)
이 문자열에서 입력한 serial의 위치를 찾는다. 즉 12자리의 serial을 입력하고 그 serial이 WWWCCCJJJRRR 이라면 W와 AJGRF......을 byte단위로 CMP로 비교하여 문자열에서의 serial문자의 위치를 찾는다.
두번째 연산코드에서는 첫번째 위치가 아닌 문자열에 포함된 serial의 1byte문자의 두번째 위치를 찾는다. (처음에는 첫번 째 위치를 찾음) 예를 들어 serial의 1byte가 A라면 첫번째 연산에서는 위치가 0이므로 0이 반환되고(A가 문자열의 맨앞) 두번째 연산에서는 37을 반환 문자열은 한칸의 공백으로 연결되어 있기 때문이다.
이런식으로 serial의 대한 위치를 찾은뒤 또 많은 쓰레기 함수들을 지나치면 나오는 두번째 연산코드의 입구인 함수에서는 name에 대한 위치를 찾는다.
sub EAX, EDX //EAX에는 serial의 두번째 위치값, EDX에는 name의 두번째 위치값이 포함
cmp EAX, 5 and jle xxxxxx //즉 위의 값을 뺀 결과가 5보다 작거나 같아야 성공구문으로 가게 된다.
답은 여러 개가 나올 수 있다. WWWCCCJJJRRR이므로 문자열에 포함된 W,C,J,R의 두번째 위치의 -5~+5의 값을 가진 것은 무수히 많기 때문이다. 따라서 위에 문제를 보면 0~9, a~z, A~Z의 순서라고 했으므로 답을 찾을 수가 있다.
3**6
0 개의 댓글