일단 먼저 실행을 해보면
이렇게 Name과 Serial을 입력하는 텍스트 박스와 버튼들이 있다.
임의로 아무거나 넣어보면
당연하게도(?) 틀렸다는 메시지가 뜬다.
+) Name이 4글자가 넘지 않는다면
오류 창이 뜬다.
옳은 Name과 Serial을 찾아보자
이곳 저곳 둘러보다가 위와 같은 부분을 찾아내서 넣어봤는데 아니었다,,
더 찾아보니 옳은 Name과 Serial을 넣었을 때 나타나는 문구처럼 보이는 것을 발견했고
더 찾다가 성공부분을 찾았다. 그래도 잘 모르겠어서 다시 처음으로 돌아갔다.
f2로 종단점 체크하고 f7로 계속 들어가다가
창이 뜨고, name과 serial 입력하고 check를 눌러주면
이 부분으로 이동한다 !
이 부분이 체크하는 부분일까?
00403329 부분에 종단점 체크 해두고, 들어가보자
들어가면 위와 같은 화면인데, 4번째 줄 CALL 부분의 스택 부분이
이렇게 뜬 뒤에 RETN 8에서 다시
이곳으로 되돌아 오고 JE 명령어에 따라
여기로 jump 되어 Wrong 이라는 메시지 박스가 출력이 된다.
JE 명령어를 무시했다면 성공 메시지가 나올텐데 라는 생각이 들었다.
그래서 이렇게 바꿔주었더니
성공 !!
===================================================
성공 창이 뜨긴 했지만 문제의 의도는 Name과 Serial을 찾는 것 같아서 더 찾아보기로 했다.
아까 스택 창에 변화가 생긴 부분에 들어가보았다.
들어가면
쭉쭉 내려가다가 RETN에서 다시
여기로 되돌아온다..
모르겠어서 다른 라업을 참고해보았다.
내가 들어갔었던 vbaVarTstEq()함수에 들어가기 전, 여러 함수를 거치는데
위 블로그의 설명을 참고해 함수들 순서를 적고 그 기능을 이해한 부분만 적어보려고 한다.
1. vbaVarForInit() : 반복 구문 존재
2. vbaVarForNext() : 루프 인덱스 증감에 대한 관리
반복문이 끝났다고 여겨지면 EAX에 0을 넣어 리턴 후 ZF(Zero Flag)가 세워지면 점프해 반복문에서 빠져나감
반복문 내부 --
3. vbaI4Var()
EAX에 (EBP-24 변수의 하위 4바이트 값) 루프 인덱스 값 저장
4. rtcMidCharVar()
루프 인덱스 값과 입력한 name 문자열을 인자로 name의 N번째 문자열을 새로운 변수에 저장
아마 내부 --
5. vbaStrVarVal()
vbsMidCharVar()에서 가져온 문자열 주소(Name의 N번째 문자열)를 EAX에 넣음
6. rtcAnsiValueBstr()
EAX 주소의 hex값을 EAX에 다시 저장
(루프인덱스 N번째 문자가 a였다면 0x61값을 EAX에 저장)
EBP-54에 그 값을 저장 (임시자원 즉시 해제)
7. vbaVarAdd() / rtcHexVarFromVar()
EBP-54로 다시 저장 후 rttHexVarFromVar()로 (N번째 문자의 아스키 값 +64)를 EBP-9C에 hex 문자열 저장
8. vbaVarCat()
기존 문자열과 붙여줌 (루프로 생성된 hex 문자열들 하나씩 합침)
완성 암호와 사용자 입력 암호 동일한지 체크
- 오류발생 시
vbaHresultCheckObj() 호출
- 오류 없을 시
vbaVarTstEq()로 검증 (생성된 시리얼과 입력한 시리얼이 일치하는지)
**사용자가 입력한 Name에 따라 정해진 알고리즘에 의해 Serial 값이 생성되고 사용자가 입력한 Serial과 생성된 Serial을 검증하는 것이 신선했고 어려웠다. (정해진 값을 찾는 문제만 매번 접하다보니 ,,)**
'Reversing > Wargame' 카테고리의 다른 글
[CodeEngn] Basic RCE L02 (0) | 2021.02.22 |
---|---|
[CodeEngn] Basic RCE L06 (0) | 2021.02.19 |
[suninatas] REVERSING 9 (0) | 2021.02.17 |
[XCZ.kr] Prob.9 Easy Reversing (0) | 2021.02.17 |
abex' crackme #3 (0) | 2021.02.16 |
댓글