시스템 해킹/DreamHack으로 해커를 꿈꾸며

[DreamHack] System Hacking introduction (solve_me)

0x6b6569 2023. 2. 16. 11:55

 

https://dreamhack.io/lecture/courses/35

 

Welcome Hackers👨‍💻

시스템 해킹에 입문하려는 분들을 위한 강의

dreamhack.io

기본적인 시스템 공부를 시작하려면 C언어와 파이썬에 대한 기초 지식이 필요하다ㅏㅏ!!

 

지금 밑에 있는 코드를 보고 "Welcome Hackers :)"가 출력 되는 입력값은 찾는다면

당신은 컴퓨터의 깊고 깊은 심연을 들여다 볼 준비가 되었다는 뜻이다! ㅎㅎ (과연!?!?)  

 

 

 

 

관문은 총 2개로 준비되어 있다!!

 

#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;
}

 

먼저 C언어 이다.

 

16진수 sz 만큼 buf에 동적할당 해주고 buf에 fgets로 값을 저장하면 된다!

문제는 strncmp 하는 함수인데 우리가 입력한  buf와 DreamHack 이라는 문자열을 비교하고 있다.

 

strncmp 함수란?

 

int strcmp(const char* str1, const char* str2)

int strncmp(const char* str1, const char* str2, size_t n);

 

(1) str1 < str2 인 경우에는 음수 반환

(2) str1 > str2 인 경우에는 양수 반환

(3) str1 == str2 인 경우에는 0을 반환 합니다.

 

 

그러므로 buf값에 DreamHack값을 입력하면 Welcome Hacker를 출력할 수 있다!!

 

마지막은 파이썬이다!

 

#!/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 :/")

answer와 quiz가 같으면 welcome Hacker를 출력할 수 있다!

16진수 0x30과 10진수 quiz 배열 안에 있는 값과 비트 연산자인 ^ (XOR) 연산을 한 뒤 다시 quiz 배열에 다시 저장하고 있습니다. 

마지막으으로  chr(_) for _ in quiz 이부분이 조금 어려울 수 있는데 quiz 배열에 있는 아스키 코드를 문자열로 변환하는 코드 입니다.

quiz가 뭐가 나올까여????

손으로 XOR 하고 아스키 코드로 직접 바꿔야 할까요????? 

 

 

 

그냥 컴퓨터 시키죠 저 녀석이 저보다 똑똑한데 코드를 조금 추가 했습니다

 

답은 DreamHack이었어요

그럼 그대로 입력

성공!

!!