'system'에 해당되는 글 20건

  1. 2016.01.19 ubuntu vi
  2. 2012.06.15 PE patch를 이용한 DLL loading
  3. 2012.03.06 가상 키 코드(스캔코드) 테이블
  4. 2012.02.24 쉽게 쓴 dll
  5. 2012.01.16 관리자 권한 실행 - UAC 고려하기
  6. 2011.10.31 Segmentation 시발점 찾다가
  7. 2011.09.01 110901 긁적긁적
  8. 2010.09.03 dll injection 기초
  9. 2010.09.01 코드섹션 // 데이터 섹션
  10. 2010.08.30 .bash_history 파일에 흔적을 남기지 않는 방법 1

ubuntu vi

system/linux 2016. 1. 19. 13:37

http://norux.me/13

1.

cd ~

vi .exrc

set autoindent

set number

set bs=2

set nocp

syntax on

source .exrc

 

2.

sudo apt-get install vim

 

'system > linux' 카테고리의 다른 글

.bash_history 파일에 흔적을 남기지 않는 방법  (1) 2010.08.30
setuid, setgid, sticky bit  (0) 2010.08.30
리눅스보안 - 필수 보안  (0) 2010.07.21
리눅스 기본 명령어  (0) 2010.06.29
rz // sz  (0) 2010.06.29
:

PE patch를 이용한 DLL loading

system/windows 2012. 6. 15. 11:28

널패딩영역 확인


널패딩영역 IDT 코드 덮어쓰기 후 실행 검증


reloc 헤더 계산

Size of Raw Data 와 Virtual Size 비교하여 사용가능한곳에 삽입

reloc 섹션이 시작하는 Pointer to Raw Data(file), RVA(Memory)


BOUNT IMPORT TABLE 제거 - NULL


IDT 호출 주소 변경, IDT 크기 업데이트


text 헤더 널패딩영역 확인 후 INT, Name, IAT 셋팅


이동한 IDT 영역에서 INT, Name, IAT 등의 호출 주소 삽입


text 헤더 영역 Characteristics 변경 - 쓰기 가능하도록 수정


실행 검증


'system > windows' 카테고리의 다른 글

가상 키 코드(스캔코드) 테이블  (0) 2012.03.06
쉽게 쓴 dll  (0) 2012.02.24
관리자 권한 실행 - UAC 고려하기  (0) 2012.01.16
Segmentation 시발점 찾다가  (0) 2011.10.31
110901 긁적긁적  (0) 2011.09.01
:

가상 키 코드(스캔코드) 테이블

system/windows 2012. 3. 6. 19:42

