일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- x64dbg
- 사이버수사
- 악성코드분석
- 악성코드 분석
- 사이버수사과
- 서울호서직업전문학교
- reversing.kr
- Opentext
- http://reversing.kr/
- U's room
- 디지털포렌식
- 서호전
- encase
- 악성코드
- 포렌식
- 레지스트리포렌식
- Reversing
- 포렌식 #안티포렌식 #레지스트리 #거부권한 #깃허브 #Forensics #forensic #anti-forensic #anti-forenscis #컴퓨터 #사이버수사 #수사관 #KDFS
- 리버싱엔지니어링
- REGA
- 리버싱
- 엔케이스
- 이디스커버리
- 역연산
- 고려대학원
- forensic
- KDFS2022 #KDFS2023 #학생트랙 #멤버모집 #포공학 #포렌식 #디지털포렌식 #범인을찾아라 #DFC #포렌식대회 #보고서 #학생트랙보고서
- 레가
- e-discovery
- Music_Player
- Today
- Total
DDDDigtal 4ensics
[Reversing.kr] Easy_CrackMe 문제풀이 본문
프로그램을 킨다면 바로 Easy CrackMe라는 타이틀을 가진 프레임과 텍스트 필트, 버튼이 하나 보인다.
당연히 암호를 맞춰라! 라는 프로그램이지만 플레그를 얻는 방법과 플레그가 아니라도 그냥 성공멘트를 띄우는 2가지 방식이 존재한다.
일단 플레그를 얻는 방식을 먼저 설명을 하겠다.
먼저 간단하게 exeinfo를 이용해서 엔트리 포인트 및 패킹 여부를 확인해본다. cpp로 짜였고, 패킹은 안되어있다.
추가적으로 엔트리 포인트는 00401188이라는 것도 알아낼 수 있었다.
일단 x64dbg를 이용해서 풀어보겠다. 가장 먼저 일단 플레그에 관련된 문자를 찾아보자. 가장 첫 문제인 만큼 정답에 관한 문자열이 바로 보일 것 이라 확신했기 때문 엔트리포인트에 진입 후 우클릭 -> 다음을 찾기 -> 모든 모듈 -> 문자열 참조
역시 바로 보인다.
정답 플레그 쪽으로 들어가서 확인을 해본다면
a,5y,R3versing,E 라는 문자들이 눈에 띄게 보인다.
일단 가장 위에 있는 GetDlgItemTextA함수는
필자는 자바가 가장 편하기 때문에, 자바로 따진다면 getText()함수와 비슷하다고 보면된다.
이제 하나하나 분석을 해보겠다.
가장 먼저 004010B0에 블포를 걸고 확인을 해보았다. 아 텍스트 필드에는 123456789라는 값을 초기값으로 잡고 분석을 시작하도록 하겠다.
보니 저기서 불러오는 esp는 쉽게 우리가 텍스트필드에 입력했던 값이였고, esp+5는 우리가 입력했던 문자열의 두 번째 글자라고 이해하면 쉽다.
그럼 답이 나왔다! 두번 째 글자는 a라는 것이다. 그럼 a를 넣고 이번엔 그 밑을 분석해본다.
이번엔 lea ecx,dword ptr ss:[esp+A]라는 어셈블리구문을 만나게된다. 이 구문을 해석하면
lea와 mov의 차이는 lea는 주소를 mov는 값을 넘긴다는 것이 차이다. 그렇기에 ecx = esp+A의 주소라고 생각하면 된다.
004010BD | 68 78604000 | push easy_crackme.406078 | 406078:"5y"
004010C2 | 51 | push ecx | ecx:"3456789"
004010C3 | E8 88000000 | call easy_crackme.401150 |
004010BD에서는 5y의 값을 004010C2에서는 ecx 즉 우리가 입력했던 값 중 1a를 제외한 나머지 부분을 푸시해서
004010C3에서 함수를 호출하는 것으로 보인다.
함수내부로 들어오면 ebp를 사용할 수 있도록 push해주고 ebp안에 esp의 값을 전달해주고 있다.
그 이유는 esp는 값이 계속 유동적으로 바뀌지만, ebp는 조금 더 고정적인 값이라고 생각하면 쉬우려나.
0040115B | 8BD9 | mov ebx,ecx |
0040115D | 8B7D 08 | mov edi,dword ptr ss:[ebp+8] | [ebp+8]:"3456789"
00401160 | 8BF7 | mov esi,edi | edi:"456789"
00401162 | 33C0 | xor eax,eax |
00401164 | F2:AE | repne scasb |
00401166 | F7D9 | neg ecx |
00401168 | 03CB | add ecx,ebx |
0040116A | 8BFE | mov edi,esi | edi:"456789"
0040116C | 8B75 0C | mov esi,dword ptr ss:[ebp+C] | [ebp+C]:"5y"
0040116F | F3:A6 | repe cmpsb |
00401171 | 8A46 FF | mov al,byte ptr ds:[esi-1] | esi-1:"5y"
00401174 | 33C9 | xor ecx,ecx |
00401176 | 3A47 FF | cmp al,byte ptr ds:[edi-1] | edi-1:"3456789"
음 일단 가장 중요한건 밑에 cmp 즉, 비교하는 부분이다. 마지막 비교하는 점을 기점으로 한 칸씩 올라가다보면 값이 옮겨지는 것을 쉽게 볼 수 있을 것 이다. 이 부분에 대해선 크게 설명을 할 필요가 없다. 어차피 마지막 비교에서 뭘 비교하는지만 확인하면 답이 나오는 부분이기 때문에, 결국 3번 째 4번 째 글자는 5y라는 것을 알 수 있다.
바로 다음으로 간다면 당연하게도 cmp부분이 가장 중요하다. cmp를 기점으로 무엇을 비교하는지 주소를 따라가다보면 결국 esp+10은 1a5y의 뒷 부분인 56789를 가르키고 있다. (반복적으로 글자를 하나 씩 지우면서 문자 하나 씩 비교하지만... 그렇게 설명해주면 설명도 너무 길어지기에 그냥 간단하게 이렇게 이해해도 뭐... 아직까진 큰 문제가 없을 것 으로 확인.)
흐름을 본다면 cmp는 결국 56789부분과 R3versing부분을 비교한다는 것을 쉽게알 수 있다.
그럼 정답은 1a5yR3versing라는 것 인데, 마지막 1의 정체만 확인하면 된다.
마지막 E는 결국 esp+4 즉, 1를 가르키고 있다. 그럼 flag는 자연스럽게 ===========라는 것을 알 수 있다.
어려운 문제는 아니지만, 리버싱을 처음 접하는 입장에선 어려울 수 있다. 하지만 나는 직접 풀어보길바란다.
'Reversing' 카테고리의 다른 글
레나 튜토리얼 - 04 풀이 (0) | 2024.02.15 |
---|---|
레나 튜토리얼 - 03 풀이 (1) | 2024.02.12 |
레나 튜토리얼 - 01 풀이 (1) | 2024.02.12 |
[Reversing.kr] Music_Player 문제풀이 (0) | 2023.05.05 |
[Reversing.kr] Easy Keygen 문제풀이 (0) | 2023.05.02 |