목록분류 전체보기 (18)
Study
Reader-Writer Lock 하나의 데이터에 접근하려는 5개의 Thread가 있다. 위 경우에서 Thread 1, 4가 쓰기 작업을 수행하기 위해 Data에 동시 접근하는 경우 문제가 발생할 수 있다. 혹은 Thread 2가 Data를 읽으려는 순간 Thread 1이 Data의 내용을 변경해버릴 경우 문제가 발생할 수 있다. 그렇기 때문에 공유 자원에 접근하기 위해서는 동기화 처리를 해주어야 한다. 한번에 하나씩만 자원에 접근하도록. 그러나 값을 그저 읽기만 하는 경우에는 동기화 작업이 꼭 필요하지 않다. 오히려 한 Thread만이 접근할 수 있기에 대기시간으로 인해 비효율을 초래할 수 있다. 따라서 rwLock은 Read Lock이 걸린 상태에서 다른 Read Lock이 걸려오면 Read 작업을 ..
7. CodeEngn Basic 07 7.1 문제 풀이 해당 파일에서 사용되는 함수 목록이다. 드라이브 정보를 추출하는 함수로 보이는 부분을 찾았다. BP를 걸고 진행하여 해당 함수로 가보자. 해당 함수를 호출하기 위한 인자들이 스택상에 쌓인 모습이다. 여기서 잠깐 멈추고 MSDN에서 GetVolumeInformationA 함수에 대한 정보를 찾아보자. 첫 번째 인자 lpRootPathName에 대한 설명이다. NULL을 지정하면 현재 경로의 루트 디렉터리가 지정된다. 내 경우, 파일이 존재하는 곳은 바탕화면이므로 루트 디렉터리는 C:\가 된다. 문제를 풀기 위해서는 드라이브 이름을 CodeEngn으로 바꾼 후 시도해야 하는데.. 어.. 그냥 바꾸기 싫었다. 그렇다고 "로컬 디스크"라는 이름으로 관찰하고..
6. CodeEngn Basic 06 Back to user모드를 이용하여 해결할 수 있는 문제이다. 6.1 문제 풀이 디버깅을 시작하면 PUSHAD가 먼저 보인다. POPAD와 짝을 이루어 압축 해제하는 코드의 경계를 나타낸다. [Search for] -> [All Commands]를 이용하여 POPAD를 찾는다. PUSHAD 아래의 POPAD를 더블클릭한다. OEP로 진입하는 JMP문이 있다. 정답의 일부이므로 가렸다. Back to user모드에 진입하기 위해 프로그램을 실행시키고 메시지 박스를 띄운다. ※참고 함수가 진행 중일 때 Back to user모드를 이용하여 함수가 끝나는 시점으로 이동할 수 있다. 메시지 박스가 띄워진 시점의 상태이다. Stack Window 아래에서 Running임을 ..
5. CodeEngn Basic 05 실행압축된 파일에서 키값을 알아내는 문제이다. 5.1 문제 풀이 코드 영역이 압축되었기 때문에 디버깅을 시작하면 이러한 메시지가 뜬다. [예]를 눌러 디버깅을 시작한다. 처음 만나는 명령어는 PUSHAD이다. POPAD와 짝을 이루어 코드영역에 압축을 해제하여 원본 코드를 기록하고 무결성을 검사하는 등의 기능을 하는 코드이므로 OEP부터 디버깅 하고 싶다면 POPAD를 찾아가면 된다. OEP를 찾아가도 찾고자 하는 문자열은 바로 나타나지 않는다. 그 후에 또 어떤 반복과정이 많은데 나는 디버깅하다가 포기했다.. 그냥 첫 화면부터 F9를 눌러 프로그램을 실행시킨다. 실행시킨 후 문자열을 검색해보면 알 수 없는 문자들만 보인다. 이는 압축이 해제되고 문자열을 제대로 분석..
4. CodeEngn Basic 04 함수 이름을 찾는 문제이다. 4.1 문제 풀이 프로그램을 올려 F8을 이용해 한 줄씩 진행시키다 보면 어느 시점에서 디버깅을 탐지하는지 알 수 있다. 위 그림 속 함수를 실행시키자 디버깅이 시작되었다. 시작. 내부적으로 반복문이 계속 돌고 있다. 해당 함수 안으로 들어왔다. 조금 아래에 의심스러운 이름을 가진 함수가 보인다. 정답이기에 이름을 가렸다. 실행시키면 콘솔엔 아무 일도 일어나지 않는다. 단순히 탐지만 하는 함수인가 보다. 아래의 함수를 실행시키고 나서야 콘솔에 1회 출력된다. 프로그램 구성이 복잡하게 되어있지 않아 바로 찾았지만, 그냥 더 쉽게 찾으려면 CodeEngn 3번 문제처럼 Found intermodular calls를 이용하여 바로 찾아도 된다.
3. CodeEngn Basic 03 3.1 문제 풀이 뭐라는지 모르겠지만 확인 누르면 입력창이 나오는 걸로 봐선 키 입력해서 통과하는 프로그램인가 보다. 아무거나 입력했더니 에러가 뜬다. 직접 F7과 F8로 디버깅을 해서 찾으면 필요 이상으로 몹시 고생하니까 제공되는 기능으로 빠르게 함수를 찾 아간다. [Search for] -> [All intermodular calls] 문자열 비교 함수로 추측되는 함수가 보인다. 함수의 이름이 답이라 파란색으로 가렸다. (이후의 과정은 답과 상관없음) 더블클릭해서 위치를 찾아간다. 두 개의 인자를 이용한 함수임을 알 수 있다. 두 번째 인자는 하드코딩된 문자열의 주소를 참조한다. 그럼 첫 번째 인자는 아마 사용자가 입력한 값일 텐데 확인해보자. 해당 위치까지 디버..
2. CodeEngn Basic 02 섹션에 대한 이해가 필요한 문제이다.(아마도) 2.1 풀이 과정 파일을 실행시키면 정상적으로 열 수 없다는 메시지가 뜬다. 그렇기 때문에 OllyDbg로는 볼 수 없고 Hex Editor를 이용해야 한다. DOS Header의 시그니처인 MZ는 존재하지만 NT Header의 시그니처인 PE는 찾아볼 수 없다. 그래서 정상적으로 열 수 없는 것이다. 조금 아래에 바로 섹션 헤더가 보인다. 정답은 파일의 키값을 찾는 것인데, 보통 프로그램에 사용되는 문자열은 .data 섹션 또는 .rdata섹션에 있다. ※참고 .data Section - 전역변수, 정적변수가 위치하는 섹션 .rdata Section - Const로 선언된 자료 키값은 수정할 수 없도록 Const로 선언..
1. CodeEngn Basic 01 레지스터의 값을 수정하는 문제이다. 1.1 풀이 과정 파일을 열어보면 프로그램의 흐름을 알 수 있다. 00401024에서 EAX와 ESI의 값을 비교 후 같으면 0040103D로 분기하는 조건문이다. 우선 GetDriveTypeA 함수의 반환값이 무엇인지 실행시켜보자. 함수 실행 후 EAX의 값은 00000003이다. 그다음 조건문 실행 직전의 값은 무엇인지 실행시켜보자. EAX는 00000001로 원래 값에서 2가 감소되었음을 알 수 있다. ESI는 최종적으로 00000003의 값을 가지게 된다. 함수 호출 후 분기문까지 DEC EAX가 두 번 등장하였으니 디버깅을 다시 시작해 GetDriveTypeA의 반환값을 초기값에서 2를 더해준 00000005로 수정해준다...
21. Windows 메시지 후킹 21.1 훅 - 훅(Hook) : 원하는 정보를 엿보거나 가로채는 도구 - 후킹(Hooking) : 실제로 정보를 엿보고 조작하는 행위 21.2 메시지 훅 Windows 운영체제는 GUI를 제공하고, 이는 Event Driven 방식으로 동작한다. 키보드를 입력하고, 마우스를 이용해 버튼 선택, 창 크기 변경, 창 이동 등의 클릭하는 등의 행위는 모두 이벤트이다. 이런 이벤트가 발생할 때 OS는 미리 정의된 메시지를 해당 응용 프로그램으로 통보한다. 응용 프로그램은 해당 메시지를 분석하여 필요한 작업을 진행하는 것이다. [그림 21.1] ① 키보드 입력 이벤트가 발생하면 WM_KEYDOWN 메시지가 [OS message queue]에 추가된다. ② OS는 어느 응용 프로..
02. 아스키코드 vs 유니코드 02.1 Windows에서의 유니코드(UNICODE) 02.1.1 문자셋(Charactre Sets)의 종류와 특성 ◎ 종류 [아스키코드(ASCII CODE)] - 미국에서 정의하고 있는 표준. - 1byte로 문자 표현. - 알파벳 26자와 그림문자, 다양한 기호들 포함 256가지 문자 표현 가능. [유니코드(UNICODE)] - 영어권이 아닌 국가에서 사용하는 문자 표현. - 2byte로 문자 표현. - 영어, 기호, 한글 포함 65,536가지 문자 표현 가능. ◎ 문자셋 표현 방식 [SBSC(Single Byte Character Set)] - 문자를 표현하는데 1byte만을 사용하는 방식. - 아스키코드가 대표적인 SBCS. [MBCS(Multi Byte Chara..