Thread와 Fork, 동기식과 비동기식 소켓, Mutex와 Semaphore
동기식 소켓
- read혹은 send를 할 때, Blocking상태로 다른 작업을 수행하지 않고 대기하는 것.
- 구현, 구조가 용이
비동기식 소켓
- read혹은 send를 할 때, Non-Blocking상태로 다른 작업을 수행하며 완료되었는지 체크하는 것.
- 구현, 구조가 까다로움
Thread는 Fork
- thread는 fork의 비효율성을 극복하기 위해 사용.
- fork할 때 Process가 가지는 모든 자료구조를 다시 생성해야하므로 소모비용이 큼
- thread는 현재 Process의 대부분의 내용을 공유하기 때문에 정보 공유가 용이. 하지만 이로 인한 동기화 문제 발생.(임계영역으로 처리)
- 공통점 : thread와 fork 모두 각각의 PC를 가지고 스케쥴링의 단위(Context switch)가 됨
- 차이점 : thread는 code와 data를 공유. fork는 공유하지 않음
Mutex와 Semaphore
- 쉽게 보자면 Mutex는 값이 1인 Semaphore로 볼 수도 있다.(Semaphore는 0과 그 외의 숫자를 가지지만 Mutex는 0과 1만 가짐)
- Mutex는 해당 Mutex의 소유자만 해제 가능. Semaphore는 소유자가 아니더라도 해제 가능
- Semaphore는 공유된 자원을 여러 프로세스가 접근하는 것을 막고 Mutex는 공유된 자원을 여러 스레드가 접근하는 것을 막음.
- 설명) Mutex는 Process가 종료되면 함께 사라지지만, Semaphore는 시스템 범위에 걸쳐 파일 시스템의 형태로 존재하며 Process가 종료되어도 사라지지 않음.
- Mutex는 동기화 대상이 하나일 때, Semaphore는 동기화 대상이 여럿일 때 사용(Semaphore는 값을 증가하며 참조하는 프로세스 개수를 표현 or 참조할 때는 1, 쓰기를 할때는 2로 구현하여 상태를 표현하기도 함)
동기식과 비동기식 소켓이 기억나서 정리하다가 Thread와 임계영역이 생각나서 조사 및 정리
출처1 : http://xenostudy.tistory.com/230 (Thread와 Fork)
출처2 : http://ninako21.tistory.com/500 (뮤텍스와 세마포어)
[Backjoon] 1316번. 그룹 단어 체커
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞은 사람 | 정답 비율 |
---|---|---|---|---|---|
2 초 | 128 MB | 4887 | 2411 | 2185 | 52.198% |
문제
그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때문에 그룹 단어이지만, aabbbccb는 b가 떨어져서 나타나기 때문에 그룹 단어가 아니다.
단어 N개를 입력으로 받아 그룹 단어의 개수를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 단어의 개수 N이 들어온다. N은 100보다 작거나 같은 자연수이다. 둘째줄부터 N개의 줄에 단어가 들어온다. 단어는 알파벳 소문자로만 되어있고 중복되지 않으며, 길이는 최대 100이다.
출력
첫째 줄에 그룹 단어의 개수를 출력한다.
예제 입력
3 happy new year
예제 출력
3
소스코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc = new Scanner(System.in); int sum = 0; int TC = sc.nextInt(); sc.nextLine(); String [] str = new String [TC]; for(int T=0; T<TC; T++) { boolean jb = false; str[T] = sc.nextLine(); boolean [] chk = new boolean [26]; for(int i=0; i<str[T].length(); i++) { if(chk[str[T].charAt(i)-97] == true) { jb = true; break; } else chk[str[T].charAt(i)-97] = true; int j = i; while(i < str[T].length()) { if(str[T].charAt(i) != str[T].charAt(j)) { i--; break; } i++; } } if(!jb) sum++; } System.out.println(sum); } } | cs |
[Python] 문자 ↔ 아스키코드, 문자 ↔ 정수형
|
# 변수b는 str함수로 문자열 속성이기 때문에 연산에서 에러 발생 |
|||
|
[출력결과] 29 29 # 문자열 변수b를 int함수로 일시적으로 바꾸어 연산하므로 에러가 # 발생하지 않음 |
문자 ↔ 아스키코드
|
[출력결과] 97 b |
'Python' 카테고리의 다른 글
[Python] 제어문 사용법 (0) | 2017.06.29 |
---|---|
[Python] 문법?과 문자열 (0) | 2017.06.28 |
[Python] 제어문 사용법
제어문은 조건문인 if와 반복문인 for, while문 등이 있습니다.
if문 사용법 : if문은 조건이 일치하는 경우에만 실행할 때 사용합니다.
1 2 3 4 5 6 7 8 9 10 11 | # coding: utf-8 input = 3 num = 7 if input == num: print '정답입니다' elif input < num: print '정답보다 작습니다' else: print '정답보다 큽니다' print '종료' | cs |
if문의 조건식에는 괄호없이 조건만 명시하고 :로 끝을 알립니다.
해당 조건이 참일 때 실행되는 코드는 들여쓰기로 구분하므로, 들여쓰기를 정확히 해주어야합니다
While문 사용법 : 보통 시작과 끝을 모를 때 사용합니다. while문 옆의 조건식이 참일 때만 반복하고, 거짓이면 반복문이 끝나고 else로 가게됩니다.(else는 해도되고 안해도 됩니다.)
[코드]
|
[출력결과] 숫자 입력 : 5 정답보다 작습니다. 숫자 입력 : 16 정답보다 작습니다. 숫자 입력 : 25 정답보다 큽니다. 숫자 입력 : 23 정답입니다. while문 탈출 종료 |
for문 사용법 : 보통 시작과 끝을 알고있을 때 사용하는 반복문입니다. 열거형을 이용해 사용할 수 있습니다.
for문을 사용할 때는 파이썬에 내장된 range()함수를 이용해 숫자의 나열을 생성합니다.
[코드]
|
[출력결과] 0 1 2 |
- 0부터 2까지를 출력할 때 range함수의 매개변수입니다.
- 매개변수가 한개이면 0부터 매개변수 미만의 정수 값까지 반복합니다.
[코드]
|
[출력결과] 1 2 3 |
- 1부터 3까지를 출력할 때 range함수의 매개변수입니다.
- 매개변수가 두개이면 첫번째 값 이상, 두번 째 값 미만의 값까지 반복합니다
python의 for문은 사용법을 보면 아시겠지만 C/C++의 for문 보다 C#의 foreach와 비슷합니다.
break문 사용법 : for나 while 같은 반복문을 강제로 빠져나올 때 사용합니다.
[코드]
|
[출력결과] 1 2 3 4 |
- for문은 1~6까지 반복하라고 되어있지만 중간에 for문을 벗어나기 위해 break를 사용
- 출력결과처럼 i는 4일 때 for문을 벗어납니다
'Python' 카테고리의 다른 글
[Python] 문자 ↔ 아스키코드, 문자 ↔ 정수형 (0) | 2017.07.12 |
---|---|
[Python] 문법?과 문자열 (0) | 2017.06.28 |
[Python] 문법?과 문자열
파이썬의 주석
- 파이썬에서는 #으로 주석 작성이 가능합니다
- 자신이 개발한 프로그램도 3개월 지나면 코드 내용이 긴가민가 합니다. 이러한 부분을 보완하기 위해 주석은 생활화하는게 좋습니다ㅎ
※ 한글로 주석을 달기 위해서는 맨 위에 # coding=cp949 혹은 # coding: utf-8 를 추가해주시면 됩니다 ※
"cp949란 마이크로소프트에서 제정한 한글 표현 방식을 뜻하고 UTF-8형식으로 저장하는 경우도 한글 사용이 가능합니다"
파이썬의 문자열
- 문자열을 작성할 때는 "와 ' 모두 가능하며 '''혹은 """을 사용하면 여러줄을 문자열로 작성가능합니다.
- 파이썬에서는 char형이 따로 없습니다.
- 문자열을 작성하면 변경할 수 없습니다.
- C언어의 printf() 함수처럼 format()을 이용하여 포맷팅 지정이 가능합니다.
ex)
1 2 3 | name='홍길동' age=17 print '내 이름은 {}이고, 나이는 {}살 입니다'.format(name, age) | cs |
혹은
1 | print '내 이름은 '+name+'이고, 나이는 '+age+'입니다 | cs |
- C와 자바 등에서는 \t를 이용해 공백을 삽입했지만 파이썬에서는 \t와 함께 "나 '안에 작성한 공백이 그대로 적용됩니다
- 이스케이프 처리를 하지 않고 그대로 출력할 때에는 r을 문자열 앞에 삽입해 주면 됩니다. ex)r"문자열1\n"
파이썬에서 들여쓰기
Visual Studio나 Eclipse에서 C, JAVA를 할때에는 들여쓰기가 난잡하게 적용되어 있어도 컴파일이 잘 진행됩니다. 하지만, 파이썬에서는 들여쓰기가 일치해야만 문법 오류가 발생하지 않습니다
'Python' 카테고리의 다른 글
[Python] 문자 ↔ 아스키코드, 문자 ↔ 정수형 (0) | 2017.07.12 |
---|---|
[Python] 제어문 사용법 (0) | 2017.06.29 |
[reversing.kr] Replace
프로그램을 실행시켜보겠습니다
(그림 1)
숫자를 제외한 값은 입력되지 않네요. 키값을 알아내는 문제 같습니다.
숫자를 입력하고 "Check"를 눌러보면 오류가 발생합니다.
(그림 2)
OllyDbg로 열어서 실행하면 아래와 같은 부분에서 프로그램이 멈추는 것을 확인할 수 있습니다.
(그림 3)
↑ 주소 [EAX]의 값을 90으로 바꾸라는 명령어입니다. EAX의 값이 601605D2라서 접근 불가능한 주소입니다.
그래서 에러가 발생한거 같네요
(그림 4)
스택을 살펴보니 리턴 주소가 [4046AE]입니다.
다시 (그림 4)로 가서 [4046AE]의 위인 [40469F]에서 [40466F]의 값을 변경하고
[4046A9]에서 [40466F]를 호출하고 있습니다
아마 이 부분에서 문제가 있을 것으로 생각되네요ㅎㅎ
이제는 메인함수부터 차근차근 분석해보겠습니다.
(그림 5)
다이얼로그박스를 호출하면서 [401020]을 프로시저 주소 값으로 넘겨주고 있습니다.
(그림 6)
밑으로 조금 내리다 보면 GetDlgItemInt와 SetDlgItemTextA 함수가 보입니다.
제가 입력한 숫자값을 [4084D0]에 저장하고 [401065]에서 [40466F]를 호출합니다.
(브레이크를 걸어놓은 두 점프문 중에 [401071]은 무조건 실패로 가는 문장입니다. 이 부분을 NOP으로 변경하면 통과되는 것을 알 수 있습니다.)
(그림 7)
(그림 1)에서와 (그림 7)의 [40466F]의 값이 다른 것을 볼 수 있습니다.
(그림 7)에서의 [40466F] 함수는 지속적으로 [404689]를 통해 [4084D0]의 값을 올려주고 있습니다.
반복이 끝나면 다시 [40106C]에서 [404690]으로 이동합니다.
(그림 8)
EAX에 [4084D0]의 값을 담아서 [40466F]의 값을 변경한 후에 호출하여 [EAX]의 값을 90으로 편집하고,
다시 EAX를 증가시킨 후에 [EAX]의 값을 90으로 편집합니다.
opcode 90은 nop을 의미합니다. 아무것도 하지않고 넘어가는 명령어죠.
즉, 2byte를 nop으로 변경하는 부분이네요
(그림 6)에서 무조건 실패문으로 가는 jmp문이 short jmp문이기 때문에 2바이트입니다.
이 부분을 nop으로 바꾸기만 하면 됩니다.
7일 때 EAX의 값은 601605D2,
8일 때 EAX의 값은 601605D3 입니다.
계산기를 통해 EAX에 원하는 주소값을 입력시키면 됩니다.
'WarGame > Reversing.kr' 카테고리의 다른 글
[reversing.kr] Easy Unpack (0) | 2017.01.19 |
---|---|
[reversing.kr] Easy Keygen (0) | 2017.01.19 |
[reversing.kr] Easy Crack (0) | 2017.01.19 |
[reversing.kr] Easy Unpack
ReversingKr UnpackMe Find the OEP ex) 00401000 |
프로그램을 실행시켜 보면
아무것도 없네요.
오로지 언패킹 후의 OEP를 구하면 될거 같습니다.
PEiD로 분석한 결과도 별다른게 없네요
OllyDbg로 프로그램을 불러오면 위와 같은 창이 뜹니다.
압축된 프로그램으로 예상된다는 창이므로 다음으로 넘어갑시다
※※패킹된 파일은 언패킹을 진행한 후에 마지막으로 OEP로 가서 프로그램을 정상실행합니다.
그러므로 언패킹을 한 후에 점프하는 부분을 찾으면 됩니다.
EP에서 마지막 부분으로 가면
JMP 401150 명령어가 보입니다.
401150이 OEP로 추정됩니다.
제출해보니 맞네요...
너무 빨리 끝나니... 언패킹을 진행하는 코드를 분석해보도록 하겠습니다.
↑ 패킹을 해제하기위해 필요한 라이브러리와 API를 불러오기위해 LoadLibrary와 GetProcAddress를 로드시켜놓습니다.
↑ 409000 ~ 4094EE 영역의 패킹을 해제합니다
↑ VirtualProtect API로 405000 ~ 406000의 메모리 영역읠 읽기쓰기 권한으로 변경합니다
↑이부분은 조금 복잡하더군요.
복구하는 데이터를 봤을 때는 IAT를 복구하는 코드 같습니다.
↑ 401000 ~ 405000의 영역에 READWRITE권한을 부여한후에
데이터를 복구합니다.
↑ 406000 ~ 409000 영역에 READWRITE권한을 부여한후에
데이터를 복구합니다.
'WarGame > Reversing.kr' 카테고리의 다른 글
[reversing.kr] Replace (0) | 2017.01.25 |
---|---|
[reversing.kr] Easy Keygen (0) | 2017.01.19 |
[reversing.kr] Easy Crack (0) | 2017.01.19 |
[reversing.kr] Easy Keygen
ReversingKr KeygenMe Find the Name when the Serial is 5B134977135E7D13 |
시리얼 번호가 5B134977135E7D13 일 때 이름을 찾으라는 문제네요
우선 아무 값이나 넣어보겠습니다
문자열을 토대로 비교위치를 찾아가보면
401000이 메인함수 같네요
올리디버거를 돌리다보면 스택에 302010이라는 값을 넣는 위치가 있습니다.
302010과 제가 입력한 이름값을 ECX, EDX에 넣고 BYTE단위로 XOR 연산을 합니다.
즉 10, 20, 30 순서대로 제가 입력한 값들을 XOR 연산합니다.
첫 자리 문자는 10, 둘째 자리는 20, 셋째는 30, 다시 넷째는 10..이런식으로 xor 연산을 진행하고
연산 결과가 5B134977135E7D13가 나오면 통과입니다.
'WarGame > Reversing.kr' 카테고리의 다른 글
[reversing.kr] Replace (0) | 2017.01.25 |
---|---|
[reversing.kr] Easy Unpack (0) | 2017.01.19 |
[reversing.kr] Easy Crack (0) | 2017.01.19 |
[reversing.kr] Easy Crack
우선 실행해보면
아무키나 입력해볼게요
간단하게
Search for → All referenced test strings 가서 문자열을 찾아봅시다
그리고 조금만 위로 올라가면
각 코멘트는 제가 달았으니 참고하시기 바랍니다.
전체적인 개요는 받은 키값을 쪼개어 부분별로 체크하고 각 체크 단계마다
일치여부를 판단해서 다르면 실패메시지를 띄우게 되어있습니다.
코드창에서 눈에 바로 들어오는 문자열도 있고(두 번째 이후 문자열)
아스키코드값으로 표현되어 있는 부분도 있네요(1,2)
각 값을 나열하면 키값을 구할 수 있을겁니다
'WarGame > Reversing.kr' 카테고리의 다른 글
[reversing.kr] Replace (0) | 2017.01.25 |
---|---|
[reversing.kr] Easy Unpack (0) | 2017.01.19 |
[reversing.kr] Easy Keygen (0) | 2017.01.19 |
[WINAPI] GetDriveType 함수
GetDriveType 함수의 원형
UINT WINAPI GetDriveType( _In_opt_ LPCTSTR lpRootPathName );
인자 lpRootPathName은 말 그대로 드라이브의 루트 이름을 전달해주면 됩니다.
GetDriveType 함수는 인자로 전달받은 드라이브가 어떤 종류의 드라이브인지 판별하여 리턴해줍니다.
각 리턴 값들에 대한 설명입니다.
Return code/value | Description |
---|---|
| The drive type cannot be determined. |
| The root path is invalid; for example, there is no volume mounted at the specified path. |
| The drive has removable media; for example, a floppy drive, thumb drive, or flash card reader. |
| The drive has fixed media; for example, a hard disk drive or flash drive. |
| The drive is a remote (network) drive. |
| The drive is a CD-ROM drive. |
| The drive is a RAM disk. |
주요 드라이브에 대한 설명을 하자면
DRIVE_REMOVABLE은 제거 가능한 드라이브로 USB를 떠올리면 됩니다.
DRIVE_FIXED은 주로 사용하는 C:나 D: 같은 고정 하드디스크라고 생각하시면 됩니다.
DRIVE_CDROM은 잘 아시리라 믿고, DRIVE_REMOTE은 네트워크 가상 드라이브를 의미합니다.
사용 방법
1 2 3 4 5 | char cDriverName[] = "C:"; if(GetDriveType(cDriveName) == DRIVE_FIXED) { MessageBox(NULL, "DRIVE_FIXED Type입니다", cDriveName, MB_OK); } | cs |
1 2 3 4 5 6 7 8 9 10 11 | char cDriveName[10] = "A:"; int i; for(i=0; i<10; i++) { if(GetDriveType(cDriveName) == DRIVE_REMOVABLE) { MessageBox(NULL, "DRIVE_REMOVABLE Type입니다", cDriveName, MB_OK); } cDriveName[0]++; } | cs |
'프로그래밍' 카테고리의 다른 글
VisualStudioCode C++ 디버깅 오류 (0) | 2021.09.25 |
---|---|
JAVA Garbage Collection (0) | 2020.06.14 |