๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ ๋ณด์•ˆ·์ทจ์•ฝ์ /๐Ÿ”ธ์‹œ์Šคํ…œ·์šด์˜์ฒด์ œ

[dreamhack] System Hackig Introduction

by Jenny:! 2023. 7. 8.

์†Œํ”„ํŠธ์›จ์–ด์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์ทจ์•ฝ์  ๋ฐ ์ด๋ฅผ ๊ณต๊ฒฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‹ค๋ฃฐ ๊ฒƒ์ด๋‹ค.

 

#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;
}
  1. int main(): C ํ”„๋กœ๊ทธ๋žจ์˜ ์ง„์ž…์ , ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰์ด ์‹œ์ž‘.
  2. int sz = 0x30;: ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ 16์ง„์ˆ˜ 0x30์„ ํ• ๋‹น. 0x30์€ 10์ง„์ˆ˜๋กœ 48
  3. char *buf = (char *)malloc(sizeof(char) * sz);: buf๋ผ๋Š” ์ด๋ฆ„์˜ char ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธ, sz์˜ ํฌ๊ธฐ๋งŒํผ ๋™์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น. malloc ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๋ฉฐ, sizeof(char) * sz๋Š” sz ํฌ๊ธฐ๋งŒํผ์˜ char ํ˜•์‹์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๋ผ๋Š” ์˜๋ฏธ๋‹ค.
  4. puts("Hello World!");: puts ํ•จ์ˆ˜๋Š” ๋ฌธ์ž์—ด์„ ์ถœ๋ ฅํ•˜๋Š” ํ•จ์ˆ˜
  5. printf("Education + Hack = ?\\n");: ํ˜•์‹ ์ง€์ •์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ "Education + Hack = ?" ๋ฌธ์ž์—ด์„ ์ถœ๋ ฅ
  6. fgets(buf, sz, stdin);: ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ์„ ๋ฐ›์•„ buf ๋ณ€์ˆ˜์— ์ €์žฅ
    stdin - ํ‘œ์ค€ ์ž…๋ ฅ ์ŠคํŠธ๋ฆผ
  7. if (!strncmp(buf, "DreamHack", 9)): buf์™€ "DreamHack" ๋ฌธ์ž์—ด์„ ์ฒ˜์Œ๋ถ€ํ„ฐ 9๊ธ€์ž๊นŒ์ง€ ๋น„๊ต
    ! - ๋…ผ๋ฆฌ NOT ์—ฐ์‚ฐ์ž
  8. printf("Welcome Hackers :)\\n");: "Welcome Hackers :)" ๋ฌธ์ž์—ด์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” buf์™€ "DreamHack"์ด ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  9. else printf("No No :/n");: "No No :/" ๋ฌธ์ž์—ด์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” buf์™€ "DreamHack"์ด ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  10. return 0;: main ํ•จ์ˆ˜๋ฅผ ์ข…๋ฃŒํ•˜๊ณ  0์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜ ๊ฐ’ 0์€ ํ”„๋กœ๊ทธ๋žจ์˜ ์ •์ƒ ์ข…๋ฃŒ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

 

 

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

 

 

 

 

ํ•จ์ˆ˜ fget, fgetws

char *fgets(
   char *str, //๋ฐ์ดํ„ฐ์˜ ์Šคํ† ๋ฆฌ์ง€ ์œ„์น˜
   int numChars, //์ฝ์„ ์ตœ๋Œ€ ๋ฌธ์ž ์ˆ˜
   FILE *stream //FILE ๊ตฌ์กฐ์ฒด์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ
);
wchar_t *fgetws(
   wchar_t *str,
   int numChars,
   FILE *stream
);

strcmp์˜ break, return๊ธฐ์ค€์€ ๋‹ค๋ฅธ ๋ฌธ์ž์—ด์ด ๋‚˜์˜ค๊ฑฐ๋‚˜ ๋ฌธ์ž์—ด์˜ ๋์„ ์•Œ๋ฆฌ๋Š” \0์ด ๋‚˜์˜ฌ๋•Œ ๊นŒ์ง€๋‹ค.

 

 

 

ํ•จ์ˆ˜ malloc

malloc ์‚ฌ์šฉ๋ฒ•

#include <stdlib.h> //malloc ํ•จ์ˆ˜๊ฐ€ ํฌํ•จ๋œ ํ—ค๋” ํŒŒ์ผ

void* malloc(size_t size)

<stdlib.h> ํ—ค๋”๋‚˜ <malloc.h> ํ—ค๋”๋ฅผ ํฌํ•จ์‹œ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

