본문 바로가기
Study/악성코드

[윈도우즈 보안과 악성코드 기초] 리버싱 이론 실습_crackme#1, #3

by 8희 2024. 3. 30.

abex' crackme #1

abex' crackme #1은?

실행 결과

 

  • 크랙 연습 공개 프로그램 - Error 메시지 창에서 OK 창이 나오게 해야 됨

 

디버깅 - EP 확인하기 

 

  • 주석 창을 보면 세 개의 메시지 창이 뜨는 프로그램이란 걸 알 수 있음
  • 장점: 시작 주소와 EP가 동일 (시작하자마자 시작 주소가 나옴)
    • 매우 간단하고 명확하게 작성됨 (stub code가 없음) 
    • 교육용 목적이라 그럼

 

사용 함수 분석

 

  • MessageBox: 메시지 창을 띄우는 함수
    • 파라미터: Style → Title → Text → hOwner 총 4개
    • 이 메시지 함수를 띄우기 위해선 위에 4개의 파라미터가 필요한 것
  • GetDriveTypeA: 드라이브 타입을 가져오는 API 함수
    • 디스크 드라이브가 이동식, 고정식, CD-ROM, RAM 디스크 또는 네트워크 드라이브인지 여부를 확인
    • 파라미터: RootPathName
      • 루트의 경로
  • ExitProcess: 프로세스 종료 함수
    • 프로세스는 실행돼서 메모리에 상주하고 있는 프로그램을 의미
    • 즉, 현재 프로그램을 종료하는 함수

 

주요 어셈블리 명령어

  • PUSH
    • 스택의 값을 입력
  • CALL
    • 지정된 주소의 함수를 호출
  • INC
    • 값을 1 증가
  • DEC
    • 값을 1 감소
  • JMP
    • 지정된 주소로 점프
  • CMP
    • 주어진 두 개의 operand 비교
    • SUB 명령어와 동일, 그러나 operand 값이 변경되지 않고 EFLAGS 레지스터만 변경
      • 두 operand의 값이 동일 -> SUB 결과는 0, ZF는 1로 세팅
  • JE
    • 조건 분기(Jump if equal)
    • ZF = 1이면 점프

 

cracking

 

  • 크랙: 패치를 통해 코드의 프로그램 수정
  • 실행(F8/F9_
  • Copy to executable로 저장

  • 해당 파일을 그냥 실행하면 JE 밑에 있는 401028 주소로 진행됨
  • JE를 JMP로 수정하면 두 번째 메시지 창이 아닌 세 번째 메시지 창을 띄우도록 패치할 수 있음

  • JMP로 수정 시 비교하지 않고 지정된 주소로 점프함
    • 401028으로 가는 건 똑같으나 401028에서 F8을 클릭하면 40102A로 가지 않고 40103D로 이동  

 

abex' crackme #3

abex' crackme #3은?

실행 결과

  • 크랙 연습 공개 프로그램 - Error 메시지 창에서 OK 창이 나오게 해야 됨
  • key file 관련 리버싱!

 

디버깅 - EP 확인하기, 사용 함수 분석

 

 

  • 시작 주소와 EP가 동일
  • MessageBoxA
  • CreateFileA: 파일 또는 I/O 디바이스를 만들거나 읽는 함수
    • 파라미터: FileName, Access, ShareMode, pSecurity, Mode, Attributes, hTemplateFile
      • Mode = OPEN_EXISTING
      • Access = GENERIC_READ
      • FileName=“abex.l2c”
  • GetFileSize: 지정된 파일의 크기(바이트)를 검색
    • 반환 값: 파일 사이즈
      • 파일 사이즈가 1이라는 건? → 아스키 기준으로 글자가 하나다!

 

메시지 창을 중심으로 분석 및 패치

 

  • 패치 전엔 key가 없기 때문에 1 → 2 → 3 순서대로 실행됨
  • 그냥 쭉 실행하면 CreateFileA 함수 실행하고 리턴 값이 FFFFFFF로 설정됨
  • CreatFileA 함수에서 FileName=“abex.l2c”라는 것을 보고 abex.l2c 파일이 필요하다는 것을 알 수 있음

  • 그냥 간단하게 abex.12c 파일 생성 (내용 x, 같은 경로)
  • 이제 파일은 찾았지만 유효하지 않다는 메시지 창까지 뜸

  • 3번이 수행이 안 돼서 4번이 수행된 거임
  • 이번에는 EAX에 FFFFFFF 가 아닌 다른 값이 들어감

  • GetFileSize를 실행하면 EAX에 000000000가 저장됨

  • 00401046에서 CMP 명령으로 EAX에 저장된 값과 12를 비교함
  • JNZ 00401040 
    • not zero -> 00401060
  • 앞서 생성한 abex.12c 파일 내용을 변경
    • 문자열의 길이 18자리(0x12)가 되게 변경해야 됨

  • GetFileSize 실행 시 EAX에 12 저장

  • 끝까지 실행하면 keyfile을 찾았다는 메시지 창이 뜸

  • 패치 완료