해당 뮤직 플레이어는 1분만 음악을 들을 수 있도록 제한되어있다. 1분 이상 들을 수 있도록 1분 체크 루틴을 수정해야한다.
해당 MP3 플레이어에 음악 파일을 실행시키면 1분까지만 실행되고 팝업창이 출력된다.
해당 프로그램의 모듈간의 호출을 찾아 rtcMsgBox 함수를 필터링하니 rtcMsgBox 함수가 네번 호출된 것을 알 수 있다.
4개의 함수 중 어떤 함수가 1분 제한 메시지를 띄우는 건지 알아내기 위해 4개의 함수에 BP를 설정한다.
wav 파일을 넣고 1분간 실행하자 4045D8의 위치로 이동한다. 4045D8에 있는 rtcMsgBox 함수가 1분 제한 팝업창을 띄운다는 사실을 알 수 있다. 4045D8 위치로 이동하지 않게 코드를 수정해야 한다.
4045D8 주소에 도달하지 않기 위해서는 4045D8을 넘어가는 점프문을 찾으면 된다.
4045D8 위에 40456B 주소와 0040457C 주소에 JUMP 문이 있다. 40456B의 점프문에서 점프하면 004045FE 주소로 점프하기 때문에 팝업창을 띄우는 4045D8로 도달하지 않는다. 즉, 0040456B에서 무조건 점프를 하는 코드로 수정해야한다. 40457C 주소의 점프문은 점프 유무에 무관하게 팝업창을 띄우는 4045D8로 도달한다. 40456B에는 Jl 어셈블리 명령어가 있다. Jl 명령은 비교 대상이 더 값이 작다면 점프하고, 그렇지 않다면 점프하지 않는다. 무조건 점프를 시켜야 하므로 비교 대상의 값이 더 작도록 수정해야한다.
점프를 위한 비교문은 404563 주소의 cmp eax, EA60가 있다. 그렇기 때문에 eax가 EA60보다 더 작아야 한다.
그래서 EA60의 값을 4자리 16진수의 가장 큰 값인 FFFF로 수정한다. 그리고 제대로 실행되는지 확인해보기 위해 404563에 BP를 설정한다.
이번에는 1분 제한 팝업창은 뜨지 않지만 런타임 에러 메시지가 출력되었다.
음악을 실행하면 59초에서 멈추고 프로그램이 멈춘다. 멈추는 구간은 76A29AB2이다.
4046BF 주소를 보면 해당 주소 바로 위에 __vbaHresultCheckObj 함수가 있다. 해당 에러는 아래 명령문 중 vbaHresultCheckObj로 인해 호출되고 있었다. 그리고 해당 호출은 004046A7의 test eax, eax로 인해 실행되었다. 4046AB 주소의 Jump 문으로 __vbaHresultCheckObj 함수를 실행시키지 않도록 해야한다.
4046AB 주소의 jge명령을 jmp로 수정해서 무조건 점프를 수행하도록 한다.
1분 넘게 음악을 실행해도 팝업창이 뜨지 않으며 Password는 LIstenCare이다.
'2. Reversing (리버싱) > 1) Write UP' 카테고리의 다른 글
[2021.03.20] CodeEngn Basic L05-L07 & 교재 Chapter2 발표 (0) | 2021.03.20 |
---|---|
[2021.03.13] CodeEngn Basic L01-L04 (0) | 2021.03.13 |
[2020.11.21]CodeEngn Challenges Basic RCE L19, L20 라이트업 (0) | 2020.11.21 |
[2020.11.14]CodeEngn Challenges Basic RCE L17, L18 라이트업 (0) | 2020.11.14 |
[2020.11.07]CodeEngn Challenges Basic RCE L13 ~ L16 라이트업 (0) | 2020.11.07 |