오늘은 문제를 같이 풀 사람이 있어서 난이도를 2로 설정했다. 뚜둔..
(https://crackmes.one/crackme/66685b79e7b35c09bb266b96)
요놈인데 대충 실행하면 이런식으로 키를 집어넣는 부분이 나오고 내가 입력한 값에 따라서 맞췄는지 아닌지를 알려주는거같다. 지금까지의 문제들과 크게 다르지 않다. 다른부분은 GUI 작업이 되어있다는거...?
그래서 아무 문자나 입력하면 아래와 같이 뜨는걸 확인할 수 있다.
그리고 문제에 작성되어 있지만 Simple Antidbg 기법이 적용되어있다. 그래서 해당 프로그램을 단독으로 실행시켜야 동작하고 IDA에 프로그램 올려둔채로 실행시키면 그냥 꺼진다.
물론 IDA 통해서 디버깅 실행해도 꺼진다.
그러면 우선 정적으로 프로그램을 분석해보자. 틀렸을 때 나오는 문자열을 확인해보니 그냥 떡하니 나타난다. 그리고 해당 부분 그래프로 보면 아래와 같다.
역시 난이도가 낮은 문제라서 그런지 이런식으로 바로바로 검색이 가능하다.
그러면 해당 파일을 디컴파일해서 내가 어떤 Key를 입력해야 저쪽으로 빠지는지 살펴보자. 대충보니 src가 내가 입력한 문자열이고 xor등을 한 값과 비교가 필요해보인다.
그런데 나는 ida 8.4 free 버전을 사용하는데, 같이 문제를 푸신분은 다른버전을 사용해서보니 디컴파일한 내용이 다르다
-_- 어쩐지 xor은 v44랑 진행하는데 막상 strcmp는 v43과하고 뭔가 말이 안맞더라. 이래서 디컴파일한게아니라 어셈도 공부해서 틀린부분을 바로잡을 수 있어야하는건가..?
무튼 정적분석으로 코드를 만들어서 푸는 방식은 포기하고 동적으로 그냥 풀어야겠다.
동적으로 푸는데 문제는 안티디버깅이 되어있다는건데, 이상하게 해당 프로그램을 먼저 실행시키고 windbg로 프로세스 attach를 하면 프로그램이 죽지 않는다.
코드를 살펴보면 MainApp 에서부터 시작해서 IsBebuggerPresent 라는 함수를 통해 디버깅을 한번 체킹하고
바로옆에서도 Debugbreak 라는 함수를 호출한다. 그리고 나서 쭉 내려와서 입력을 받고 sumit 을 누르면 문자열을 체크한다.
아마도 처음 실행에만 디버깅 체크를 해서 중간에 디버그 붙이는건 괜찮나보다 ㅎㅎ. 무튼 그러면 디버거를 붙일 수 있으니 저기 내가 입력한 문자열을 정답과 비교하는 곳을 가보자
그러면 해당 주소를 얻을 수 있고 Windbg를 통해 해당 부분에 bp를 걸고 메모리값을 살펴보자.
그리고 key 값을 임의로 입력하고 breake 걸린 부분의 ecx 값에 맞는 메모리를 살펴보자
이상한 문자열을 얻을 수 있는게 저게 지금 내가 입력한 값하고 비교중인 값이다. 정답이라고 볼수있음. 그래서 방금 찾은 값을 Key로 입력하고 sumit을 클릭하면 아래와 같이 문제가 풀린것을 볼 수 있다.
문제는 이렇게 풀었지만 내가 어셈블리를 좀만 알았다면 그냥 정적으로 분석해서 xor 하는 부분 코딩하면 금방 답이 나오지 않을까 싶다.
'Technical Docs > Reversing' 카테고리의 다른 글
crackemes.one - 5 (0) | 2024.08.05 |
---|---|
Crackmes.one - 4 (7) | 2024.07.24 |
Crackemes.one - 2 (0) | 2024.07.19 |
Crackmes.one - 1 (0) | 2024.07.17 |