์ํํธ์จ์ด์์ ๋ฐ์ํ ์ ์๋ ๋๋ถ๋ถ์ ์ทจ์ฝ์ ๋ฐ ์ด๋ฅผ ๊ณต๊ฒฉํ๋ ๋ฐฉ๋ฒ์ ๋ค๋ฃฐ ๊ฒ์ด๋ค.
#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;
}
- int main(): C ํ๋ก๊ทธ๋จ์ ์ง์ ์ , ํ๋ก๊ทธ๋จ์ ์คํ์ด ์์.
- int sz = 0x30;: ์ด๊ธฐ๊ฐ์ผ๋ก 16์ง์ 0x30์ ํ ๋น. 0x30์ 10์ง์๋ก 48
- char *buf = (char *)malloc(sizeof(char) * sz);: buf๋ผ๋ ์ด๋ฆ์ char ํฌ์ธํฐ ๋ณ์๋ฅผ ์ ์ธ, sz์ ํฌ๊ธฐ๋งํผ ๋์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น. malloc ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ฉฐ, sizeof(char) * sz๋ sz ํฌ๊ธฐ๋งํผ์ char ํ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ผ๋ ์๋ฏธ๋ค.
- puts("Hello World!");: puts ํจ์๋ ๋ฌธ์์ด์ ์ถ๋ ฅํ๋ ํจ์
- printf("Education + Hack = ?\\n");: ํ์ ์ง์ ์๋ฅผ ์ฌ์ฉํ์ฌ "Education + Hack = ?" ๋ฌธ์์ด์ ์ถ๋ ฅ
- fgets(buf, sz, stdin);: ์ฌ์ฉ์๋ก๋ถํฐ ์
๋ ฅ์ ๋ฐ์ buf ๋ณ์์ ์ ์ฅ
stdin - ํ์ค ์ ๋ ฅ ์คํธ๋ฆผ - if (!strncmp(buf, "DreamHack", 9)): buf์ "DreamHack" ๋ฌธ์์ด์ ์ฒ์๋ถํฐ 9๊ธ์๊น์ง ๋น๊ต
! - ๋ ผ๋ฆฌ NOT ์ฐ์ฐ์ - printf("Welcome Hackers :)\\n");: "Welcome Hackers :)" ๋ฌธ์์ด์ ์ถ๋ ฅํฉ๋๋ค. ์ด๋ buf์ "DreamHack"์ด ์ผ์นํ๋ ๊ฒฝ์ฐ ์คํ๋ฉ๋๋ค.
- else printf("No No :/n");: "No No :/" ๋ฌธ์์ด์ ์ถ๋ ฅํฉ๋๋ค. ์ด๋ buf์ "DreamHack"์ด ์ผ์นํ์ง ์๋ ๊ฒฝ์ฐ ์คํ๋ฉ๋๋ค.
- 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 : ํด์ ํ๊ณ ์ ํ๋ ๋ฉ๋ชจ๋ฆฌ์ ํฌ์ธํฐ
๋์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ฉด ํ ๋ฉ๋ชจ๋ฆฌ์ ๊ณต๊ฐ์ด ์์ฑ๋๊ณ , ์ด ๊ณต๊ฐ์ ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋ ๋๊น์ง ์กด์ฌํฉ๋๋ค. ๋ฐ๋ผ์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ํ ํด์ ๋ฅผ ํด์ฃผ์ง ์๋๋ค๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋๋ง ๊ณ์ํด์ ์ฆ๊ฐํ๊ฒ ๋ฉ๋๋ค. (๋ฉ๋ชจ๋ฆฌ ๋์)
'๐ ๋ณด์ยท์ทจ์ฝ์ > ๐ธ์์คํ ยท์ด์์ฒด์ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [dreamhack] Exploit Tech: Shellcode (0) | 2023.07.13 |
|---|---|
| [dreamhack] Background: Computer Architecture (0) | 2023.07.10 |
| [dreamhack] pwnable.kr bof (0) | 2022.08.21 |
| [ubuntu] gdb ์ค์ต (0) | 2022.08.21 |
| Set-UID ์ ๋ฆฌ (0) | 2022.08.21 |