키코드 Value(HEX) Value(DEC)
VK_LBUTTON 01 1 마우스 왼쪽 버튼
VK_RBUTTON 02 2 마우스 오른쪽 버튼
VK_CANCEL 03 3 Ctrl + C
VK_MBUTTON 04 4 마우스 가운데 버튼
VK_BACK 08 8 Backspace 
VK_TAB 09 9 Tab
VK_CLEAR 0C 12 CLEAR
VK_RETURN 0D 13 Enter
VK_SHIFT 10 16 Shift
VK_CONTROL 11 17 Ctrl(좌측)
VK_MENU 12 18 Alt(좌측)
VK_PAUSE 13 19 Pause Break
VK_CAPITAL 14 20 Caps Lock
VK_HANGUL 15 21 한/영 키
VK_HANJA 19 25 한자 키
VK_ESCAPE 1B 27 ESC
VK_SPACE 20 32 Spacebar
VK_PRIOR 21 33 Page Up
VK_NEXT 22 34 Page Down
VK_END 23 35 End
VK_HOME 24 36 Home
VK_LEFT 25 37 Left Arrow(←)
VK_UP 26 38 Up Arrow(↑)
VK_RIGHT 27 39 Right Arrow(→)
VK_DOWN 28 40 Down Arrow(↓)
VK_SELECT 29 41 Select
VK_EXECUTE 2B 43 EXECUTE
VK_SNAPSHOT 2C 44 PrtScr
VK_INSERT 2D 45 Insert
VK_DELETE 2E 46 Delete
VK_HELP 2F 47 Help
VK_0 30 48 0 키
VK_1 31 49 1 키
VK_2 32 50 2 키
VK_3 33 51 3 키
VK_4 34 52 4 키
VK_5 35 53 5 키
VK_6 36 54 6 키
VK_7 37 55 7 키
VK_8 38 56 8 키
VK_9 39 57 9 키
VK_A 41 65 A 키
VK_B 42 66 B 키
VK_C 43 67 C 키
VK_D 44 68 D 키
VK_E 45 69 E 키
VK_F 46 70 F 키
VK_G 47 71 G 키
VK_H 48 72 H 키
VK_I 49 73 I 키
VK_J 4A 74 J 키
VK_K 4B 75 K 키
VK_L 4C 76 L 키
VK_M 4D 77 M 키
VK_N 4E 78 N 키
VK_O 4F 79 O 키
VK_P 50 80 P 키
VK_Q 51 81 Q 키
VK_R 52 82 R 키
VK_S 53 83 S 키
VK_T 54 84 T 키
VK_U 55 85 U 키
VK_V 56 86 V 키
VK_W 57 87 W 키
VK_X 58 88 X 키
VK_Y 59 89 Y 키
VK_Z 5A 90 Z 키
VK_LWIN 5B 91 윈도우키(좌측)
VK_RWIN 5C 92 윈도우키(우측)
VK_APPS 5D 93 App Menu 키
VK_NUMPAD0 60 96 숫자키패드 0
VK_NUMPAD1 61 97 숫자키패드 1
VK_NUMPAD2 62 98 숫자키패드 2
VK_NUMPAD3 63 99 숫자키패드 3
VK_NUMPAD4 64 100 숫자키패드 4
VK_NUMPAD5 65 101 숫자키패드 5
VK_NUMPAD6 66 102 숫자키패드 6
VK_NUMPAD7 67 103 숫자키패드 7
VK_NUMPAD8 68 104 숫자키패드 8
VK_NUMPAD9 69 105 숫자키패드 9
VK_MULTIPLY 6A 106 숫자키패드 *
VK_NUMADD 6B 107 숫자키패드 +
VK_SEPARATOR 6C 108 SEPARATOR
VK_SUBTRACT 6D 109 숫자키패드 -
VK_DECIMAL 6E 110 숫자키패드 .
VK_DEVIDE 6F 111 숫자키패드 /
VK_F1 70 112 F1 키
VK_F2 71 113 F2 키
VK_F3 72 114 F3 키
VK_F4 73 115 F4 키
VK_F5 74 116 F5 키
VK_F6 75 117 F6 키
VK_F7 76 118 F7 키
VK_F8 77 119 F8 키
VK_F9 78 120 F9 키
VK_F10 79 121 F10 키
VK_F11 7A 122 F11 키
VK_F12 7B 123 F12 키
VK_F13 7C 124 F13 키
VK_F14 7D 125 F14 키
VK_F15 7E 126 F15 키
VK_F16 7F 127 F16 키
VK_F17 80 128 F17 키
VK_F18 81 129 F18 키
VK_F19 82 130 F19 키
VK_F20 83 131 F20 키
VK_F21 84 132 F21 키
VK_F22 85 133 F22 키
VK_F23 86 134 F23 키
VK_F24 87 135 F24 키
VK_NUMLOCK 90 144 Num Lock 키
VK_SCROLL 91 145 Scroll Lock 키

'system > windows' 카테고리의 다른 글

PE patch를 이용한 DLL loading  (0) 2012.06.15
쉽게 쓴 dll  (0) 2012.02.24
관리자 권한 실행 - UAC 고려하기  (0) 2012.01.16
Segmentation 시발점 찾다가  (0) 2011.10.31
110901 긁적긁적  (0) 2011.09.01
:

쉽게 쓴 dll

system/windows 2012. 2. 24. 16:33

  • 기초부터 가자~ DLL 이란 무엇인가
 dll이란 무엇인가. 대부분 .dll파일을 한번씩은 본적이 있을 것이다. 
 이 dll 파일이란 실행파일이 요구되는 변수 함수등을 공유하기 위해 외부적으로 만든 라이브러리 라고 보면 된다.(이해하기를)
 공통 부분의 함수를 공유하기가 용이하기 때문에 자주 사용되는 변수나 함수등의 내용을 dll로 작성하여 개발 시간이 단축될 수 있다. (나는 보통 cpp, h 파일로 작성하여 필요할때마다 파일을 카피 하여 프로젝트에 추가하곤 한다. 하지만 이 방법을 쓸 경우 굳이 파일을 포함시키지 않더라도pragma나 비쥬얼 스튜디오의 프로젝트 속성에 dll 파일을 링크하여 가져다 쓸 수 있다.)


  • DLL, 어떻게 가져다 써?
