[Dreamhack] System Hacking Introduction
강의 세션을 시작하자마자 문제 코드가 나를 반겨줬다 ^^..
- 아래의 두 코드를 읽고 "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연산하고 그 결과를 바로 아스키 코드로 바꾼다. 아래는 과정이다.
- 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에 너무 의지하지 말고 스스로 생각하고 실행하는게 좋을 것 같다는 생각이 들었다.