검색결과 리스트
리버싱 기초에 해당되는 글 8건
- 2018.03.21 SetUID 란?
- 2018.03.14 [리버싱 기초] 반복문 - while문
- 2018.03.12 [리버싱 기초] 반복문
- 2018.03.08 [리버싱 기초] 조건문
- 2018.03.07 [리버싱 기초] 어셈블리어 기초문법과 레지스터
- 2018.03.07 [리버싱 기초] 입력문
- 2018.03.02 [리버싱 기초] 변수 선언 6
- 2018.01.17 [기초] 메시지 후킹(Message Hooking)
글
SetUID 란?
SetUID 는 파일이 실행되는 동안에 해당 파일 소유자의 권한을 획득하는 것을 의미한다. 만약 소유자가
root라고 가정을 하면 root의 권한을 가진 일반 사용자가 해킹에 이용을 할 수 있단 소리다.
SetUID를 이용해서 백도어를 만들 수 있고, 백도어가 있는 곳을 내 마음대로 오갈 수 있는 통로가 된다.
* 특수권한 (SetUID, SetGID, Sticky Bit)
: http://brothernsister.tistory.com/32
SetUID를 기본적으로 테스팅을 해보면 아래의 간단한 프로그래밍으로 테스트를 해본다.
SetUID를 사용학 위해선 unistd.h, sys/types.h 헤더파일이 필요하다.
'보안 > 시스템 보안' 카테고리의 다른 글
[FTZ] 해커스쿨 Level5 (0) | 2018.03.30 |
---|---|
[FTZ] 해커스쿨 Level4 (0) | 2018.03.28 |
[FTZ] 해커스쿨 Level3 (0) | 2018.03.27 |
[FTZ] 해커스쿨 level2 (0) | 2018.03.26 |
시스템 보안 개론 (0) | 2018.02.06 |
글
[리버싱 기초] 반복문 - while문
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include <stdio.h> int main(void){ int val = 0; while(1){ scanf("%d", &val); if(val == 10) break; val++; } return 0; } | cs |
'보안 > 리버싱' 카테고리의 다른 글
[리버싱] Lena Reverse Engineering Newbie #1 (0) | 2018.05.22 |
---|---|
GDB 명령어 (0) | 2018.03.18 |
[리버싱 기초] 반복문 (0) | 2018.03.12 |
[리버싱 기초] 조건문 (0) | 2018.03.08 |
[리버싱 기초] 어셈블리어 기초문법과 레지스터 (0) | 2018.03.07 |
글
[리버싱 기초] 반복문
1 2 3 4 5 6 7 8 9 | #include <stdio.h> void main(void){ int val=2, i; for(i=1; i<10; i++){ printf("2 * %d = %d\n", i, i*val); } } | cs |
포문 어셈블리어로 정리한 파일
:
'보안 > 리버싱' 카테고리의 다른 글
GDB 명령어 (0) | 2018.03.18 |
---|---|
[리버싱 기초] 반복문 - while문 (0) | 2018.03.14 |
[리버싱 기초] 조건문 (0) | 2018.03.08 |
[리버싱 기초] 어셈블리어 기초문법과 레지스터 (0) | 2018.03.07 |
[리버싱 기초] 입력문 (0) | 2018.03.07 |
글
[리버싱 기초] 조건문
1 2 3 4 5 6 7 8 9 10 11 12 13 | #include <stdio.h> void main(void){ int val = 0; if(val == 0){ printf("%d\n"); } if(val != 0){ printf("val is not 0!\n"); } } | cs |
'보안 > 리버싱' 카테고리의 다른 글
[리버싱 기초] 반복문 - while문 (0) | 2018.03.14 |
---|---|
[리버싱 기초] 반복문 (0) | 2018.03.12 |
[리버싱 기초] 어셈블리어 기초문법과 레지스터 (0) | 2018.03.07 |
[리버싱 기초] 입력문 (0) | 2018.03.07 |
[리버싱 기초] 변수타입 (0) | 2018.03.06 |
글
[리버싱 기초] 어셈블리어 기초문법과 레지스터
'보안 > 리버싱' 카테고리의 다른 글
[리버싱 기초] 반복문 (0) | 2018.03.12 |
---|---|
[리버싱 기초] 조건문 (0) | 2018.03.08 |
[리버싱 기초] 입력문 (0) | 2018.03.07 |
[리버싱 기초] 변수타입 (0) | 2018.03.06 |
[리버싱 기초] 변수 선언 (6) | 2018.03.02 |
글
[리버싱 기초] 입력문
변수 선언후 scanf()함수를 이용해서 값을 입력받고, pirntf() 함수를 이용해서 출력
1 2 3 4 5 6 7 8 | #include <stdio.h> void main(void){ int val; scanf("%d", &val); printf("%d\n", val); } | cs |
변수 선언 후 scanf()함수를 이용한 부분 리버싱
'보안 > 리버싱' 카테고리의 다른 글
[리버싱 기초] 조건문 (0) | 2018.03.08 |
---|---|
[리버싱 기초] 어셈블리어 기초문법과 레지스터 (0) | 2018.03.07 |
[리버싱 기초] 변수타입 (0) | 2018.03.06 |
[리버싱 기초] 변수 선언 (6) | 2018.03.02 |
[리버싱 기초] Hello World !! (0) | 2018.02.28 |
글
[리버싱 기초] 변수 선언
리눅스를 이용해서 리버싱을 공부하고 있습니다. 리눅스는 우분트 16버전을 사용하고 있습니다.
디스어셈블링은 기존에 설치되어있는 gdb 프로그램을 이용해서 하고 있습니다. ^^
1 2 3 4 5 6 7 8 9 | #include <stdio.h> void main(void){ int val; val = 2; printf("val의 값은 : %d\n", val); } | cs |
main의 시작은 400526 주소에서 시작되는 명령어 문에서 main에서 시작을 한다. push %rbp 에서 시작을 한다.
왜 그렇냐고 하면 스택 프레임 자체가 프로그램이 사용될 때 마다 생성되서 사용되기 때문에 Stack Frame 을 사용하려면
주소지를 알아야 사용할 수 있기 때문에 처음 시작은 첫 행에서 사용된 명령어가 사용된다.
그리고 2번째까지도 mov %rsp, %rbp 선언된건 저렇게 약속이 되어 있기 때문에 대다수가 저렇게 선언이 된다. 프로그램이 생성이 되서
가지고 온 스택 프레임의 첫번째 주소지를 %rsp 레지스터에 값을 넣어준다.(%rbp는 값이 변하면 안 된다. 변할 시에 스택 프레임의 시작
주소를 알 수 없게 되어버리기 때문에 %rbp는 고정되고, %rbp에 담긴 스택 프레임의 주소를 %rsp에 넣고, 변수가 선언이 되고, 스택에 내용이
저장이 되면 rsp의 값이 변경이 된다.)
세번째 행에서 보면 sub 0x10, $rsp 어셈블러가 있다. 이 행은 변수를 선언하는 부분인데, c 프로그래밍을 하면 변수마다 각각의 이름을
선언할 수 있지만 어셈블러는 따로 변수명을 선언하지는 않는다. 그리고 0x10 부분은 16진수다. 0x10를 $rsp 레지스터에 빼면 빈 공간이
생기는데, 빈 공간이 변수가 선언되어서 사용되는 공간이다.
1 2 3 4 5 6 7 8 9 10 11 12 | #include <stdio.h> void main(void){ int val, val2; val = 10; vla2 = 1; int val3 = 0; val3 = val; } | cs |
변수 선언을 한 다른 경우를 보게 되면 첫 행과 두번째 행은 똑같다.
두번째 내용을 정리한 패드로 정리한 내용이다.
'보안 > 리버싱' 카테고리의 다른 글
[리버싱 기초] 입력문 (0) | 2018.03.07 |
---|---|
[리버싱 기초] 변수타입 (0) | 2018.03.06 |
[리버싱 기초] Hello World !! (0) | 2018.02.28 |
Lena 리버싱 - 튜토리얼 1강 pdf 파일 (0) | 2018.02.12 |
[기초] 메시지 후킹(Message Hooking) (0) | 2018.01.17 |
글
[기초] 메시지 후킹(Message Hooking)
메시지후킹(Message Hooking)
: 영어로 Hook는 갈고리, 낚시 바늘 정도의 뜻을 지닌다. 원하는 것을 낚아챌 때 낚시 바늘을 사용한다.
메시지 후킹은 컴퓨터의 어떤 것을 낚아채기 위해서 사용되는데, 과연 어떤 것을 낚아채는 걸까?
후킹이란 다른 프로세스에 걸려서(Hooked) 해당 프로세스의 정보를 얻어 오거나, 변경하는 것이 가능한 기술이다.
프로세스란 윈도우의 프로세스라고 생각하면 되겠다.
어떤 건물의 전화를 도청을 하고 싶다. 그러면 건물의 전화선들이 지나가는 곳에 도청 장치(후킹 프로시저)를 설치한다.
그럼 도정장치의 전화 내용들이(windown Message) 지나간다. 도청 장치는 그 중 필요한 메시지를 저장하고 있거나, 필요한 곳으로 전송한다.
후킹 함수를 만들기 위해서는 지켜야 하는 규칙
1. Call Back 함수여야함
2. 함수의 마지막 부분에서는 CallNextHookEx() 함수를 호출함
3. 함수가 받는 인자는 정해져 있음
4. 후킹 프로시저는 DLL 안에 있어야함
LRESULT CALLBACK KeyboardProcedure(int nCode, WPARAM wParam, LPARAM lParam)
{
if( nCode >= 0 )
{
}
// We must pass the all messages on to CallNextHookEx.
return ::CallNextHookEx( g_Hook , nCode , wParam , lParam );
}
1. Win32 Dynamic Link Library 프로젝트 생성
2. Cpp 파일 위의 후킹함수를 만들어줌
후킹 프로시저를 시작하는 함수, 종료하는 함수
후킹 프로시저를 시작하는 함수
HHOOK SetWindowsHookEx(
int idHook,
HOOKPROC lpfn,
HINSTANCE hMod,
DWORD dwThreadId
);
MSDN : https://msdn.microsoft.com/en-us/library/ms644990(v=vs.85).aspx
후킹 프로시저를 종료하는 함수
UnhookWindowsHookEx() 의 사용법
BOOL UnhookWindowsHookEx(
HHOOK hhk
);
MSDN : https://msdn.microsoft.com/en-us/library/ms644993(v=vs.85).aspx
'보안 > 리버싱' 카테고리의 다른 글
[리버싱 기초] Hello World !! (0) | 2018.02.28 |
---|---|
Lena 리버싱 - 튜토리얼 1강 pdf 파일 (0) | 2018.02.12 |
DLL 이젝션(프로그램) (0) | 2018.01.15 |
코드엔진 level19 (0) | 2017.09.12 |
코드엔진 level18 (0) | 2017.09.11 |