에잉~  중간에 내용 추가하려니까 더 귀찮네-_-;
깜빡하고 넘어간 것. DLL을 만드는건 그렇다 치고 어떻게 가져다 쓸것인가?

이 부분은 자세하게 풀이된 글이 있어 가져왔다.(많은 도움이 되었다 감동)
http://blog.naver.com/kyehwan2?Redirect=Log&logNo=10005701934
 삽질 해결을 위해 너무너무 많은 도움이 된 글이고 굳이 사견을 덧붙일 필요없이 예제까지 정리가 깔끔히 된 글이라 그대로 가져왔다.

호출하는 방법은 implicit 과 explicit 방법이 있는데
우선 여기선 조금쉬운 방법인 implicit방법을 먼저 하자
위에서 DLL을 만들때 같이 만들어 지는 lib를 이용한다.
 
여기서 lib에 대해 언급하면...
링크될때 링커는 이 lib파일을 표준 라이브러리 처럼 다루어 처리하지만, dll을 끌어오는
lib파일은 dll이 익스포트한 함수 각각에 대한 stub(함수 호출에 쓰이는 정보를 일컬음)만을 포함
 
함수 스텁은 사실 진짜 함수와 동일한 이름과 인수 리스트를 가진 pseudo 함수로서,
내부를 살펴보면 스텁에 필요한 모든 인수를 넘겨서 DLL에 들어있는 진짜 함수를 호출하는
짤막한 코드가 들어있다.
이렇게하면 DLL의 함수를 분리된 파일이 아니라, 애플리케이션 코드의 일부인 것처럼
다루게 된다
 
LIB 파일을 임포트 라이브러리라고 부른다.

(1)Implict 링킹
 
“DLL이 있어서 DLL이 바로 동적 링크되는데 LIB 파일이 왜 필요한가?” 

이렇게 물어보는 사람도 있을 것입니다. 이유는 메인프로그램을 컴파일하고 링크할 때 DLL 안에 있는 함수들은 메인프로그램에는 어느 것과도 링크되어 있지 않아 실행 파일로 만들 때 에러가 나오기 때문입니다. 예를 들어, PaintImage(LPSTR  filename);이라는 함수를 DLL로 만들어 놓고 메인프로그램에서 헤더에 extern "C"__declspec(dllimport)void PaintImage(LPSTR filename);이라고 정의하면 컴파일은 하지만 링크할 때 PaintImage 함수를 찾을 수 없다고 하며 에러를 리턴하고 실행 파일을 만들 수 없게 됩니다. 따라서, PaintImage라는 함수를 가상으로 만들어 그것을 0으로 설정해 주는 하나의 함수가 있어야 합니다.
void PaintImage(LPSTR  fileanem)=0;
 이렇게 만들어진 함수가 컴파일되어 LIB로 만들어집니다. 따라서, 메인프로그램에서는 실행 내용이 아무것도 들어 있지 않은 LIB를 프로젝트에 삽입하고 컴파일하는 것이죠. 그런 후 프로그램이 실행되면 LIB에 설정된 파일명에 따라 DLL을 로드하고 프로그램 메모리 안에 DLL에서 로드시킨 PaintImage 모듈을 삽입시키게 됩니다. 결국 우리는 DLL을 만들고 난 후 3가지의 파일을 이용해서 메인프로그램을 제작하게 되는 것입니다. 이 3가지 파일은 다음과 같습니다. 

① 실질적으로 프로그램이 실행될 때 로드되는 DLL 파일(*.DLL) 
② 컴파일할 때 설정해 주는 함수명이 들어 있는 헤더 파일(*.H) 
③ 링크할 때 메인프로그램에 빈 함수를 설정하는 LIB 파일(*.LIB)

(2)Explicit 링킹 
 Explicit 링킹 방법이란 Implict 링킹 처럼 3가지의 파일이 필요가 없이 단순하게 DLL를 이용하여 로드할수 있는 방법을 의미합니다. 이방법으로 DLL를 로드할경우 3개의 함수를 이용합니다. 
 제일 먼저 라이브러리를 로드하는 LoadLibrary함수입니다. 이함수의 형은 다음과 같습니다.

HINSTANCE LoadLibrary( LPCTSTR lpLibFileName );
 예를 들어서 ExRegularDll.dll이라는 함수를 로드하고자 한다면  다음과 같이 할수 있습니다. 

HINSTANCE hDll;

