정보보안 스터디 - 19주차 2일 - LENA reversing (level 8, 9)
level 8
처음에는 이렇게
가입이 되지 않았다고 시작할 때 뜨며
키를 입력해서 register해야 해결됩니다.
일단 exeinfo 에서 visual C++ 환경으로 제작된 것을 확인하구요
세부적으로
invalid key!를 문자열로 검색하여 주소로 들어가 근처의 명령어를 수정하는 편이 가장 편할 것 같습니다. (프로그램을 일시종료하여 K버튼을 눌러 주소를 찾아가는 방법도 있겠지만 안될 때도 있습니다.)
invalid key! 주소 까지 간다음 점프하고 있는 곳을 찾습니다.
여기서 바로 JMP로 바꿔 가입이 되도록 해도 되지만
조금 더 수준 높게 EAX 결과에 따라서 0이면 점프되는 것이기 때문에 EAX가 0이 아니여야 register 될 것이라는 것을 예측하면서 CALL함수에 들어가 분석해보겠습니다.
F2 break point를 걸어놓고 실행하면 프로그램이 실행되고 중간에 막힙니다. 그럴 경우에는 register클릭해주고 키값을 적당히 입력해 줘야 BP 까지 오게 됩니다.
CMP AL, 2D를 보니 2D는 ascii 코드로 문자 - 의 16진수입니다.
즉 AL이 입력값에 -가 없으면 점프 합니다.
점프했다고 치고 구간으로 검색해 이동해보면
XOR EAX EAX
이므로 무조건 EAX가 0으로 설정됩니다.
그러므로 점프되지 않도록 해야합니다.
XOR 명령어를 아예 처리하지 않도록 NOP으로 변경합니다.
저장 후 확인해보면
등록이 완료된 것을 확인할 수 있습니다.
level 9
처음에 나오는 register 입력창이 처음부터 문제입니다.
크랙해보도록 합시다.
여기서 좋은게 Entrypoint까지 나오기 때문에 좋은듯합니다
Visual Basic 5.0 ~ 환경으로 제작되었다는 것을 확인하구요.
entrypoint 주소로 이동하여 저장된 첫 bytes 를 확인합니다.
Search for > Name (label) in current modules 을 클릭하여
'vbaVarTstEq' 함수를 검색합니다.
이 함수는 CMP 처럼 값들을 비교할 때 씁니다.
Set BP on every reference로 해당하는 모든 주소에 BP를 걸어주면
88개의 BP가 걸려있는 것을 확인할 수 있습니다.
실시하다보면 함수를 호출하고 CMP DI,SI를 비교한 후 같다면 주소로 점프하는 것을 볼 수 있습니다.
넘어가보면 문자열을 EDX에 대입하고 함수를 호출합니다.
이 문자열이 시리얼 키가 될 가능성이 크기 때문에 시리얼인지 확인합니다.