Crackme1 분석

정다은·2023년 5월 9일
0
post-thumbnail

🌞서론

현재 대학에서 듣고 있는 역공학 수업에서 레포트 과제를 받았다.
수업시간에 abex' crackme와 지뢰찾기 게임을 IDA와 immunity dedugger를 왔다갔다 하면서 역분석 하는 것을 보여주셨었는데, 그것을 참고하여 교수님이 주신 두 문제를 역분석하여 풀어내는 과제이다.

그중에서 이번에 풀어볼 문제는 둘중에 Crackme1에 해당하는 문제이다.

🌞문제분석

이 문제를 cmd 창에서 실행 시켜 보았을 때, Password를 입력받고, Password 가 맞는지 판단하여 결과를 출력해주는 것을 알 수 있다.

IDA를 통해서 파일을 열어보면, 위 사진처럼 흐름 그래프를 통해서 함수 내의 명령어 간의 관계와 제어흐름을 볼 수 있다.

이 파일의 코드는 Password를 입력 받고, 조건에 따라 다음과정으로 분기하여(초록 화살표의 의미) “>> No Password” 혹은 “>> Success!!”를 출력하게 되는 흐름을 가지는 코드임을 알 수 있는데, 자세한 분기의 조건을 보면, 내가 입력한 Password와 코드에 저장된 Password를 비교하는 과정이 있을것이고, 이 과정에서 Password를 알아 낼 수 있을 것 이라고 생각하여 Pseudocode로 전환하여 코드를 살펴보겠다.

🌞코드분석

위의 의사코드를 살펴보면, 총 두가지 과정을 통해서 Password인지 확인해보고 둘다 통과하면 문제 없이 “<< Success!!” 가 출력되는 과정을 거친다.

먼저 가장 처음으로 char형 배열 Str에 입력받은 Password의 문자열 길이를 저장된 Password의 길이와 일치하는지 비교해보는 과정이 있다. 이 코드를 통해 Password의 총 길이가 24임을 알 수 있다.

두 번째로, Str배열에 입력받은 원소의 데이터 타입을 8비트 크기의 부호 없는 정수형으로 변경하고, 8과 XOR 연산하는 과정을 거친 후에 정수형 변수인 v6에 대입되어 v5배열의 원소와 일치하는지 비교하는 과정이 for문을 통해 반복된다. 이때, v5에 Password의 값이 저장되어 있음을 눈치 챌 수 있다.

32비트(4바이트) 크기의 부호 없는 정수형 데이터 타입 배열인 v5를 선언 후에 여기에 qmemcpy 함수를 통해서 &unk_403040(unk = unknown)부터의 메모리 영역을 v5로 v5의 사이즈만큼 복사를 하는 작업을 수행 한다.

🌞코드작성

이런식으로 unk_403040의 내부를 들여다보면, 배열의 원소 24개를 찾을 수 있고, 이것이 저장된 Password이다. 여기에서 h는 16진수를 의미하는 접미사이므로 h를 제외하고 배열의 원소를 나열해보면, [0x7B, 0x61, 0x65, 0x78, 0x64, 0x6D, 0x57, 0x6B, 0x7A, 0x69, 0x6B, 0x63, 0x65, 0x6D, 0x2B, 0x39, 0x57, 0x43, 0x6D, 0x61, 0x4B, 0x60, 0x67, 0x61] 이고, 이를 통해 python으로 다음 poc를 작성해볼 수 있다.

enc_flags = [0x7B, 0x61, 0x65, 0x78, 0x64, 0x6D, 0x57, 0x6B, 0x7A, 0x69, 0x6B, 0x63, 0x65, 0x6D, 0x2B, 0x39, 0x57, 0x43, 0x6D, 0x61, 0x4B, 0x60, 0x67, 0x61]
print("".join([chr(c ^ 8) for c in enc_flags]))

이 코드는 v5배열 내의 정수 원소를 enc_flags라는 리스트로 나열하고, enc_flags라는 리스트의 각 요소에 대해 XOR 연산을 수행하고, 그 결과를 문자로 변환하여 하나의 문자열로 연결하는 것을 의미한다.

이를 실행 시켜보면, Password를 얻을 수 있다.

얻은 Password가 맞는지 확인해보면,

Success!! 라는 문구를 통해 Password가 일치한다는 것을 알 수 있다.

🌞끄적끄적

3학년 전공필수를 미리 들은게 역공학이고, 첫 레포트였기에 매우 긴장하고 걱정했는데, 막상 IDA로 열어보니 코드도 그렇게 어렵지 않게 이해가 가능했고, 함수도 검색으로 충분히 이해가 가능한 친구들 뿐이었다.

다만, 마지막에 배열의 원소를 문자열로 바꾸는 코드를 작성하는 것은 선배님의 도움이 없었더라면 작성이 많이 힘들었을것 같다.
파이썬을 1학년 1학기때 배우고 크게 쓸일이 없어서 방치하고 있었는데, 다시 파이썬 공부도 하면서 함수들도 익히고 그래야겠다는 생각이 들었다..!!

그리고 이런 문제를 직접 풀어보니까 내가 직접 비밀번호를 알아내고 이런 과정이 신기하고 성취감을 느껴서 그런지 역공학이라는 과목에 더 재미를 붙인 느낌이었다.
다음글에서는 이어서 Crackme2를 풀어보겠다.

profile
보안 공부하는 대학교 2학년 / 시리즈에서 더욱 편하게 글을 찾아보실 수 있습니다:)

0개의 댓글