[Reversing.kr] Easy Crack

semon·2022년 11월 3일
0

Reversing

목록 보기
1/10

문제

Reversing.kr의 첫 번째 문제인 Easy Crack을 풀어봤습니다.

PEID로 봤을 때 32비트이고 c++을 사용했다는 것을 알 수 있습니다.

분석

실행을 시켜보면 입력을 받습니다.

여기에 맞는 값을 입력하면 될 것 같습니다.

Immunity Debuger로 실행을 하고 문자열을 보니 Congratulation이라는 문자열이 보입니다. 이곳을 보면 입력 값을 비교하는 부분을 찾을 수 있을 것 같습니다.

문자열을 찾아가 보니 긴 함수가 있고 각각 비교문 이후의 jum문이 InCorrect 문자열을 출력하는 부분으로 이동하여 이 비교문을 피해 가는 값을 찾으면 될 것 같습니다. 함수의 시작 부분에 break point를 걸고 입력 값을 abcdef를 주고 실행시켰습니다.

함수를 실행시키다 0x61을 esp+5와 비교하여 같지 않으면 Incorrect message를 출력하는 부분으로 jum 하는 부분이 있습니다. 확인을 해보니 esp+5에 해당하는 메모리에 입력했던 값의 2번째 값이 들어있었습니다. 따라서 입력 값의 두 번째는 0x61인 a인 것을 알 수 있습니다.

입력 값을 aacdef로 바꾸고 실행을 하니 두 번째로 비교하는 부분이 있습니다.

해당 함수로 들어가 보면 REPNE SCAS와 REP CMPS라는 부분이 있습니다. REPNE는 ZF=1이거나 ECX=0이면 멈추고 SCAS는 EAX와 EDI 주소 값과 비교를 하며 String 계열이라 DF에 따라 방향이 달라집니다. 따라서 해당 명령이 실행될 때 ECX는 2, EAX는 0을 가지고 있고 EDI는 aacdef라는 입력값에서 aa이후의 입력을 가지고 있으므로 그 이후의 2자리의 입력이 있는지 여부를 확인합니다.
REP는 같으면 반복, ZF=0이거나 ECX=0이면 멈춥니다. CMPS는 ESI와 EDI의 주소에 있는 값을 비교합니다. 따라서 ESI와 EDI 레지스터의 값을 비교해서 다른지 확인합니다. 이때 ESI는 0x406078에 저장된 값(5y)을 가리키고 있고 EDI는 0x19f7f2에 저장된 값(cdef)을 가리키고 있습니다.
결과적으로 key값은 key[1]은 a, key[2]=5 key[3]=y 임을 알 수 있습니다.

이제 입력을 aa5ydef로 바꾸고 더 밑으로 가보면 ESI와 EAX에 각각 0x40606c(R3versing), ESP+10를 저장하고 1byte씩 비교를 하는 반복문이 나옵니다. 따라서 5y 이후의 값은 R3versing인 것을 알 수 있습니다.

입력을 aa5yR3versing으로 바꾸고 내려가 보면 [ESP+4]의 주소에 저장된 값과 0x45(A)를 비교하는 부분이 있습니다. ESP+4의 주소를 보면 입력한 값의 첫 번째 값임을 확인할 수 있습니다. 따라서 Key 값은 Ea5yR3versing이 됩니다.

profile
보안을 공부합니다

0개의 댓글