hDll=LoadLibrary("ExRegularDll.dll");

 LodadLibrary함수를 이용하로 로드하면 인스턴스 핸들을 리턴합니다. 이 인스턴스 핸들을 이용하여 필요한 함수의 포인터를 찾습니다. 예를 들어 ExRegularDll.dll이라는 함수에 현재 윈도우의 화면 크기를 가지고 있는 함수가 Factory라고 한다면 다음과 같이 할수 있습니다. 

typedef int (*FactoryFunc)(int num);

FactoryFunc lpFactoryFunc;

lpFactoryFunc=(FactoryFunc)GetProcAddress(hDll,"Factory");

GetProcAddress함수는 다음과 같은 형태입니다. 

FARPROC GetProcAddress(

HMODULE hModule, // DLL인스턴스

LPCSTR lpProcName //함수 이름

);

 GetProcAddress함수의 첫번째 인자는 로드한 DLL의 인스턴스 핸들이며 두번째 인자는 이 DLL안에 있는 함수이름입니다. GetProcAddress(hDll,"Factory"); 라고 하였을경우 “ExRegularDll.dll"함수안에서 Factory 함수를 찾아서 이 메모리 위치를 리턴하며 위의 예에서는 이 위치를 lpFactoryFunc 가 받는 것입니다. 이렇게 리턴된 lpFactoryFunc 함수를 실행하고자 한다면 다음과 같이 하면 됩니다. 
lpFactoryFunc(num)
 lpFactoryFunc();라고 실행하였을경우 DLL의 Factory 의 함수를 실행한것과 같습니다.  만일 Factory 함수의 안에 인자로 (int num)이 있기 때문에 위와 같이 int num의 인자를 설정한것입니다. 

 이와 같이 라이브러리에서 함수를 실행한후 DLL의 사용이 종료 되면 FreeLibrary함수를 이용하여 해제 하면됩니다.
FreeLibrary(hDll);
 이렇게 하였을경우 현재 DLL를 사용하는 프로그램이 전형 없다고 할경우 그 DLL은 메모리에서 해제되나 만일 다른 프로그래에서 사용하고 있다면 이 DLL 은 메모리에 그대로 있습니다. 메모리에서 DLL를 해제하지 않고 싶을경우 한개의 프로그램이 로드하면서 그DLL를 로드하고 아무것도 이용하지 않은채 해제를 하지 않으면 됩니다. 이렇게 되면 다른 프로그램에서는 언제나 메모리에 상주되어 있는 DLL 를 항상 이용할수 있습니다. 

그리하여 직접 사용해보기~
DLL 파일부로 부터 선언부 발췌

#pragma data_seg("Shared")
HINSTANCE g_Module = NULL;
HHOOK g_hook = NULL;
HWND g_hWnd = NULL;
#pragma data_seg() 

#pragma comment(linker, "/SECTION:Shared,RWS")

__declspec(dllexport) BOOL SetHook( HWND hWnd );
__declspec(dllexport) BOOL RemoveHook();
DLL을 링크한 CPP 파일로 부터 발췌

#pragma comment( lib, "test.lib" )

함수사용부
HINSTANCE hIns = LoadLibrary(_T("CatchDll.dll"));
if( hIns == NULL )
 MessageBox("Load Library fail\n");
typedef void (*defSetHook)(HWND hWnd);
defSetHook fSetHook; 
fSetHook = (defSetHook)GetProcAddress( hIns, "SetHook" );
fSetHook( this->GetSafeHwnd() );
FreeLibrary(hIns);
해당 부분은 직접 구현할 떄 사용한 방법/코드를 그대로 가져온 것이다.
이상하게 implict으로 하면 안된다 ..안습(이거때문에 하루를 날렸음)
  아. 예제 넣는것도 힘들다-_-; (tistory미워요)

pragma에 대한 자세한 사용은 아래의 글, "pragma의 용법"을 보자.

 비쥬얼 스튜디오에서 설정을 통하여 dll 파일을 linking 하는 부분이다.(순차설명)
Project(프로젝트:우클릭 혹은 드랍메뉴)>Property(속성)>Linker(링커)>input(입력)
제일 윗단의 추가종속성에 dll 파일의 경로와 이름을 넣어주면 된다. 상대경로든 절대경로든.
   한글버전의 비쥬얼 스튜디오가 깔려있어서 영문 이름은 정확하지 않다.


  • DLL, 변수를 공유하자
