[Ghidra] 리버스 엔지니어링 기드라 실전 가이드 스터디 - chapter 5(level3)

2026. 1. 24. 03:29·Security/리버싱

1. level3 crackme(bof)

level 3 크랙미 디스어셈블 결과이다. 

param_2를 입력받아 welcome param_2를 하고 주사위 게임을 해서 10번 연속으로 맞춰야 게임을 이길 수 있다.

undefined8 main(int param_1,undefined8 *param_2)

{
  int iVar1;
  undefined8 uVar2;
  char name [24];
  uint seed;
  uint random_val;
  FILE *File;
  uint i;
  uint local_c;
  
  if (param_1 == 2) {
    seed = 0;
    File = fopen("/dev/urandom","r");
    fread(&seed,4,1,File);
    fclose(File);
    strcpy(name,(char *)param_2[1]);
    printf("Welcome %s.\n",name);
    srand(seed);
    puts("Guess the outcome of my rolled dice.");
    puts("Please clear this game without patching the binary...");
    for (i = 1; (int)i < 0xb; i = i + 1) {
      printf("My Dice rolled... Try your luck![%d/10]\n",(ulong)i);
      puts("1? or 2? ... 6?");
      iVar1 = rand();
      random_val = iVar1 % 6 + 1;
      iVar1 = getchar();
      local_c = iVar1 % 0x30;
      if (local_c == 10) {
        iVar1 = getchar();
        local_c = iVar1 % 0x30;
      }
      printf("My dice: %d, Your guess: %d\n",(ulong)random_val,(ulong)local_c);
      if (local_c != random_val) {
        puts("You Lose!");
        return 1;
      }
      puts("You Win!\n");
    }
    printf("Congratz %s!\n",name);
    uVar2 = 0;
  }
  else {
    printf("%s your_name_is_here\n",*param_2);
    uVar2 = 0xffffffff;
  }
  return uVar2;
}

 

 


2. 의사 난수

의사난수는 렌덤하게 보이지만 확정적인 계산으로 요구되는 수치로 된 수열이다. 규칙성, 재현성이 없는 수치를 컴퓨터가 작성한 수식으로 만들어 시드값을 계산하면서 랜덤하게 보이는 값을 나타낸 것이다. 

 

 컴퓨터는 논리적인 기계이므로 스스로 예측 불가능한 '진짜 우연'을 만들어낼 수 없다. 따라서 복잡한 계산식을 통해 마치 무작위인 것처럼 보이는 수의 나열을 만들어내는데, 이를 의사난수라고 한다.


3. 버퍼오버플로우(BOF)

버퍼 오버플로우는 할당된 영역보다 더 많은 데이터를 입력해 인접한 버퍼까지 데이터가 침범하는 것이다. c언어에서는 취약한 함수들이 있다. getpw, gets, sprintf, strcat, strcpy, vsprintf이다. 

 

level3문제는 name값이 24 byte영역을 가지고 strcpy로 입력을 받는다. 바로 아래 주소에 seed값이 있어 seed값까지 총 28byte를 strcpy로 덮어 씌우면 seed값을 고정할 수 있어 값을 예측할 수 있다. 

 


4. 실행

  • name 값을 넘어서 a로 28글자를 입력해 28byte를 입력하면 seed값을 0x61616161로 고정할 수 있다.
  • 그러면 시드값이 고정이고 계속 같은 값을 낼테니 해보면 564662362순으로 주사위가 나타난다. 


5. PyGhidra를 사용한 취약한 함수 찾기 스크립트

파이썬 스크립트로 bof에 취약한 함수들을 찾아보자.


#TODO Add User Code Here
def list_xrefs_call_functions(func_names):
    manager = currentProgram.getFunctionManager()
    for func in manager.getFunctions(True):#true는 정방향
        if func.getName() in func_names:
            for xref in getReferencesTo(func.getEntryPoint()):
                if xref.getReferenceType().toString() == 'UNCONDITIONAL_CALL':#call하는가?
                    print('{} is called at {}'.format(func.getName(), xref.getFromAddress()))


dagerous_fun_names = ["getpw", "gets", "sprintf", "strcat", "strcpy", "vsprintf"]

list_xrefs_call_functions(dagerous_fun_names)

 

기드라 스크립트로 돌리면 아래 문자열이 나온다.

 

 

strcpy가 0x00100910에 사용된 것을 알 수 있다.


6. 3줄 요약

  • 이 프로그램은 입력 길이를 검증하지 않는 strcpy 함수를 사용하여, 24바이트 크기의 name 버퍼를 넘어서는 입력 시 인접한 시드변수 영역까지 침범하는 버퍼 오버플로우 취약점이 존재한다.
  • a를 28개 입력하여 시드 값을 고정(0x61616161)하면 의사난수의 결과가 결정론적 패턴(5, 6, 4...)으로 바뀌어, 주사위 값을 미리 예측하고 게임을 클리어할 수 있다.
  • 기드라의 파이썬 스크립팅(PyGhidra) 기능을 활용하면 strcpy와 같이 보안에 취약한 함수들이 바이너리 내 어디서 호출되는지 자동으로 탐색하여 분석 시간을 단축할 수 있다.

 

 

 

'Security > 리버싱' 카테고리의 다른 글

[Ghidra] 리버스 엔지니어링 기드라 실전 가이드 스터디 - chapter 5(level4-GO바이너리)  (0) 2026.01.24
[Ghidra] 리버스 엔지니어링 기드라 실전 가이드 스터디 - 기드라 취약점 3  (0) 2026.01.23
[Ghidra] 리버스 엔지니어링 기드라 실전 가이드 스터디 - chapter 5(level2)  (0) 2026.01.22
[Ghidra] 리버스 엔지니어링 기드라 실전 가이드 스터디 - chapter 5(level1)  (0) 2026.01.22
[Ghidra] 리버스 엔지니어링 기드라 실전 가이드 스터디 - 00  (0) 2026.01.04
'Security/리버싱' 카테고리의 다른 글
  • [Ghidra] 리버스 엔지니어링 기드라 실전 가이드 스터디 - chapter 5(level4-GO바이너리)
  • [Ghidra] 리버스 엔지니어링 기드라 실전 가이드 스터디 - 기드라 취약점 3
  • [Ghidra] 리버스 엔지니어링 기드라 실전 가이드 스터디 - chapter 5(level2)
  • [Ghidra] 리버스 엔지니어링 기드라 실전 가이드 스터디 - chapter 5(level1)
yt_5246
yt_5246
yt5246 님의 블로그 입니다.
  • yt_5246
    yt의 공부 블로그
    yt_5246
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 분류 전체보기 (61)
      • IT (1)
      • Security (11)
        • 시스템해킹 (3)
        • 리버싱 (6)
        • 암호학 (0)
        • tools (2)
      • Book (0)
      • 자격증 (3)
      • 워게임 (46)
        • DVWA (7)
        • WebGoat (4)
        • webhacking.kr (35)
      • 버그바운티 (0)
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
yt_5246
[Ghidra] 리버스 엔지니어링 기드라 실전 가이드 스터디 - chapter 5(level3)
상단으로

티스토리툴바