상세 컨텐츠

본문 제목

0x04 - 레나튜토리얼 02(라이센스 키 알고리즘 분석하기)

Reversing

by 조땡땡이 2020. 8. 10. 19:52

본문

자.. 흐름이 끊키지 않도록 바로 2번째 문제를 풀어보겠슴다.

처음에 실행시켰는데 바로 성공했다 뜨길래.. 뭐지?? 해서 찾아봤더니 이것은 코드를 이해하고 조건에 맞게 Keyfile을 생성하는 내용이였다....

 

우선 기본적으로 레나튜토리얼 01와 같은 reverseMe.exe 파일이다.. 레나 01을 풀어봤다면 첫 부분에 CreateFileA 함수가 나온것을 알 수 있을 것이다. 하지만 저 함수는 존재하는 파일을 여는 것이기 때문에 바로 프로세스가 종료되었다.. 우리는 Keyfile이 없었거든... 그렇기 때문에 "Keyfile.dat"를 만들자!!

reverseMe.exe 첫 화면

 

Keyfile.dat 파일을 만들었다..! 물론 아직 모르니 내용은 아무거나 넣었음... ㅎ 그랬더니 메시지 창 내용이 달라졌다!! 하지만 원하는 내용은 아니다... Keyfile 내용을 좀 만줘져야 할것으로 예상된다...

그리고 우리는 저번에 0040107B를 강제로 점프 시켜줬지만 이번에는 Keyfile이 생겼기 때문에 저절로 0040109A로 점프를 하게된다! 이어서 보쟈

Keyfile.dat 파일 추가

 

자 이제 0040109A주소의 ReadFile을 한번 보자. 내용이 대충 70바이트까지 읽는다는것 같다... 어떤 파일이냐면... 뭐 Keyfile이겠지.. 쭉쭉 분석해보자

Readfile

 

 

Readfile 함수 이후를 분석해보면 우리는 저번에 Keyfile을 생성하지 않고 우회하기 위해서 004010B0 or 004010B2 분기문을 바꿔줬어야 하는데 이번에는 Keyfile.dat 파일을 읽어서인지 변경하지 않아도 잘 넘어가진다. 그리고 이후에 004010B4, 004010B6에서 EBX와 ESI를 XOR 연산을 해준다.

XOR는 AND랑 OR와 같은 비트 연산자이다. 쉽게 설명하자면 비교하는 두 값이 같을 때 AND 연산은 1(True)가 나오지만 XOR는 0(False)가 나온다. 물론 비교 값이 다르다면 1(True)가 나온다. 나는 AND의 반대.. 라고 생각하니까 쉬웠습니다. ㅎ글이 조잡해서.. 이해가 안되시면 댓글 남겨주세요.. 글 정리해서 다시 올리겠슴다 ㅜ.ㅜ

 

아... 결론을 말해야지... 결론은 같은거끼리 XOR 하고 있기 때문에 EBX와 ESI는 00000000으로 초기화 되는것 입니다!!

 

자 EBX, ESI를 초기화 한 이후에 비교를 한다. 402173과 10바이트를... 저 00402173은 내가 Keyfile에 넣어놨던 데이터의 크기이다. 아래 빨간박스에 4바이트가 들어가있는 것을 확인할 수 있다. 그리고나서 JL 분기문으로 들어가는데 10바이트 보다 작기 때문에 004010F7로 분기한다. 저 주소는 아까 봤던 "Keyfile is not vailed. Sorry" 메시지 창을 출력하고 프로세스를 종료 시키는 주소이다. 그러므로 Keyfile은 16바이트보다 커야한다. 왜 갑자기 16이냐! 저 비교문의 10은 16진수 기준의 10이기 때문에 우리는 10진수 기준으로 읽어준다. 그러면 16바이트!!!!!!!!!

 

자. Keyfile.dat 파일에 아무값으로 16바이트를 채우고 색칠된 부분을 확인해보니 색 칠한 부분이 반복되는 것을 확인할 수 있다. 우선 004010C1 주소를 보면 MOV AL, EBX+40211A 가 있는데 저 코드는 AL에 스택 주소에 담겨 있는 스트링을 담는다.

 

자 이렇게 스택 주소에서 찾아서 확인할 수 있다. NICE!!! 이 스트링은 Keyfile에 담겨있는 스트링이다. 이러면 대충 감이 온다... 원하는 값이 있을 거 같은 냄새가 술술 풍긴다... 아직은 잘 모르니 다시 코드를 살펴봅시다.

 

AL에 Keyfile 데이터를 넣고 어떻게 하는지 살펴보니 우선 0과 비교를 한다. 저기서 AL이 0이라는 것은 파일 READ가 끝났다는 것을 의미한다. 계속 보자...

그리고 0이면 바로 004010D3으로 점프를 한다. 004010D3에서 또 ESI와 8을 비교한다. 근데 ESI가 8보다 작으면 004010F7로 점프를 하는데 저 주소는 키를 사용할 수 없다는.. 그 징글징글한 메시지 창이 들어있는 주소이다.

아!! 이 말은 즉슨... Keyfile을 다 읽었을 때 ESI가 8보다 작으면 안된다 라는 의미구나!!라고 생각 할 수 있지.. 

 

ESI를 어떻게 8로 만들 수 있을 지 확인해 보니 AL과 47을 비교해서 같으면 JNZ분기문으로 들어가지 않고 ESI를 하나 늘릴 수 있겠구나!!! 저 47은 그럼그럼 무엇이냐!!!!

 

바로바로 요 아스키 코드의 47을 의미합니다. Keyfile 안에 아스키 코드 47에 해당하는 "G"가 있으면 ESI가 1씩 증가한다는 거죠 ㅎ

Ascii 코드

 

자 그래서 모든 것을 조합하였을 때 결론은 무엇이냐.. Keyfile.dat가 있어야 하는데 파일은 16Byte 이상이여야 하며, G가 8개 이상이면 성공할 수 있다라는 것입니다!! 

성공!!!

 

 

마치며...

문제를 풀고 블로그를 작성하면서... 제가 글쓰는 능력이 많이 부족하다 라는 것을 느낍니다.. ㅠ

쉽고 편하게 이해하기 쉽게 써드리고 싶지만.. 제 능력이 부족해 이해하실 수 있을 지 걱정되네요...

앞으로 어떻게 더 쉽고 내용을 알차게 넣을 수 있을 지 고민해보겠습니다..!이해 안되거나 내용 추가하는게 있으시면 언제나 댓글 남겨주세요!

 

관련글 더보기