Hacking/DreamHack 시스템 해킹 강의

[Dreamhack] System Hacking Introduction

미역줄기줄기 2024. 2. 3. 10:49
728x90

강의 세션을 시작하자마자 문제 코드가 나를 반겨줬다 ^^..

 

  • 아래의 두 코드를 읽고 "welcome Hackers :)"가 출력되는 입력값을 찾으세요.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
  int sz = 0x30;
  char *buf = (char *)malloc(sizeof(char) * sz);

  puts("Hello World!");
  printf("Education + Hack = ?\\n");
  fgets(buf, sz, stdin);

  if (!strncmp(buf, "DreamHack", 9))
    printf("Welcome Hackers :)\\n");
  else
    printf("No No :/n");

  return 0;
}

훔.. fgets(buf, sz, stdin)은 입력받은걸 최대 sz만큼 읽어서 buf에 저장 하는거고

if문을 살펴보면 buf에서 첫글자부터 9개의 문자가 DreamHacak이랑 같으면 Welcome Hackers :)가 출력되겠다!!

 

즉, 내가 DreamHack을 입력하면 끝!

 

#!/usr/bin/python3

quiz = [116, 66, 85, 81, 93, 120, 81, 83, 91]

for i in range(len(quiz)):
    quiz[i] ^= 0x30

quiz = ''.join([chr(_) for _ in quiz])
answer = input()

if answer == quiz:
    print("Welcome Hackers :)")
else:
    print("No No :/")

 

C보다 python이 미숙해서.. 조금 어려웠다. 

그래서 차근차근 쪼개서 분석!!! 급할수록 천천히

 

 

for i in range(len(quiz)):
    quiz[i] ^= 0x30

반복문 for를 통해 quiz 리스트의 각 요소에 XOR 연산을 수행하는 부분이다. 

파이썬에서 ' ^ ' 는 XOR연산자이다! 

즉 quiz[i] ^= 0x30은 quiz[ i ]와 0x30을 XOR연산한 결과를 quiz[ i ]에 다시 저장하는 것이다.

 

quiz = ''.join([chr(_) for _ in quiz])

 

 

여기서 chr(_)는 주어진 정수 ' _ '를 해당하는 ASCII 문자로 변환한다. 따라서 quiz 리스트의 모든 정수 값들을 각각 문자로 변환한 다음, 이 문자들을 빈 문자열 ' ' 에 결합하여 하나의 문자열을 생성한다.

 

자 그럼 우리가 해야할 것은

1. quiz의 원소[ 116, 66, 85, 81, 93, 120, 81, 83, 91 ] 을 각각 0x30과 XOR 연산을 한다.

2. XOR을 해서 나온 결과를 하나하나 문자로 바꿔서 다  더한다. 그렇게 하나의 문자열을 만든다.

 

사실 이과정에서도 많은 시행착오를 겪었다.. 멀었다 멀었어

quiz의 원소들은 10진수이고 0x30을 16진수이다. 0x30을 10진수로 바꾸면 48이다.

이제 원소들을 48과 XOR연산하고 그 결과를 바로 아스키 코드로 바꾼다. 아래는 과정이다. 

하.. gpt가 계속 틀린 답을 말해서 하나하나 계산 프로그램에 입력함

  • 116 ^ 0x30 = D
  • 66 ^ 0x30 = r
  • 85 ^ 0x30 = e
  • 81 ^ 0x30 = a
  • 93 ^ 0x30 = m
  • 120 ^ 0x30 = H
  • 81 ^ 0x30 = a
  • 83 ^ 0x30 = c
  • 91 ^ 0x30 = k

DreamHack을 입력하면 끝!!

 

 


험난했던 첫 강의,, gpt에 너무 의지하지 말고 스스로 생각하고 실행하는게 좋을 것 같다는 생각이 들었다.