[Dreamhack]Simple Crack Me write-up

최윤지·2024년 11월 4일

Reverse Engineering

목록 보기
7/7

simple_crack_me

simple_crack_me 동작 분석

ghidra에서 프로젝트 생성 및 프로그램 임포트

임포트 결과 요약 ▽
임포트 결과 요약

Language ID: x86:LE:64
=> x86-64 아키텍처에서 동작하는 프로그램
Compiler ID: gcc
=> gcc로 컴파일
Executable Format: Executable and Linkable Format(ELF)
=> Linux에서 실행 가능한 바이너리

이 프로그램은 실행하기 위해 x86-64비트 아키텍처에서 구동되는 리눅스 환경 필요

프로그램 실행

Crackme는 이용자로부터 입력값을 받은 값이 정답인지 아닌지 검증하는 프로그램
simple_crack_me 바이너리도 Crackme에 해당

입력한 값이 정답이 아니기 때문에 'is wrong x(' 출력

입력 결과 정수 형식의 입력을 받아들이고 입력받은 정수를 '%x is wrong x('와 같은 형식의 포맷 스트링으로 출력하는 프로그램으로 추론

코드브라우저 실행

문자열 검색

'is wrong x(' 검색 후 해당 문자열이 존재하는 위치로 디스어셈블 리스팅 이동

문자열을 참조하여 사용하는 부분 찾기

References-Show References to Address

Context 열이 PARAM인 경우 함수의 매개변수에 인자로 전달되는 과정에서 참조가 발생한 경우 의미
=> 해당 문자열이 출력 함수의 인자로 전달되어 호출되는 부분을 찾기 위함

디컴파일된 코드 분석

  • 11번 라인: 변수 local_14의 값을 0으로 초기화

  • 12번 라인: FUN_0040bb20 함수를 분석해보면 DAT_004b6004는 문자열 "%d"를 나타내므로 변수 local_14에 하나의 정수값을 입력받는 scanf()

  • 13번 라인: 입력 받은 local_14의 값과 0x13371337을 비교한 후 다르면 1, 같으면 0을 bVar1에 저장

  • 14~19번 라인
    - bVar1이 1이면 printf("%x is wrong x(\n", local_14);
    - bVar1이 0이면 printf("Correct!");

* 0x13371337을 10진수로 변환하면 322376503

0개의 댓글