처음 시작은 dll을 링크한 외부에서 dll의 돌아가고 있는 상황을 알고자 함이었다.
  외부에서 DLL 파일의 변수에 접근하고 싶을 때 어떻게 해야할까?

dll에서 생성한 데이터(메모리)를 dll을 사용하는 프로세스(프로그램)에서 사용하는 방법에는 크게 두가지가 있다.
  1. #pragma data_seg의 사용
  2. 메모리맵 파일의 사용
 나는 이번 후킹예제에서 거의 대부분의 사람이 사용할 것이라고 생각하는(검색하였을 떄 양이 더 많다-_-;;) pragma data_seg를 사용하였다.
 따라서 메모리맵 파일의 사용법은 다른데서 찾아보세요- _-)y~

 용이한 자료가 매우 많은 pragma data_seg를 사용한 변수 공유는 사용법도 간편하다.
#pragma data_seg("SHAREDATA")
 int x;
 char y;
#pragma data_seg()
#pragma comment( linker, "SECTION:.SHAREDATA,RWS" )
   위의 pragma들의 자세한 사용에 대해 알고 싶으면 아래의 글을 참조.
 위와 같이 사용하면 된다. dll 파일을 링크하면 x, y의 데이터를 공유할 수 있게 된다.
 
쉽다.


 으흐흐 계속 쉬웠으면 좋겠다 ㅠㅠ
 이걸 위해 몇시간 삽질을 했는지 모름. 대체적인 예제들이 자세한 설명은 앞뒤로 떼먹고 코드만 보여주고 됐지? 타입이라 하나하나 정보를 수집해야만 했다. 특히 pragma 들에 대해-_-
 pragma의 자세한 내용은 아까 말했다시피 아래의 글을 참조.



  • 이제 변수의 공유가 되었으니 함수를 공유하자

이게뭐야-_-; tistory 편집기는 word를 따라가기엔 멀었다. 메뉴만 같이 하다니 밉다.
(글머리 기능&bold,color 사용을 위해 올렸다 내렸다 지웠다 달았다 난리 났다)

함수공유... ㅈㄱ..제일 삽질한 부분이다.

 dll 내부의 공유함수는 다음과 같이 "이~ 함수는~ 외부에서 사용할 것이다~" 라고 컴파일러에게 가르켜 주지 않으면 안된다. 자동인식...절때 그런거 없다 흑.

__declspec(dllexport) BOOL SetHook( HWND hWnd );
__declspec(dllexport) BOOL RemoveHook();

빨간 부분이 DLL 파일에서의 주 요점이다.

함수공유를 위해 프로그램에서 해주어야하는일이 있다.
링크와 선언.

implict방법
pragma 라던가 비쥬얼스튜디오를 사용해 링크해주던간에 일단 dll을 링크해주었다.
그럼 이제 dll내의 함수 사용을 위해 헤더나 파일의 상단에 dll 파일 내의 함수이름을 선언해주어야 한다. 그냥 다른 함수 선언하는 것과 마찬가지로

반환인자 함수이름( 매개변수 );
int testFunc( int name );

해주면 된다.
사용을 위해 이런게 있어 함 찾아봐 이러고, 선언해주는 것이다.
그럼 이제 컴파일시 해당 선언을 보고 linking된 dll 파일로부터 함수를 찾아 수행하게 된다.

explicit방법
좀 길지만 확실한 방법이다.
직접 dll이 컴파일되어있는 lib로 부터 불러들인다.

HINSTANCE hIns = LoadLibrary(_T("CatchDll.dll"));
if( hIns == NULL )
 MessageBox("Load Library fail\n");
typedef void (*defSetHook)(HWND hWnd);
defSetHook fSetHook; 
fSetHook = (defSetHook)GetProcAddress( hIns, "SetHook" );
fSetHook( this->GetSafeHwnd() );
FreeLibrary(hIns);

만세~
여기까지이다.
DLL 파일의 생성부터 자세한 설명까지

http://ccmc.knu.ac.kr/files/research/sdl_home/dll/subject1.htm
http://blog.naver.com/kyehwan2?Redirect=Log&logNo=10005701934
http://msdn.microsoft.com/library/default.asp


출처 : http://mayu.tistory.com/9

'system > windows' 카테고리의 다른 글

PE patch를 이용한 DLL loading  (0) 2012.06.15
가상 키 코드(스캔코드) 테이블  (0) 2012.03.06
관리자 권한 실행 - UAC 고려하기  (0) 2012.01.16
Segmentation 시발점 찾다가  (0) 2011.10.31
110901 긁적긁적  (0) 2011.09.01
:

