본문 바로가기

쓰레드

제2회 IGRUS 해킹 대회 출제자 보고서(9번) 9번 문제 : 송영균 이병의 제대일을 구하세요. 문제풀이------------------------------------------------------------------------------------------------ 9번 문제 : 1. 출제의도 : 이문제를 낸 이유는 리버싱을 할때 분석만이 다가 아니라 적절한 프로그램을 코딩해서 풀수도 있다는(Brute Foces 이용)것을 보여주기 위해 출제했습니다. 이문제는 심플스(Simples) 18번 문제를 표절해서 만들었습니다...... ㅎ 2. 문제풀이 : 프로그램을 실행시키면 와 같이 콘솔창 하나와 메시지 박스 하나가 떠있습니다. 메시지 박스의 확인 버튼을 누르게 되면 날짜가 하나씩 증가합니다. 이문제는 1. 리버싱 수행단계를 거칠필요 없이 바로.. 더보기
올리디버거(OllyDBG)의 Executable Modules 을 통한 문제풀이 올리디버거 창들 중에 Executable Modules 창이 있다. 현재 불러온 프로세스에서 실행중인 모듈들을 보여준다. 한 프로그램에서 여러개의 모듈(ex. DLL 등)을 사용할 경우 올리디버거는 하나의 모듈만을 트레싱할 수 있기 때문에 제대로 분석할수가 없다. 따라서 Executable Modules 창을 이용해 실행 가능한 모듈을 골라서 중요한 코드에 BreakPoint 를 걸어놓음으로써 해당 코드가 실행될 때에 제어권을 올리디버거로 받아 문제를 해결할 수 있다. 일단 해당문제를 실행시켜보자. Ezbeat 문제 패스워드 찾기 올바른 패스워를 찾으시오! 난이도 : ★☆☆☆☆ 위의 메시지 박스가 뜨며 확인을 누르면 콘솔창 하나가 뜨며 Input Password : 를 입력하라고 뜬다. 올리디버거로 프로.. 더보기
쓰레드(Thread) 동기화 예제 소스 메모리 접근 동기화 : 1. 크리티컬 섹션(Critical Section) 기반의 동기화 - 유저 모드 2. 인터락 함수(Interlocked Family Of Function) 기반의 동기화 - 유저 모드 3. 뮤텍스(Mutex) 기반의 동기화 - 커널 모드 4. 세마포어(Semaphore) 기반의 동기화 - 커널 모드 5. 이름있는 뮤텍스(Named Mutex) 기반의 프로세스 동기화 - 커널 모드 실행 순서의 동기화 : 1. 이벤트 기반의 동기화 2. 이벤트 + 뮤텍스 동기화 더보기
쓰레드(Thread) 동기화 개념 쓰레드 동기화 : 쓰레드 간의 질서가 잘 지켜지고 있음을 의미 쓰레드 동기화의 방법 : 유저 모드 동기화 : 동기화가 진행되는 과정에서 커널 코드가 실행되지 않는다. 커널 모드로의 전환이 이뤄지지 않으므로 성능상에 이점이 있지만 기능상의 제한도 있다. 커널 모드 동기화 : 커널에서 제공하는 동기화 기능을 활용한다.(유저 모드에서 제공하지 못하는 기능을 제공받을 수 있다) 커널 모드로의 전환으로 인해 성능이 저하된다. 두가지 관점에서의 쓰레드 동기화 : 메모리 접근에 대한 동기화 : 쓰레드들의 임계 영역 동시접근을 막아 동기화한다. (참고 : 임계 영역(Critical Section) : 배타적 접근(한 순간에 하나의 쓰레드만 접근)이 요구되는 공유 리소스(전역변수와 같은)에 접근하는 코드 블록) (예 :.. 더보기
쓰레드(Thread) 실행순서 동기화 이벤트(Event) 기반 동기화 : 개념 : 생산자는 문자열을 생성한다(입력받는다), 소비자는 문자열을 소비한다(출력한다) 생산자가 문자열을 생성하고 나면, 이 상태를 감지한 소비자가 문자열을 가져가 소비한다. 이벤트 커널 오브젝트의 특성 : 1. 이벤트 커널 오브젝트는 파라미터에 의해 Signaled or Non-Signaled 상태로 생성된다. 2. 프로그래머의 요청에 의해 Signaled 상태가 된다. 3. 자동 리셋 모드 일시 WaitForSingleObject 함수 호출로 Signaled -> Non-Signaled 상태로 변경된다. 수동 리셋 모드 일시 추가로 ResetEvent 함수를 사용한다. 사용법 : HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEven.. 더보기
쓰레드(Thread) 메모리 접근 동기화 1. 크리티컬 섹션 기반의 동기화(유저 모드) : 개념 : 열쇠(Critical Section)를 생성한다. 쓰레드가 임계 영역에 접근하기 위해서는 열쇠를 얻어야 한다. 열쇠를 얻어 임계 영역에 접근한 쓰레드는 일을 마친후 다음 쓰레드를 위해 열쇠를 반환한다. 사용법 : CRITICAL_SECTION gCriticalSection; // 열쇠를 생성한다 // 크리티컬 섹션 오브젝트 선언후에는 반드시 초기화 해야한다. void InitializeCriticalSection( // 크리티컬 섹션 오브젝트 초기화 함수 LPCRITICAL_SECTION lpCriticalSection // 초기화 하려는 크리티컬 섹션 오브젝트의 주소값 ); void EnterCriticalSection( LPCRITICAL_S.. 더보기
쓰레드(Thread)의 생성과 소멸 쓰레드 생성 : HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, // 보안속성(TRUE : 상속, NULL : 상속제외) SIZE_T dwStackSize, // 쓰레드의 스택 크기 LPTHREAD_START_ROUTINE lpStartAddress, // 쓰레드로 동작하기 위한 함수(쓰레드 main) // 리턴타입 DWORD, 매개변수 타입 LPVOID(void*) LPVOID lpParameter, // 쓰레드 함수에 전달할 인자 지정 DWORD dwCreationFlags, // 쓰레드 생성 및 실행을 조절 LPDWORD lpThreadId // 쓰레드 ID를 전달받기 위한 변수의 주소값 ); 쓰레드 소멸 : 1. return(일반적,.. 더보기
쓰레드(Thread) 쓰레드(Thread) : 하나의 프로그램 내에서 여러 개의 실행 흐름을 두기 위한 모델 1. 독립적인 스택(Stack)을 가진다. 2. 코드 영역을 공유한다. (위와 같이 쓰레드 main 함수는 코드 영역에 존재하는 모든 함수를 호출할 수 있다) 3. 데이터 영역과 힙을 공유한다.(전역변수와 동적 할당된 메모리 공간 공유 가능) 4. 프로세스 핸들 테이블 공유 프로세스 핸들 테이블에 대한 핸들 정보는 프로세스 내의 쓰레드 들에게 공유되어 각 쓰레드가 그 핸들에 대해 접근이 가능하다 (참고 : 같은 프로세스내의 쓰레드들은 스택 이외의 모든 것을 공유한다) 프로세스와 쓰레드 Windows 에서 프로세스는 단순히 쓰레드를 담는 상자다. 실제 프로그램 흐름을 형성하는 것은 쓰레드이다. 따라서 스케줄러(Windo.. 더보기