๋ฐ์ดํฐ๋ฅผ AES ์ํธํํ์ฌ ์์ผ ํต์ ํ๋ C++ ํ๋ก๊ทธ๋จ์ ๋ฆฌ๋ฒ์ฑํด๋ณด๊ฒ ์ต๋๋ค.
OpenSSL ๋ผ์ด๋ธ๋ฌ๋ฆฌ(v3.4.0)๋ฅผ ํตํด AES ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์์ต๋๋ค.
#include <iostream>
#include <iomanip>
#include <openssl/evp.h>
#include <openssl/rand.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "libssl.lib")
#pragma comment(lib, "libcrypto.lib")
#define AES_KEY_SIZE 32 // AES-256
#define AES_BLOCK_SIZE 16
// AES ์ํธํ ํจ์ (EVP API ์ฌ์ฉ)
int aes_encrypt(const unsigned char* input, int input_len, unsigned char* output, const unsigned char* key, const unsigned char* iv) {
EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new();
if (!ctx) {
std::cerr << "Error creating EVP context!" << std::endl;
return -1;
}
int len;
int ciphertext_len;
if (1 != EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv)) {
std::cerr << "Error initializing encryption!" << std::endl;
EVP_CIPHER_CTX_free(ctx);
return -1;
}
if (1 != EVP_EncryptUpdate(ctx, output, &len, input, input_len)) {
std::cerr << "Error during encryption!" << std::endl;
EVP_CIPHER_CTX_free(ctx);
return -1;
}
ciphertext_len = len;
if (1 != EVP_EncryptFinal_ex(ctx, output + len, &len)) {
std::cerr << "Error finalizing encryption!" << std::endl;
EVP_CIPHER_CTX_free(ctx);
return -1;
}
ciphertext_len += len;
EVP_CIPHER_CTX_free(ctx);
return ciphertext_len;
}
// ์์ผ ์ด๊ธฐํ ๋ฐ ๋ฐ์ดํฐ ์ ์ก ํจ์
void send_encrypted_data(const char* host, int port, const unsigned char* encrypted_data, int data_len) {
WSADATA wsaData;
SOCKET sock;
sockaddr_in server_addr;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
std::cerr << "WSAStartup failed" << std::endl;
return;
}
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock == INVALID_SOCKET) {
std::cerr << "Socket creation failed!" << std::endl;
WSACleanup();
return;
}
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(port);
inet_pton(AF_INET, host, &server_addr.sin_addr);
if (connect(sock, (sockaddr*)&server_addr, sizeof(server_addr)) == SOCKET_ERROR) {
std::cerr << "Connection failed!" << std::endl;
closesocket(sock);
WSACleanup();
return;
}
// ๋ฐ์ดํฐ ์ ์ก
send(sock, (const char*)encrypted_data, data_len, 0);
std::cout << "Encrypted data sent!" << std::endl;
closesocket(sock);
WSACleanup();
}
int main() {
// AES ํค์ IV ์ค์
unsigned char key[AES_KEY_SIZE] = {
0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF
}; // 32 ๋ฐ์ดํธ (AES-256)
unsigned char iv[AES_BLOCK_SIZE] = {
0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF
}; // 16 ๋ฐ์ดํธ (AES ๋ธ๋ก ํฌ๊ธฐ)
unsigned char input[] = "Hello, this is a test message for AES encryption!";
unsigned char encrypted_data[1024];
// ์ํธํ
int encrypted_len = aes_encrypt(input, strlen((char*)input), encrypted_data, key, iv);
if (encrypted_len < 0) {
std::cerr << "Encryption failed!" << std::endl;
return 1;
}
// ์์ผ์ ํตํด ์ํธํ๋ ๋ฐ์ดํฐ ์ ์ก
send_encrypted_data("127.0.0.1", 8080, encrypted_data, encrypted_len);
return 0;
}
์์ ์ ์ฝ๋๋ key์ iv๋ฅผ ๋ฌธ์์ด๋ก ์ ์ฅํ์์ต๋๋ค.
#define AES_KEY_SIZE 32
#define AES_BLOCK_SIZE 16
// ์์ ์ key, iv
unsigned char key[AES_KEY_SIZE] = "0123456789abcdef0123456789abcdef";
unsigned char iv[AES_BLOCK_SIZE] = "0123456789abcdef";
๊ทธ๋ฐ๋ฐ ํด๋น ์์ค์ฝ๋๋ ์ค๋ฒํ๋ก๊ฐ ๋ฐ์ํฉ๋๋ค.
์ด์ ๋ key์ iv ๋ฐฐ์ด ํฌ๊ธฐ์ ์ด๊ธฐํ ๊ฐ(๊ฐ 32, 16๋ฐ์ดํธ)์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋๋ค.
C/C++ ๋ฌธ์์ด ๋ฐ์ดํฐ๋ ์ข
๋ฃ ๋ฌธ์(\0)๋ฅผ ํฌํจํ๋ฏ๋ก
key์ iv์ ํฌ๊ธฐ๋ ์ข
๋ฃ ๋ฌธ์(\0) 1๋ฐ์ดํธ๋ฅผ ํฌํจํ ๊ฐ 33, 17๋ฐ์ดํธ๊ฐ ๋์ด ์ค๋ฒํ๋ก ์ด์๊ฐ ์์ต๋๋ค.
์ด๋ด ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐฐ์ด๋ก ์ ์ฅํ๊ฑฐ๋ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํ๋ฉด ๋ฉ๋๋ค. ๊ทธ๋ ๊ฒ ํ๋ฉด ์ข ๋ฃ ๋ฌธ์๊ฐ ์ถ๊ฐ๋์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ทธ๋์ ๋ฐฐ์ด์ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ์ฌ ์ฌ์ฉํ๊ฒ ์ต๋๋ค.
// ์์ ํ key, iv
unsigned char key[AES_KEY_SIZE] = {
0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF
};
unsigned char iv[AES_BLOCK_SIZE] = {
0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF
};
๋ด์ฉ๋ ํ ๋ฐ๋์์ง๋ง? ์๋ฌดํผ ์์ ์๋ฃํ์ผ๋ ๋์ค์ด์ ๋ธ์ ์งํํด๋ณด๊ฒ ์ต๋๋ค.
1. ๋ณ์ ์ ์
- xmmword
128๋นํธ ๋ฒกํฐ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋ ์ฌ์ฉ๋๋ ์ฉ์ด
xmm(128๋นํธ ํฌ๊ธฐ์ ๋ ์ง์คํฐ) + word(๋ฐ์ดํฐ)
IDA์ wmmword๊ฐ ์ซ์(hex)๋ก ์ ์ฅ๋์ด ์์ต๋๋ค.
๋ณํํ๋ฉด ๋ฐ๋๋ก ๋ค์งํ ๋ฌธ์๊ฐ ๋์ต๋๋ค.
xmmword๋ 128๋นํธ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ ์ง์คํฐ๋ก 16๋ฐ์ดํธ ๋ฌธ์์ด์ด ํด๋น ๋ ์ง์คํฐ์ ์ ์ฅ๋๋ฉด ๋ฌธ์์ด์ ์ญ์์ผ๋ก ์ ์ฅํ๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ ๋ฐ์ดํธ๋ฅผ ๋ฆฌํ ์๋์ธ ๋ฐฉ์์ผ๋ก ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
- ์๋์ธ(Endian)
- ์ปดํจํฐ ์ํคํ ์ฒ๊ฐ ์ฌ๋ฌ ๋ฐ์ดํธ๋ก ๊ตฌ์ฑ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ ๋ ๊ทธ ์์(๋ฐ์ดํธ ์์(byte order))๋ฅผ ์ง์ ํ๋ ๊ฐ๋
- ๋ฆฌํ ์๋์ธ(Little endian)
- ์์ ๋ฐ์ดํธ๋ถํฐ ํฐ ๋ฐ์ดํธ ์์๋๋ก ์ ์ฅํ๋ ๋ฐฉ์
- ์ฒซ ๋ฒ์งธ ๋ฐ์ดํธ๊ฐ ๊ฐ์ฅ ์์ ๊ฐ!
- ๊ฐ์ฅ ์ค์ํ ๋ฐ์ดํธ(Most Significant Byte, MSB)๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์ฅ ๋์ ์ฃผ์์ ์ ์ฅ
- x84, x64 ์์คํ ์ ๋น๋กฏํด ๋๋ถ๋ถ์ ์ํคํ ์ฒ๋ ๋ฆฌํ ์๋์ธ ๋ฐฉ์์ ์ฌ์ฉ
- ์์)
- ์์ ๋ฐ์ดํธ๋ถํฐ ํฐ ๋ฐ์ดํธ ์์๋๋ก ์ ์ฅํ๋ ๋ฐฉ์
์ฃผ์ | 0x00 | 0x01 | 0x02 | 0x03 |
๊ฐ | 0x78 | 0x56 | 0x34 | 0x12 |
- ๋น
์๋์ธ(Big endian)
- ํฐ ๋ฐ์ดํธ๋ถํฐ ์์ ๋ฐ์ดํธ ์์๋๋ก ์ ์ฅํ๋ ๋ฐฉ์
- ์ฒซ ๋ฒ์งธ ๋ฐ์ดํธ๊ฐ ๊ฐ์ฅ ํฐ ๊ฐ!
- ๊ฐ์ฅ ์ค์ํ ๋ฐ์ดํธ(MSB)๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์ฅ ๋ฎ์ ์ฃผ์์ ์ ์ฅ
- ๋คํธ์ํฌ ํ๋กํ ์ฝ(TCP/IP ๋ฑ)์์ ๋น ์๋์ธ ๋ฐฉ์์ ์ฌ์ฉ
- ์์)
- ํฐ ๋ฐ์ดํธ๋ถํฐ ์์ ๋ฐ์ดํธ ์์๋๋ก ์ ์ฅํ๋ ๋ฐฉ์
์ฃผ์ | 0x00 | 0x01 | 0x02 | 0x03 |
๊ฐ | 0x12 | 0x34 | 0x56 | 0x78 |
2. ์๋ณตํธํ๋ฅผ ์ํ ์ค๋น
ํด๋น ํ๋ก๊ทธ๋จ์ ์๋ณตํธํ ์์ ์ ์ํด EVP_CIPHER_CTX_new API๋ฅผ ํธ์ถ
API ํธ์ถ์ ์ค๋ฅ๊ฐ ์์ผ๋ฉด ์ค๋ฅ ๋ฉ์ธ์ง ์ถ๋ ฅ
- EVP_CIPHER_CTX_new
OpenSSL ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ฌ์ฉํ๋ ํจ์๋ก ์ํธํ ๋ฐ ๋ณตํธํ ์์ (์ํธํ API)์ ์ํํ๊ธฐ ์ํด ํ์
EVP_CIPHER_CTX ์ปจํ ์คํธ ๊ตฌ์กฐ์ฒด๋ฅผ ์ด๊ธฐํํ์ฌ ๊ทธ์ ๋ํ ํฌ์ธํฐ๋ฅผ ๋ฐํ
- EVP_CIPHER_CTX
OpenSSL์ ์/๋ณตํธํ ์์ ์์ ์ฌ์ฉํ๋ ์ํ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ๊ตฌ์กฐ์ฒด
๋ค์ํ ์ํธํ ์๊ณ ๋ฆฌ์ฆ์ ๋ํด ์ํธํ ๋ฐ ๋ณตํธํ์ ์ํ๋ฅผ ์ถ์ ํ๋ ๋ฐ ์ฌ์ฉ
ํค, ์ด๊ธฐ๋ฒกํฐ(IV), ๊ธฐํ ํ์ํ ๋ด๋ถ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ
- EVP_CIPHER_CTX
3. AES-256 ์ํธํ
์์ค์ฝ๋ ํ๋ฆ(IDA)
1) EVP_aes_256_cbc API ํธ์ถ
2) EVP_EncryptInit_ex API ํธ์ถ
2-1) ์ํ ์์ ์คํจ ์, ์ค๋ฅ ๋ฉ์ธ์ง(Error initializing encryption!) ์ถ๋ ฅ
3) EVP_EncryptUpdate API ํธ์ถ
3-1) ์ํ ์์ ์คํจ ์, ์ค๋ฅ ๋ฉ์ธ์ง(Error during encryption!)๋ฅผ ์ถ๋ ฅํ๊ณ LABEL_7๋ก ์ด๋
4) EVP_EncryptFinal_ex API ํธ์ถ
4-1) ์ํ ์์ ์คํจ ์, ์ค๋ฅ ๋ฉ์ธ์ง(Error finalizing encryption!)๋ฅผ ์ถ๋ ฅํ๊ณ LABEL_7๋ก ์ด๋
5) EVP_CIPHER_CTX_free
6) ๋ณ์ v7๊ฐ 0๋ณด๋ค ํฌ๋ฉด LABEL_13์ผ๋ก ์ด๋
- v7์ EVP_EncryptUpdate์์ ๋ฐํ๋ ์ํธํ๋ ๋ฐ์ดํฐ์ ๊ธธ์ด(ํจ๋ฉ์ ํฌํจํ ๋ง์ง๋ง ๋ธ๋ก์ ๊ธธ์ด) v17๊ณผ ์ํธํ๋ ๋ฐ์ดํฐ์ ๊ธธ์ด v6๋ฅผ ๋ํ ๊ฐ์ผ๋ก, ์ต์ข ์ ์ผ๋ก ์ํธํ๋ ๋ฐ์ดํฐ์ ์ ์ฒด ๊ธธ์ด๋ฅผ ์๋ฏธํ๋ค.
* LABEL: ์ด๋ค ์กฐ๊ฑด๋ฌธ์ด๋ ๋ถ๊ธฐ์ ์ํด ํ๋ก๊ทธ๋จ ํ๋ฆ์ด ์ด๋ํ๋ ์ง์ ์ผ๋ก ์ฌ์ฉ๋๋ค. if, goto, switch ๋๋ ํจ์ ๋ฐํ ๋ฑ ๋ค์ํ ํํ์ ๋ถ๊ธฐ ๊ตฌ์กฐ๋ฅผ ํฌํจํ ์ ์๋ค.
์์ค์ฝ๋ ํ๋ฆ(C++)
- EVP_aes_256_cbc
AES-256 ์๊ณ ๋ฆฌ์ฆ์ CBC ๋ชจ๋๋ก ์ฌ์ฉํ๊ธฐ ์ํ ํจ์ - EVP_EncryptInit_ex
๋์นญํค ์ํธํ(ex. AES, DES ๋ฑ)์ ์ด๊ธฐํ๋ฅผ ์ฒ๋ฆฌํ๋ ํจ์
์ํธํ ์๊ณ ๋ฆฌ์ฆ์ ์ค์ ํ๊ณ ๊ทธ์ ๋ง๋ ํค์ ์ด๊ธฐ๋ฒกํฐ(IV)๋ฅผ ์ง์ ํ์ฌ ์ํธํ ์์ ์ ์ค๋น - EVP_EncryptUpdate
๋์นญํค ์ํธํ์์ ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ์ํธํํ๋ ํจ์
์ํธํ ์์ ์ ๋ฒํผ ๋จ์๋ก ์งํํ๊ณ ์ํธํ๋ ๋ฐ์ดํฐ๋ ์ถ๋ ฅ ๋ฒํผ์ ์ ์ฅํ๋ค. - EVP_EncryptFinal_ex
๋์นญํค ์ํธํ ์์ ์ ๋ง๋ฌด๋ฆฌํ ๋ ๋ง์ง๋ง ๋จ๊ณ์์ ์ฌ์ฉํ๋ ํจ์
ํ์ ์ ํจ๋ฉ(padding)์ ์ถ๊ฐํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ๋ค.
* ๋์นญํค ์ํธํ ๋ฐฉ์์ ๋ฐ์ดํฐ๊ฐ ๋ธ๋ก ๋จ์๋ก ์ํธํ๋๊ธฐ ๋๋ฌธ์ ๋ง์ง๋ง ๋ธ๋ก์ด ๋ธ๋ก ํฌ๊ธฐ์ ๋ง์ง ์์ผ๋ฉด ํจ๋ฉ์ ์ถ๊ฐํ๋ค. - EVP_CIPHER_CTX_free
์ํธํ ์์ ์ ๋ง์น ํ ์ฌ์ฉ๋ ์ํธํ ์ปจํ ์คํธ๋ฅผ ํด์ ํ๋ ํจ์
๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๊ณ ์ฌ์ฉ์ด ๋๋ ์ํธํ ๊ด๋ จ ๋ฆฌ์์ค๋ฅผ ์ ๋ฆฌํ๋๋ฐ ์ฌ์ฉ๋๋ค.
4. ์์ผ ํต์
4-1) socket ์์ฑ
- WSAStartup
์๋์ฐ ์์ผ API(Winsock)๋ฅผ ์ด๊ธฐํํ๋ ํจ์
๋คํธ์ํฌ ์์ ์ ์ํํ๊ธฐ ์ ์ ์์ผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด๊ธฐํ - socket
์์ผ์ ์์ฑํ๊ธฐ ์ํ ํจ์
- socket(2, 1, 6)
- 2: AF_INET ⇒ IPv4
- 1: SOCK_STREAM ⇒ TCP
- 6: IPPROTO_TCP ⇒ TCP
- socket(2, 1, 6)
์์ผ(socket)
๋คํธ์ํฌ๋ฅผ ํตํด ์ฐ๊ฒฐ๋๊ณ ํต์ ํ ์ ์๊ฒ ํด์ฃผ๋ ์ธํฐํ์ด์ค
IP ์ฃผ์ ๋ฐ ํฌํธ๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ํ๋ก๊ทธ๋จ๊ณผ ํน์ ๋คํธ์ํฌ ์ฐ๊ฒฐ์ ์๋ณ
์์ผ ๋ด๋ถ ๊ตฌ์กฐ
SOCKET WSAAPI socket(
[in] int af,
[in] int type,
[in] int protocol
);
- af
์ฃผ์ ํจ๋ฐ๋ฆฌ ์ ํ(์ฌ์)
์ฌ์ฉํ ์ ์๋ ๊ฐ์ Winsock2.h ํค๋ํ์ผ์ ์ ์๋์ด ์์
af | AF_UNSPEC (0) | AF_INET (2) | AF_IPX (6) | AF_APPLETALK (16) | AF_NETBIOS (17) | AF_INET6 (23) | AF_IRDA (26) |
AF_BTH (32) |
์๋ฏธ | ์ง์ ์ ํจ | IPv4 | IPX/SPX | AppleTalk | NetBIOS | IPv6 | IrDA (์ ์ธ์ ๋ฐ์ดํฐ ์ฐ๊ฒฐ) | Bluetooth |
- type
์์ผ์ ํ์
์ฌ์ฉํ ์ ์๋ ๊ฐ์ Winsock2.h ํค๋ํ์ผ์ ์ ์๋์ด ์์
type | SOCK_STREAM (1) | SOCK_DGRAM (2) | SOCK_RAW (3) |
SOCK_RDM (4) | SOCK_SEQPACKET (5) |
์๋ฏธ | TCP | UDP | IPv4/IPv6 ํค๋ ์ต์ | PGM | ๋ฐ์ดํฐ๊ทธ๋จ ๊ธฐ๋ฐ ๊ฐ์ ์คํธ๋ฆผ(pseudo-stream) ํจํท |
- protocol
์ฌ์ฉํ ํ๋กํ ์ฝ
์ฌ์ฉํ ์ ์๋ ๊ฐ์ Winsock2.h ๋ฐ Wsrm.h ํค๋ํ์ผ์ ์ ์๋์ด ์์
protocol | IPPROTO_ICMP (1) |
IPPROTO_IGMP (2) |
BTHPROTO_RFCOMM (3) | IPPROTO_TCP (6) |
IPPROTO_UDP (17) |
IPPROTO_ICMPV6 (58) | IPPROTO_RM (113) |
์๋ฏธ | ICMP | IGMP | Bluetooth RFCOMM |
TCP | UDP | ICMPv6 | PGM |
4-2) IP ์ฃผ์ ๋ฐ ํฌํธ ๋ฒํธ ์ค์
- name ⇒ sockaddr
IPv4 ์ฃผ์๋ฅผ ํํํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๊ตฌ์กฐ์ฒด
์์ผ ํ๋ก๊ทธ๋๋ฐ์์ ๋คํธ์ํฌ ์ฐ๊ฒฐ์ ์ค์ ํ ๋ ์ฌ์ฉ
sockaddr ๋ฐ sockaddr_in ๊ตฌ์กฐ์ฒด (IPv4)
struct sockaddr {
ushort sa_family;
char sa_data[14];
};
struct sockaddr_in {
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
- htons
Host To Network Short
ํฌํธ ๋ฒํธ๋ฅผ ๋คํธ์ํฌ ๋ฐ์ดํธ ์์๋ก ๋ณํํ๋ ํจ์
ํธ์คํธ ์์คํ ์์ ์ฌ์ฉ๋๋ ๋ฐ์ดํธ ์์(์ฃผ๋ก little endian)๋ฅผ ๋คํธ์ํฌ์์ ์ฌ์ฉ๋๋ ๋ฐ์ดํธ ์์(big endian)์ผ๋ก ๋ณํ
- htons(0x1F90u)
0x1F90 = 8080
ํฌํธ ๋ฒํธ: 8080
- htons(0x1F90u)
- inet_pton
IP ์ฃผ์ ๋ฌธ์์ด์ ๋ฐ์ด๋๋ฆฌ ํํ๋ก ๋ณํํ๋ ํจ์
IPv4 ๋๋ IPv6 ์ฃผ์๋ฅผ 32๋นํธ ๋๋ 128๋นํธ ์ด์ง ๊ฐ์ผ๋ก ๋ณํ
inet_pton ํจ์ ํ๋ผ๋ฏธํฐ
int inet_pton(int af, const char *src, void *dst);
- af: ์ฃผ์ ํจ๋ฐ๋ฆฌ
⇒ RCX = 2 - src: IP ์ฃผ์ ๋ฌธ์์ด
⇒ RDX = 127.0.0.1 - dst: ๋ณํ๋ ์ด์ง ํํ์ ์ฃผ์๋ฅผ ์ ์ฅํ ๋ฒํผ
⇒ R8 = 000000078E1FF3EC
inet_pton ํจ์๊ฐ ํธ์ถ๋๋ฉด dst์ IP ์ฃผ์(src)๋ฅผ ์ด์ง ํํ๋ก ๋ณํํ์ฌ ์ ์ฅํ๋๋ฐ, ๋๋ฒ๊ฑฐ์์๋ ์ด๋ฅผ 16์ง์๋ก ์ ์ฅํฉ๋๋ค. ๋คํธ์ํฌ(์์ผ) ํ๋ก๊ทธ๋๋ฐ์ IP ์ฃผ์๋ฅผ ์ด์ง ํ์์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ด ํจ์จ์ ์ด๋ฏ๋ก ํด๋น ํจ์๋ฅผ ์ด์ฉํ์ฌ ๋ณํ ๊ณผ์ ์ ๊ฑฐ์นฉ๋๋ค.
127.0.0.1 (DEC) = 01111111.00000000.00000000.00000001 (BIN) = 7F000001 (HEX)
4-3) connect ๋ฐ send
connect ํจ์๋ฅผ ๋จผ์ ํธ์ถํ์ฌ ์ฐ๊ฒฐ์ ์คํจํ๋ฉด ์ค๋ฅ ๋ฉ์ธ์ง(Connection failed!)๋ฅผ ์ถ๋ ฅํ๊ณ , ์ฑ๊ณตํ๋ฉด send ํจ์๋ฅผ ํตํด ์ํธํ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ก. ์ ์ก์ ์คํจํ๋ฉด ์ค๋ฅ ๋ฉ์์ง(Encrypted data sent!)๋ฅผ ์ถ๋ ฅ
- connect
ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์ฐ๊ฒฐํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ํจ์
TCP ํ๋กํ ์ฝ ์ฐ๊ฒฐ์ ์ฌ์ฉ - send
๋ฐ์ดํฐ๋ฅผ ๋คํธ์ํฌ๋ฅผ ํตํด ์ ์กํ๋๋ฐ ์ฌ์ฉํ๋ ํจ์
TCP ํ๋กํ ์ฝ ์ก์์ ์ ์ฌ์ฉ
connect ํ๋ผ๋ฏธํฐ
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
- sockfdd
์ฐ๊ฒฐํ๋ ค๋ ์์ผ์ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ก socket ํจ์๋ก ์์ฑ๋ ์์ผ - addr
์๋ฒ์ ์ฃผ์ ์ ๋ณด๋ฅผ ํฌํจํ๋ sockaddr(sockaddr _in) ๊ตฌ์กฐ์ฒด - addrlen
addr(๊ตฌ์กฐ์ฒด)์ ํฌ๊ธฐ
addr(sockaddr_in) ๊ตฌ์กฐ์ฒด๋ ํจ๋ฐ๋ฆฌ ์ ํ(2๋ฐ์ดํธ) + ํฌํธ๋ฒํธ(2๋ฐ์ดํธ) + IP์ฃผ์(4๋ฐ์ดํธ) ์ด 8๋ฐ์ดํธ์ง๋ง, ์ต์ข ์ ์ผ๋ก connect ํ๋ผ๋ฏธํฐ์ 3๋ฒ์งธ ํ๋ผ๋ฏธํฐ addrlen๋ 16(๋ฐ์ดํธ)์ ๋๋ค. ์ด๋ 8๋ฐ์ดํธ์ ํจ๋ฉ(padding) ๋๋ฌธ์ ๋๋ค.
- C/C++ ๊ตฌ์กฐ์ฒด์ ํจ๋ฉ(padding)
- ๋ฉ๋ชจ๋ฆฌ ์ ๋ ฌ์ ์ํด ์ฌ๋ถ์ ๋ฐ์ดํธ๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค. ๊ตฌ์กฐ์ฒด์ ํ๋๋ค์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ ํ ๊ฒฝ๊ณ์ ๋ง๊ฒ ๋ฐฐ์นํ์ฌ ์ฑ๋ฅ์ ์ต์ ํํ๊ธฐ ์ํด์์ ๋๋ค.
- ์ปดํจํฐ ์ํคํ ์ฒ์์ ํจ์จ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ ์ํด ์ ๋ ฌ(alignment)์ด ์ค์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด 4๋ฐ์ดํธ ํฌ๊ธฐ์ ๋ฐ์ดํฐ๋ 4๋ฐ์ดํธ ๊ฒฝ๊ณ์์ ์์ํ๋ ๊ฒ์ด ์ฑ๋ฅ์ ๋ ์ ๋ฆฌํฉ๋๋ค. C/C++ ์ปดํ์ผ๋ฌ๋ ์ด๋ฌํ ์ ๋ ฌ์ ๋ง์ถ๊ธฐ ์ํด ์๋์ผ๋ก ํจ๋ฉ์ ์ฝ์ ํ ์ ์์ต๋๋ค.
4-4) socket ์ข ๋ฃ
- closesocket
์์ผ์ ๋ซ๋ ํจ์
์์ผ ์ฌ์ฉ ํ ๋ฆฌ์์ค๋ฅผ ํด์ ํ๊ณ ์์ผ์ ๋ซ์ ๋ ์ฌ์ฉ - WSACleanup
์๋์ฐ ์์ผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(Winsock)๋ฅผ ์ข ๋ฃํ๋ ํจ์
์์ผ ๊ด๋ จ ๋ฆฌ์์ค๋ฅผ ํด์ ํ๊ณ Winsock ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ข ๋ฃ - 0i64
64๋นํธ ์ ์ ํ์ ์ ๋ํ๋ด๊ธฐ ์ํด ์ฌ์ฉ
0: ์ซ์ 0, i: signed, 64: 64๋นํธ
⇒ 64๋นํธ ๋ถํธ ์๋ ์ ์ํ ๊ฐ 0์ ์๋ฏธ
- i64๋ฅผ ๋ถ์ด๋ ์ด์ ??
0์ ๊ทธ๋ฅ 0์ด๋ผ๊ณ ์ฐ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก 32๋นํธ ์ ์๋ก ์ทจ๊ธ๋ฉ๋๋ค. 64๋นํธ ์ ์ ๊ฐ์ ๋ช ์ํ๊ธฐ ์ํด i64๋ฅผ ๋ถ์ฌ ํ์ ์ ๋ช ์ํฉ๋๋ค. ๋ณดํต Rust ๊ฐ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ๋ณ์ ํ์ ์ ๋ช ์์ ์ผ๋ก ์ง์ ํด์ฃผ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. C++์ ํ์ค ๊ตฌ๋ฌธ์ ์๋์ง๋ง MSVC(Visual C++ ์ปดํ์ผ๋ฌ)๋ i64 ๊ฐ์ ์ ๋ฏธ์ฌ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ ์ ๋ช ์ํ๊ธฐ๋ ํฉ๋๋ค.
- i64๋ฅผ ๋ถ์ด๋ ์ด์ ??
'Study > study' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํจ์ ์ค๋ฒ๋ก๋(overload) (1) | 2024.11.14 |
---|---|
์ ์ ํ์ ์ ๋ถํธ ๊ตฌ๋ถ (4) | 2024.11.13 |
๋งํฌ ๋ฐฉ์์ ๋ฐ๋ฅธ ๋์ค์ด์ ๋ธ๋ฆฌ ์ฝ๋ ํน์ง (1) | 2024.11.07 |
์๋ ์คํ ๋ฑ๋ก ํ๋ก๊ทธ๋จ(C++) ๋ฆฌ๋ฒ์ฑ (0) | 2024.11.05 |
SEH, TEB(TIB), PEB์ FS ๋ ์ง์คํฐ๋ฅผ ํตํด ์ ๊ทผํ๋ ๋ฐฉ๋ฒ (0) | 2024.05.14 |