관리자 권한 실행 - UAC 고려하기

system/windows 2012. 1. 16. 16:31
- 요약
1. ShellExecute runas
2. 링커 리콰이어
3. 매니페스트


- ShellExecute 를 사용 하는 방법

if(IsUserAnAdmin() == FALSE) //프로그램이 관리자 권한인지 알 수 있는 함수
{
//관리자 권한으로 실행 시킨다.
SHELLEXEGUTEINFO si
ZeroMemory(&si, sizeof(SHELLEXECUTEINFO));

si.cbSize = sizeof(SHELLEXECUTEINFO);
si.hwnd = NULL;
si.fMask = SEE_MASK_FLAG_DDEWAIT | SEE_MASK_FLAG_NO_UI;
si.lpVerb = _T("runas");
si.lpFile = _T("프로그램명");
si.lpParameters = _T("파라미터");
si.nShow = SW_SHOWNORMAL;
si.lpDirectory  = NULL;
ShellExecuteEx(&si);
}

- Visual C++ 2008 일 경우 설정

 Project > Properties 메뉴를  선택
 Linker > Manifest File 항목에서
 Enable User Account Control (UAC)를 Yes로 설정하고
 UAC Execution Level을 requireAdministrator로 설정한다.

- 매니페스트 파일 생성

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity version="1.00.0"
     processorArchitecture="X86"
     name="IsUserAdmin"                       
     type="win32"/>
  <description>Description of your application</description>
  <!—어플리케이션 보안 요구 사항을 식별합니다. -->
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel
          level="requireAdministrator"
          uiAccess="false"/>
        </requestedPrivileges>
       </security>
  </trustInfo>
</assembly>

위의 내용으로 manifest 라는 XML 파일을 생성한다.

name="IsUserAdmin" 여기에 실행파일 명을 명시!!!
level="requireAdministrator" 인 경우 관리자 권한으로 프로그램 실행됨.
level="asInvoker" 인 경우 부모 프로세스와 동일한 토큰으로 실행됨(경험적 결과이나 일반사용자 권한으로 실행됨)


위의 파일을 응용프로그램 안으로 통합하는 방법은 여기 http://blogs.msdn.com/shawnfa/archive/2006/04/06/568563.aspx  를 참고하십시오.


- 출처
http://happybird.tistory.com/13  
 

'system > windows' 카테고리의 다른 글

가상 키 코드(스캔코드) 테이블  (0) 2012.03.06
쉽게 쓴 dll  (0) 2012.02.24
Segmentation 시발점 찾다가  (0) 2011.10.31
110901 긁적긁적  (0) 2011.09.01
dll injection 기초  (0) 2010.09.03
:

Segmentation 시발점 찾다가

system/windows 2011. 10. 31. 14:34
Segmentation 시발점 찾다가 생각나서 그림으로 정리

결론은, 80286


 


'system > windows' 카테고리의 다른 글

쉽게 쓴 dll  (0) 2012.02.24
관리자 권한 실행 - UAC 고려하기  (0) 2012.01.16
110901 긁적긁적  (0) 2011.09.01
dll injection 기초  (0) 2010.09.03
win 명령어  (0) 2010.08.05
:

110901 긁적긁적

system/windows 2011. 9. 1. 17:51
세그먼트 레지스터
- 세그먼트 디스크립터 테이블 인덱스를 보유

그 인덱스를 찾아 세그먼트 디스크립터 테이블을 참조하게 되고
그 세그먼트 디스크립터 테이블에는 세그먼트 메모리가 있음


각 세그먼트 레지스터가 가리키는 세그먼트 디스크립터와 + 가상메모리(os에서 사용자가 지정한 메모리 주소)
- 선형주소가 됨
- 이렇게 사용자가 지정한 메모리 주소로부터 선형 메모리까지 얻어지는 과정을 "세그먼테이션" 이라 칭함


선형주소 + 페이징 기법으로 
- 물리주소가 됨
- 접근하고자 하는 메모리에 대한 세그먼테이션 과정이 끝나면 프로세서는 과정에서 도출된 얻어진 선형 메모리로 부터 
페이징 메커니즘에 의해 물리 메모리 주소를 가지고 오게 됨


가상메모리 - 선형메모리 - 물리메모리

가상메모리는 gdt, ldt 로 선형주소와 매칭
- gdt(global) : 모든 프로그램이 참조할 수 있는 세그먼트 디스크립터들의 모임
- ldt(local) : 멀티테스킹 환경에서 각 테스크 단위로 정의


거기서 나온 선형주소는 페이지 디렉토리와 페이지 테이블을 참조하여 물리주소와 매칭



세그먼트 셀렉터
- index :
세그먼트 디스크립터 테이블에 있는 디스크립터의 배열에서 어떤 것을 선택할 것인지 나타냄
- ti(table indicator) : 
get=0, ldt=1
- rpl(request privilege level) : 요청한 놈에 대한 권한레벨
특권레벨, 예를 들어 커널모드
보호모드는 권한에 따른 제어가 가능한데 바로 rpl, dpl 때문, 이를 비교하여 접근을 제어


하위 3bit가 다른 용도로 사용되므로, index는 01000(8), 10000(16)... 등으로 8씩 증가되는 것처럼 보일것임
디스크립터주소 = gdt주소 + (index*8) 여기서, index에 8을 곱하는 이유는 디스크립터가 8byte이기 때문)


윈도우의 하위 2Gbyte (0 ~ 0x7fffffff) :  유저레벨에서 사용 (어플리케이션이 사용)
윈도우의 상위 2Gbyte (0x80000000 ~ 0xffffffff) : 커널레벨에서 사용



cdecl(C lib)
-아래와 같이 콜러가 스택 정리
00401000    PUSH EBP                        ; add() 시작
00401001    MOV EBP,ESP
00401003    MOV EAX,DWORD PTR SS:[EBP+8]
00401006    ADD EAX,DWORD PTR SS:[EBP+C]
00401009    POP EBP
0040100A    RETN

...

00401010    PUSH EBP                        ; main() 시작
00401011    MOV EBP,ESP
00401013    PUSH 2
00401015    PUSH 1
00401017    CALL callconv.00401000          ; => add() 호출
0040101C    ADD ESP,8                       ; => stack 정리
0040101F    POP EBP                       
00401020    RETN



stdcall(Win32 API)
-아래와 같이 콜리가 스택 정리. 참 착하네
00401000    PUSH EBP                        ; add() 시작
00401001    MOV EBP,ESP
00401003    MOV EAX,DWORD PTR SS:[EBP+8]
00401006    ADD EAX,DWORD PTR SS:[EBP+C]
00401009    POP EBP
0040100A    RETN 8 -- 리턴 + 팝

...

00401010    PUSH EBP                        ; main() 시작
00401011    MOV EBP,ESP
00401013    PUSH 2
00401015    PUSH 1
00401017    CALL callconv.00401000
0040101C    POP EBP
0040101D    RETN


이 함수를 스탠다드콜로 하고 싶다 할땐 아래와 같이 하면 됨
int _stdcall example(int a, int b)


fastcall
기본적으로 stdcall과 같으나, 함수에 전달하는 파라미터 일부(2개 까지)를
스택 메모리가 아닌 레지스터를 이용하여 전달.

예를 들어 파라미터가 4개 일때, 앞의 2개 파라미터는 ecx, edx 를 이용하여 전달

당연히 레지스터를 쓰니 메모리 보다 함수 호출이 빠를 수 밖에..
사실 속도성보다는 편의를 위해 사용.

그러나 ecx, edx 백업 필요 존재 - 다른 값이 쓰여지니까

=====================================
expertprogrammer.tistory.com
rootkit.tistory
reversecore.com
nobless_06.blog.me
 

'system > windows' 카테고리의 다른 글

관리자 권한 실행 - UAC 고려하기  (0) 2012.01.16
Segmentation 시발점 찾다가  (0) 2011.10.31
dll injection 기초  (0) 2010.09.03
win 명령어  (0) 2010.08.05
컬링 컨벤션 세가지(cdecl,stdcall,fastcall)  (0) 2010.07.07
:

dll injection 기초

system/windows 2010. 9. 3. 12:45

'system > windows' 카테고리의 다른 글

Segmentation 시발점 찾다가  (0) 2011.10.31
110901 긁적긁적  (0) 2011.09.01
win 명령어  (0) 2010.08.05
컬링 컨벤션 세가지(cdecl,stdcall,fastcall)  (0) 2010.07.07
메모리 관리와 함수  (0) 2010.07.06
:

코드섹션 // 데이터 섹션

system 2010. 9. 1. 09:53

출처 : http://blog.naver.com/blueherald?Redirect=Log&logNo=120048956032
:

.bash_history 파일에 흔적을 남기지 않는 방법