์ธ์ž ๊ฐ’
size_t : ๋™์ ์œผ๋กœ ํ• ๋‹นํ•  ๋ฉ”๋ชจ๋ฆฌ์˜ ํฌ๊ธฐ


๋ฐ˜ํ™˜ ๊ฐ’
์„ฑ๊ณต ์‹œ ํ• ๋‹นํ•œ ๋ฉ”๋ชจ๋ฆฌ์˜ ์ฒซ๋ฒˆ์งธ ์ฃผ์†Œ ๋ฆฌํ„ด, ์‹คํŒจ์‹œ NULL๋ฆฌํ„ด

 

malloc ํ•จ์ˆ˜ ์‚ฌ์šฉ ์˜ˆ์ œ

#include <stdio.h>
#include <stdlib.h>

void main()
{
    int* arr;
    arr = (int*)malloc(sizeof(int) * 4); // size 4 ๋™์ ํ• ๋‹น

    arr[0] = 100;
    arr[1] = 200;
    arr[2] = 300;
    arr[3] = 400;

    for (int i = 0; i < 4; i++) {
        printf("arr[%d] : %d\n", i, arr[i]);
    }

    free(arr); //๋™์ ํ• ๋‹น ํ•ด์ œ
}

๋ฐฐ์—ด์„ ๋™์ ์œผ๋กœ ํ• ๋‹นํ•ด์•ผ ํ•  ๊ฒฝ์šฐ์—๋Š” malloc ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์™€๋Š” ๋‹ฌ๋ฆฌ, C์–ธ์–ด๋Š” ๋™์ ์œผ๋กœ size๋ฅผ ๊ฒฐ์ •ํ•ด์•ผ ํ•  ๋•Œ๋Š” mallocํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ๋งŒ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

 

malloc์€ ๋ฆฌํ„ด ๊ฐ’์œผ๋กœ voidํ˜• ํฌ์ธํ„ฐ๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํŠน์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. malloc์€ ๋ฉ”๋ชจ๋ฆฌ๋งŒ ํ• ๋‹นํ•˜๋Š” ํ•จ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋– ํ•œ ๋ฐ์ดํ„ฐ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š”์ง€๋Š” ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ์ผ๋‹จ voidํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ฐœ๋ฐœ์ž๊ฐ€ ์•Œ๋งž๊ฒŒ ๋ณ€ํ™˜ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ์ˆ˜๊ฐ€ ์„ค๊ณ„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ ์œ„์˜ ์˜ˆ์ œ์—์„œ๋Š” ๋ฆฌํ„ด๋œ void*๋ฅผ int*๋กœ ์บ์ŠคํŒ…ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. C์–ธ์–ด๊ฐ€ ์˜ค๋ฒ„๋กœ๋”ฉ์ด ์•ˆ๋˜๊ธฐ์— ์–ด์ฉ” ์ˆ˜ ์—†๋Š” ๋ถ€๋ถ„์ธ ๋“ฏํ•ฉ๋‹ˆ๋‹ค.

 

์ธ์ž ๊ฐ’์œผ๋กœ sizeof(int)๋ฅผ ํ•˜๋Š” ์ด์œ ๋Š” int์˜ ํฌ๊ธฐ๋งŒํผ์„ ํ• ๋‹น๋ฐ›์•„์•ผ ํ•˜๋‹ˆ int์˜ ํฌ๊ธฐ์™€ ํ• ๋‹น๋ฐ›์„ ํฌ๊ธฐ๋ฅผ ์„œ๋กœ ๊ณฑํ•ด์ฃผ์–ด ์ตœ์ข… ๋ฉ”๋ชจ๋ฆฌ์˜ ํฌ๊ธฐ๋ฅผ ๋„ฃ์–ด์ฃผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

๋ฉ”๋ชจ๋ฆฌ์˜ ํ•ด์ œ (free)

#include <stdlib.h> // freeํ•จ์ˆ˜๊ฐ€ ํฌํ•จ๋œ ํ—ค๋”ํŒŒ์ผ

void free(void *ptr);

mallocํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ ๋’ค ๊ผญ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œ์‹œ์ผœ ์ค์‹œ๋‹ค.

 

์ธ์ž ๊ฐ’ 
ptr : ํ•ด์ œํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ํฌ์ธํ„ฐ

 

๋™์  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๋ฉด ํž™ ๋ฉ”๋ชจ๋ฆฌ์— ๊ณต๊ฐ„์ด ์ƒ์„ฑ๋˜๊ณ , ์ด ๊ณต๊ฐ„์€ ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ํ›„ ํ•ด์ œ๋ฅผ ํ•ด์ฃผ์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰๋งŒ ๊ณ„์†ํ•ด์„œ ์ฆ๊ฐ€ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. (๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜)