C드라이브의 이름이 CodeEngn일 때, CodeEngn문자열이 무엇으로 변하는지 알아내야한다.
Die로 열어보니 딱히 패킹이 되어있지는 않은듯 하다. 바로 디버깅을 해본다.
문제에서는 C드라이브의 이름이 CodeEngn일때를 가정하고 있으니 변경해준다.
변경하고 디버거로 열어서 key를 입력하고 이 문자열이 변경되는 구문을 찾아본다.
이쪽 부분인것 같다. 육안상으로 특정 메모리 주소에 key로 추정되는 문자열이 보인다. 이것들이 어떻게 쓰이는지 F8로 하나씩 실행시켜 보았다.
GetVolumeInformationA 함수를 실행시키니, 40225C 주소에 C드라이브의 이름인 "CodeEngn"이 저장되었다. 더 내려가본다.
IstrcatA 함수까지 실행시키니 C드라이브의 이름이 들어있던 주소에 C드라이브의 이름과 특정 문자열이 붙어 다시 저장되었다. 그리고 또 실행시켜보면, dl 레지스터에 2를 넣는다. 그리고...
add명령어를 실행하게 되는데...
현재 40225C에는 이렇게 저장이 되어 있지만 add구문 4번을 도는데, 특정 주소에 있는 값에 1씩 더하라는 명령어이니
(40225C) 43 + 1 = 44,
(40225D) 6F + 1 = 70,
(40225E) 64 + 1 = 65,
(40225F) 65 + 1 = 66,
한번 연산을 하고 나면 JNE구문이 있는데
JNE는 같지 않을때 점프를 하는 경우도 있지만, ZeroFlag가 0일 때 점프하는 경우가 있다. 이번에는 후자의 경우이다.
add를 하기 전, mov dl, 2 구문이 있었다. dl안에는 2가 들어있고 add 4번이 지나고 난 뒤에 dec명령어로 1로 만들었다 ZF는 계속 0이고 JNE에서는 ZF가 0이니 특정 주소로 점프를 하게 되니까 add 4번을 하는 주소로 점프하게 된다. 즉 for문 같은 행위라는것. 그래서 2번 add를 하게 되면.
이렇게 값이 변하게 된다. 여기서 이제 또 dec dl을 하게 되는데 그럼 dl에 있는 값이 0이 되게 되고 특정 연산의 값이
0이 됐을 때, ZF는 1로 세팅되게 되니 더이상 JNE를 하게 되는 조건을 벗어난 것이다. 그래서 점프를 하지 않게 되고 아래 구문으로 내려가게 된다.
아래 구문은 정말 쉽게도 특정 주소에 있는 값과 위에서 여러가지 방법으로 변환한 문자열을 합치고, 입력한 값과 비교하여 키인지 아닌지 판단하는 구문으로 되어 있다. 그래서 저기 적혀있는 시리얼로 추정되는 문자열을 입력해주면
정답인듯 하다. 하지만 문제가 원하는 키는 C드라이브의 이름이 CodeEngn일 때 키에서 CodeEngn부분이 어떻게 바뀌는지 알려달라고 했으니 정답은 "EqfgEngn"
'Reversing 문제 풀이 > CodeEngn.com_Basic (Clear)' 카테고리의 다른 글
codeengn-basic-L09 풀이 (0) | 2022.03.27 |
---|---|
codeengn-basic-L08 풀이 (0) | 2022.03.21 |
codeengn-basic-L06 풀이 OEP알아내기 (0) | 2022.03.13 |
codeengn-basic-L05 풀이 UPX패킹 풀기 (0) | 2022.03.11 |
codeengn-basic-L04 풀이 (0) | 2022.03.11 |
최근댓글