1. 문제
1) 문제확인
- 실행이 안된다.
2. 접근방법
- 010 editor로 열어봤을 때 PE Header에 뭔가 문제가 있다.
- DOS Header의 e_lfanew멤버 즉, 첫 바이트로부터 offset이 0x3c떨어진 곳에 NT Header가 시작되는 위치의 옵셋이 존재한다. 근데 위 사진을 보면 알 수 있듯이 0x1000값이 들어있다. → 잘못됨
- 여튼, 이것말고도 각 헤더의 멤버에 세팅 값이 이상한 것을 확인할 수 있어 요런 것들을 고쳐서 PE가 정상 작동하도록 해야할 것 같다.
결론적으로 잘 보면 Dos Header는 정상적으로 되어있고(위에서 말한 NT Header가 시작 옵셋을 알려주는 e_lfanew빼고) Dos Stub은 아예 없고 Nt Header도 아예 없는 것 같아보이지만 Section Header위에 뭔가 있는 거보니 중간에 뭔가를 삭제한 것같다.
채워줘야 할 것)
- e_lfanew : Nt Header시작 위치를 가리키도록 변경
- Dos Stub Header : 채워줘야 함
- Nt Header : 어디까지 잘못되어 있는지 모르지만 여튼 Signature부터 천천히 채워봐야함
3. 문제풀이
최종적으로 값을 정상적으로 세팅하면 이렇게 된다.
- 왼쪽이 값을 정상적으로 채웠을 때, 오른쪽은 원본
- 변경된 부분은 빨간색 박스로 표시되어있고 원본에서 저 부분을 중간에 삽입해야 함
그럼 이제 정상적으로 작동하는데 오른쪽 그림처럼 아무거나 치고 "Check it!"버튼을 눌렀는데 아무런 반응이 없다.. =_=
그럼 뭐다? 아이다로 까보자~
[ Shift + F12 ] 눌러서 문자열 검색해보면 "Yeah, you did it!"문자열이 보이는데 딱 보면 성공하면 메시지 박스에 저 문자열을 출력해줄 것 같다.(따라가보자)
그러면 MessageBoxA를 호출하기 전에 제목으로 "ArturDents CrackMe#1"문자열이 오고 내용에는 "Yeah, you did it!"이 오는 것을 알 수 있다. 근데 저게 플래그 값은 아니다. (딱 봐도 아닌것 같긴 했는데 인증해보니깐 진짜 아님ㅋ..)
실제로 EIP값을 좀 수정해서 메시지박스 띄우게 해도 저렇게만 나온다.
이제 생각해볼 수 있는 것이 어떠한 값을 입력하였을 때 저런 메시지 박스가 뜰 수 있을 것이라 생각해볼 수 있다. 여기서 말하는 입력 값은 플래그 값일 수도 있다.
- DialogFunc()의 코드에서 MessageBoxA()를 호출하기 직전의 코드흐름을 볼 수 있다.
- GetDlgItemTextA()를 통해 String에 사용자 입력 값을 저장하고 v5(String)값과 v6(unk_40301e)값을 1byte씩 비교하여 참이면 MessageBoxA를 호출하는 것 같다.
- 총 7byte를 비교하므로 7byte길이의 패스워드로 저장되어 있을 것이라 생각할 수 있음
- bp걸고 test 입력
- String(0x40305C)에 "test"문자열 저장됨
- eax에 "test"(0x40305c)값이 저장되고 ebx에는 ""(0x40301e)
- 아이다에서도 확인할 수 있는데 결론적으로 비교하는 값이 존재하지 않는다....
여기서부터 어떻게 해야될지 몰라서 롸업을 봤는데 내가 PE파일을 잘 못 복구했는지 flag값은 0x403054에 존재하고 원래대로라면 flag값이 0x40301e에 존재해야 하는 듯하다.
결국 플래그 값은 찾았지만 뭔가 찝찝한데 더 하면 시간아까울 것 같아서 여기서 그만해야게따..
Uploaded by Notion2Tistory v1.1.0