리눅스에서는 프로세스보다 작은 개념인 쓰레드를 이용해 다중 작업을 구현할 수 있습니다.
fork()는 프로세스를 복사하여 새로운 메모리에 할당하는 것이므로 각 프로세스간의 메모리를 공유할 수 없습니다.
반면 pthread()는 같은 프로세스 안에 프로세스보다 작은 thread를 생성하여 각각의 작업을 수행하기때문에 같은 메모리를 공유합니다.
#include <pthread.h>
int pthread_create(pthread_t *thread,pthread_attr_t *attr, void*(*start_routine)(void *),void* arg);
thread에서 수행할 작업을 pthread_create()에 등록함으로써 동작합니다.
예제
void a() {
// thread에서 수행할 작업
}
void main() {
pthread_t pid;
pthread_create(pid, NULL, a, (void *)NULL);
}
여러개의 thread가 같은 변수에 접근하다보면 교착상태가 발생할 수도 있습니다.
이러한 문제를 해결하기 위해 변수에 접근할 때 누군가 사용하고 있으면 기다렸다가 사용할 수 있도록 설정해줘야합니다.
이때 사용하는 것이 mutex입니다.
mutex 변수에 thread가 접근하면 lock을 걸어 다른 thread가 사용하지 못하게 합니다. 다른 thread는 mutex변수가 unlook이 되기전까지 기다렸다가 unlook이 되면 수행됩니다.
/* mutex 선언 */
pthread_mutex_t sync_mutex;
/* 사용 시 */
pthread_mutex_lock(&sync_mutex);
/* 사용 후 */
pthread_mutex_unlock(&sync_mutex);
초기화 하는 방법은 2가지가 있습니다.
pthread_mutex_t sync_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_init(&sync_mutex, NULL);
cond signal로 이러한 mutex를 보다 효율적으로 사용할 수 있습니다.
ptreahd_cond_wait()는 cond_t 변수의 신호를 전달받을때까지 기다립니다.
pthread_cond_signal()는 cont_t 변수에 신호를 전달합니다.
/* cond_t 변수 선언 및 초기화 */
pthread_cond_t thread_cond = PTHREAD_COND_INITIALIZER:
/* sync_cond 에 신호 발생 */
pthread_cond_signal(&sync_cond);
/* sync_cond에 신호가 발생될 때(pthread_cond_signal())까지 대기하였다가 발생하면 호출 됨 */
pthread_cond_wait(&sync_cond, &sync_mutex);
pthread_cond_wait()는 호출 될 때 2번째 인자로 받은 mutex를 자체적으로 관리해줍니다.
신호를 받기 위해 대기할 경우 pthread_mutex_lock()를 내부적으로 호출하고,
신호를 받아 처리한 경우 pthread_mutex_unlock()을 내부적으로 호출합니다.
GDB등 리눅스 디벙깅 툴에서도 ptrace를 기본적으로 사용하여 프로세스를 추적합니다.
이를 코드로 나타내면,
#include <stdio.h>
#include <sys/ptrace.h>
void main(int argc, char* argv[]) {
int pid = atoi(argv[1]);
if(ptrace(PTRACE_ATTACH, pid, 0, 0) == -1) {
printf("[%d] ATTACH fail...\n");
}
/* 작업 수행 */
sleep(10);
if( ptrace(PTRACE_DETACH, pid, 0, 0) == -1) {
printf("[%d] DETACH fail...\n");
}
}
리눅스에서는 기본적으로 ptrace를 사용안함으로 설정되어 있다고 합니다.
ptrace를 사용함으로 바꾸기 위해서 다음과 같이 환경변수를 바꿔줍니다.
$sudo bash
#echo 0 > /proc/sys/kernel/yama/ptrace_scope
또는 부팅시 자동으로 적용되기 위해 ptrace.conf를 수정합니다.
$vi /etc/sysctl.d/10-ptrace.conf
kernel.yama.ptrace_scope = 0 #이 값이 초기에 1로 설정되어 있음, 0으로 변경
Thunderbird, Evolution 등 전자우편 클라이언트를 통해 기존의 사용하던 전자우편 서비스를 이용할 수 있습니다.
전자우편 클라이언트에 IMAP/SMTP 등을 설정하는데 몇 가지 주의해야 할 부분들이 있어 정리합니다.
사용하고 있는 메일 서비스 업체에서 IMAP와 SMTP 서비스를 제공하는지 확인하고 해당 계정에서 사용 할 수 있도록 설정.
전자우편 클라이언트 설정
참고 : https://support.google.com/mail/troubleshooter/1668960?hl=ko&rd=2#ts=1665018%2C1665141%2C2769074
전자우편의 비밀번호를 입력하면 비밀번호가 맞지 않다며 접속이 되지 않는 경우가 있습니다.
구글 계정에서 다른 장치에서 접근하는 것을 관리하기 위해 앱 비밀번호라는 것을 사용합니다.
예전에는 전자우편 클라이언트에서 사용하던 전자우편 계정의 비밀번호를 사용할 수 있었는데, 최근에는 2차 인증 비밀번호를 입력해야 합니다.
참고 : https://support.google.com/accounts/answer/185833
2차 인증 설정하는 메뉴가 보이지 않는 경우가 있습니다.
그럴 경우 url로 접속을 하라고 합니다.
url : https://www.google.com/intl/ko/landing/2step/
구글 계정으로 로그인 후 2차 인증을 설정합니다.
하단에 기기와 앱을 설정 한 후 생성 버튼을 클릭하면 16자리의 코드가 생성되는데 이 코드가 비밀번호가 생성 됩니다.
위 코드를 비밀번호 창에 입력하면 됩니다.
해당 오류는 구글 크롬 사용 시 DNS에서 주소를 찾을 수 없는 경우에 발생하는 오류입니다.
다른 웹브라우저를 사용해도 오류 메세지가 조금 다를 뿐 해당 웹페이지를 찾을 수 없는 오류가 발생합니다.
VirtualBox에서 우분투를 돌리고 있는데 DNS 설정을 변경하니 해당 오류가 발생하였습니다.
wireshark로 패킷 캡쳐해보니
EDP(Extreme Discovery Protocol)
EDP is a vendor proprietary protocol from Extreme Networks.
즉, 가상머신에서 EDP를 통해 게스트OS의 네트워크 정보를 갱신하여 기본에 설정된 DNS가 먹통이 된것으로 판단됩니다.
해결과정 :
레이머(Lamer)
해커가 되고 싶지만 경험도 없고 컴퓨터 관련 지식도 많지 않은 해커이다. 이들은 네트워크와 운영체제 대한 지식도 없다. 컴퓨터를 단순히 게임과 채팅, 인터넷 웹서핑 정도로만 사용하다. 대중매체를 통해 해커에 대해 듣고 관련 사이트에서 간단한 해킹 툴을 내려받아 이용하는 초보적은 수준의 해커이다. 컴퓨터에 대한 지식이 없는 채 단순히 해커를 동경하는 사람이 여기에 속한다.
스크립트 키디(Script Kiddie)
네트워크와 운영체제에 대한 약간의 기술적인 지식을 갖고 있는 해커들이다. 이 분류에 속한 해커들은 GUI 환경의 운영체제에만 익숙하며, 공격 기법도 기존에 잘 알려진 툴을 이용하여 인터넷 사용자를 괴롭히는 것이 전부다.
디벨롭트 키디(Developed Kiddile)
이 분류에 속한 해커들은 대부분의 해킹 기법을 알고 있다. 해킹 수행 코드가 적용될 수 있는 취약점을 발견할 때까지 여러 번 시도해 시스템 침투에 성공할 수 있는 해커들이다. 보안상의 새로운 취약점을 발견하거나 최근에 발견된 취약점을 주어진 상황에 맞게 바꿀 만한 실력은 없다.
세미 엘리트(Semi Elite)
이 분류에 속한 해커들은 컴퓨터에 대한 포괄적인 지식이 있고 운영체제와 네트워크에 대한 지식도 갖추고 있으며, 운영체제에 존재하는 특정 취약점을 알고 이 취약점을 공격할 수 있는 해킹 코드를 만들 수 있다. 하지만 해킹 흔적을 완벽하게 지우지 못해 추적당할 수 있다.
엘리트(Elite)
컴퓨터, 네트웤, 운영체제, 프로그래밍 등 컴퓨터에 대한 포괄적인 지식을 갖추고 있으며, 해킹하고자 하는 시스템의 새로운 취약점을 찾아내어 해킹할 수 있는 최고 수준의 해커다. 또한 해킹을 한 후 흔적을 완벽하게 지울 수 있어 추적하기 힘들다.
1984년 OSI(Open System Interconnection)의 네트워크 모델.
이 계층에 따라 최상의 계층에서 최하위 계층으로 데이터를 보낸 후 다시 이의 역순으로 상대 시스템으로 데이터를 전달한다.
(각 계층은 수행하는 역활에 따라 개념적으로 분류한 것임.)
Physical layer (물리 계층)
물리 계층은 두 시스템간의 무리적 연결을 위한 전기적 메커니즘, 절차, 기능 등을 정의한다.
즉, 전압 레벨, 전압 변환 시기, 물리적 데이터 최대 전송량, 최대 전송 거리, 물리적 커넥터 등과 같은 특성을 정의한다.
일반적으로 랜 카드와 같은 하드웨어 적인 데이터 전송 단계를 물리 계층이라 한다.
Data Link layer (데이터 링크 계층)
이 계층에서는 로컬 네트워크에서 프레임을 안전하게 전송하는 것을 목적으로 한다.
물리 계층에서 단순히 하드웨어 간에 데이터를 전송하는 것을 담당하였다면 데이터 링크 계층에서는 물리 계층에서 전송하는 데이터의 신뢰성을 제공한다.
즉, 물리적 주소지정, 네트워크 토폴로지, 오류 통지, 프레이므이 순차적 전송, 흐름 제어 등의 기능을 한다.
Network layer (네트워크 계층)
네트워크를 통한 데이터 패킷의 전송을 담당한다. 경로 제어(routing)와 통신량 제어 등을 수행한다.
각 시스템의 네트워크 주소를 할당하여 관리하는 계층.
Transport layer (전송 계층)
데이터 전달의 유효성을 제어한다. 즉, 데이터 패킷이 올바르게 전송되었는지를 확인하고 전송 실패한 패킷을 재전송하도록하는 흐름을 제어한다.
Session layer (세션 계층)
Point-to-Point 연결에 신뢰성 있고 투명한 데이터 전송을 제공한다.
즉, 응용 프로세스가 통신을 관리하기 위한 방법을 제공한다.(동시 송수신 방식, 반이중 방식, 전이중 방식 등)
Presentation layer (표현 계층)
코드 간의 번역을 담당하여 서로 다른 사용자 시스템이 데이터 전송이 가능하게 한다.
Application layer(응용 계층)
응용 계층을 프로세스와 직접 관계하여 해당 프로세스와 연결을 제공한다.
파일 전송 시