system/linux 2010. 8. 30. 21:07

.bash_history 파일에 흔적을 남기지 않는 방법
------------------------------------------------------------------------------

 

유닉스&리눅스에서 중요한 것은 bash 를 쓰게 되면 .bash_history 라는 파일이 생깁니다.
.bash_history 파일의 특징은 우선 bash 쉘을 실행시킨후의 모든 명령을 그 파일에 저장시킵니다.
그리고 저장되는 파일의 위치는 쉘을 실행시킨 사람의 uid 를 따릅니다.
euid 가 더 우선권이 있슴..

즉.루트쉘을 실행시키면 루트 디렉토리에 .bash_history파일이 생기고(원래 존재하면 덧붙여 써짐..)
그 파일에 저장이 되요~
또한 한가지 특징은 사용자가 그 쉘을 끝냈을때 전부 저장이 되죠.
실행중에는 저장이 안됨.
즉.우리가 로그아웃하면 그때 저장이 되요. 웃기죠? 황당하고.

그래서 우리는 루트쉘을 실행시킨후 루트 디렉토리로 가야 합니다.
그후에 .bash_History 라는 디렉토리를 만들어 놓아요.
그러면 파일이 않 만들어지겠죠..디렉토리 우선이니까.

또하나의 방법은 .bash_history  파일을 /dev/null 이라는 파일에 링크를 시키는 방법입니다.
즉.. ln -s /dev/null /root/.bash_history 라고 명령을 내리면 .bash_history파일이 /dev/null 파일에 링크가 되요.
그렇게 되면 .bash_hisroty 파일에 덧붙여 쓰기를 하면 /dev/null
즉 널포인터(쓰레기처리장  ^^;)으로 보내지게 되죠.
사라져요..내용이..히히

하지만 더 좋은 방법이 있습니다.

바로.. set  설정..즉 환경 설정을 바꾸면 되죠.
한번 유닉스 상태에서 (리눅스) set 를 쳐보세요.

LS_OPTIonS=--8bit --color=tty -F -b -T 0
MACHTYPE=i386
MAIL=/var/spool/mail/loveyou
MAILCHECK=60
GROUP=users
HISTFILE=/home/loveyou/.bash_history
HISTFILESIZE=500
HISTSIZE=500
HOME=/home/loveyou
........
(이하 생략)

이런 형식으로 나오죠.
여기서 유심히 볼것은 HISTFILE=/home/loveyou/.bash_history 입니다.
이것은 바로 .bash_history  라는 파일의 위치를 가르키는 변수이기 때문이죠.
그럼..이렇게 함으로써 해결이 되겠죠.
export HISTFILE=/dev/null

자.. 이제 초보적인 백도어 설치와 그에 대한 안전한 조치를 강좌했습니다.
이번엔 관리자의 입장에서 방지하고 막는 방법을 말하죠.

관리자는 언제나 끊임없이 호스트를 살펴야겠죠.
나쁜짓 하는 사람이 있을까하고요..
우선 setuid 걸린 프로그램의 대부분은 퍼미션이 4755 입니다.

보통 퍼미션은 777 퍼미션을 쓰지만
ex) chmod 777 /bin/bash
하지만 앞에 한자리 더 쓰게 되면 특수한 퍼미션을 만들수있죠.
1 은 스틱키 설정 4는 setuid 설정..

ex) chmod 1777 /tmp  <= 일반적인 /tmp디렉토리 설정
      chmod 4755 rootshell <= 바로 루트쉘 설정중 한 단계죠.

즉..이것을 이용해서 find 명령으로 찾습니다.
find . -user root -perm 4755 -print 정도의 명령어를 쓰면 됩니다.
4755 퍼미션이 아니면 문제가 생기겠죠?

이때는

ls -alR / |grep rws
ls -alR / | grep r-s
ls -alR / |grep -- --s 입니다. -- --s 가 정상입

위에서 grep --s 를 왜 grep -- --s 라고 했는지는 스스로 알아내세요.
한번 grep --s 랑 grep -- --s 라고 해보시면 알아요.

출처 : http://www.virhac.com/bbs/?bid=linuxhk&pid=41

'system > linux' 카테고리의 다른 글

ubuntu vi  (0) 2016.01.19
setuid, setgid, sticky bit  (0) 2010.08.30
리눅스보안 - 필수 보안  (0) 2010.07.21
리눅스 기본 명령어  (0) 2010.06.29
rz // sz  (0) 2010.06.29
: