1. 어셈블리 프로그램 "Hello, haxor!" 를 화면에 출력 

 

// vi hello.asm 

 

section .data; section 선언

msg db "Hello, haxor!",0xa; 문자열과 줄을 바꿈.

len equ $ - msg; 문자열의 길이. 여기서 $는 이곳을 의미.

section .text; 강제 section 선언, 엔트리 포인트를 EL 링커로 보내거나 

global _start; 일반적으로 로더는 _start를 엔트리 포인터로 인식

_start: 

                ; 문자열을 stdout로 쓰기

mov edx, len; 세 번째 인수(메시지 길이)

mov ecx,msg; 두 번째 인수(쓸 메시지에 대한 포인터)

mov ebx,1; 첫 번째 인수 로딩(파일 핸들(stdout))

mov eax, 4; 시스템 호출 번호(4=sys_write)

int 0x80; 커널 인터럽트를 호출하고 나가기

mov ebx,0; 첫 번째 syscall 인수 로딩 (코드에서 나가기)

mov eax,1; 시스템 호출 번호(1=sys_exit)

int 0x80; 커널 인터럽트를 호출하고 나가기 

 

// 저장하기 :wq

 

2. 어셈블링 - 오브젝트 코드를 만드는 것. 

// hello.asm를 이용하여 hello.o를 형성하는 과정.

 

nasm -f elf hello.asm

 

// nasm 명령어를 사용하기 위해선 FFmpeg와 NASM설치가 필요하다.

 

* 설치법

https://videocube.tistory.com/entry/FFmpeg-%EC%84%A4%EC%B9%98-%ED%95%B4%EB%B3%B4%EC%9E%90-CentOS-63 참고하기!!

 

mkdir ~/ffmpeg_sources

cd ~/ffmpeg_source

git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg    // 혹시나 git명령어가 먹히지 않는다면 yum install git 입력!                                                                           // yum은 인터넷이 된다는 가정하에 사용 가능하다. 
 
yum install autoconf automake bzip2 cmake freetype-devel gcc gcc-c++ git libtool make mercurial pkgconfig zlib-devel                                                          // Dependencies 설치

cd ~/ffmpeg_sources

curl -O -L http://www.nasm.us/pub/nasm/releasebuilds/2.13.02/nasm-2.13.02.tar.bz2

tar xjvf nasm-2.13.02.tar.bz2

cd nasm-2.13.02

./autogen.sh

./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin"

make

make install                                                        // NASM설치(Assembler)


//

 

다시 

 

nasm -f elf hello.asm

실행 결과

// hello.o가 생긴 것을 확인할 수 있음.

 

 

3. 어셈블링 - 실행할 수 있는 링커 연결

 

ld -m elf_i386 hello.o 

 

실행 결과는

 

 

4. 어셈블링 - 실행하기

// 책에서는 ./helloHello, haxor!라고 입력한다.

하지만 실행 결과,,, 오류가 난다.. 밑에 처럼... 그래서 한참 이것저것 해보다가.

아까 본 a.out이 생각났다.

 

그래서 hello대신에 a.out을 실행시켜보겠다고 결심!

짜잔!!!! 결과값이 나오긴했다!!!!

맞는지는 사실 모른다,,,,, 그냥,, 나름대로 오류를,,해결하도록 노력했다,,^^ 휴우 자야지..ㅎㅎㅎ

 

 

// Centos를 이용한 어셈블링 끝!

* 어셈블리어 

- AT&T => 리눅스 개발자들이 사용, 레지스터 앞에 %, 리터럴 값 앞에 $사용. 

 

ex) CMD <source>,<dest><#command>

 

- NASM(Netwide Assembler) => 윈도우 에섬블러나 디버거들이 사용.

 

ex) CMD <dest>, <source> <;comment>

 

 

*어셈블리어 지시자

 

 

1. mov 

=> <source>에서 <dest>로 데이터를 복사. 소스에 값이 없어지지 않음.

NASM문법 NASM예제 AT&T예제
mov <dest>, <source> mov eax,51h;comment movl $51h, %eax #comment

 

ex) 

mov eax, 1234h; 16진수 값 1234를 eax로 저장

mov cs, ax; 그런 다음 ax의 값을 cs로 복사

 

 

2.  add, sub

=> add는 소스를 목적지에 더하고 결과를 목적지에 저장, sub는 목적지에서 소스를 뺀 다음 결과를 목적지에 저장.

 

NASM문법 NASM예제 AT&T예제

add <dest>, <source>

sub <dest>, <source>

add eax, 51h

sub eax, 51h

addl $51h, %eax

subl $51h, %eax

 

 

3. push, pop 

=> 스택에 아이템을 넣거나, 빼기.

 

NASM문법 NASM예제 AT&T예제

push <value>

pop <dest>

push eax

pop eax

pushl %eax

popl %eax

 

4. xor

=> xor 값, 값 을 이용하여 값을 0으로 만들거나 레지스터나 메모리 위치를 지울 수 있음.

 

NASM문법 NASM예제 AT&T예제

xor <dest>, <source>

xor eax, eax

xor %eax, %eax

 

5. jne, je, jz, jnz, jmp

=> eflag인 "zero flag" 값에 따라 다른 위치로 분기.

=> jne, jnz 는 "zero flag"=0 이면 해당 번지로 점프

=> je, jz 는 "zero flag"=1 이면 점프 

=> jmp는 항상 점프 

 

NASM문법 NASM예제 AT&T예제

jnz <dest> / jne <dest>

jz <dest> / je <dest>

 

jmp <dest> 

jne start

jz loop

 

jmp end

jne start

jz loop

 

jmp end

 

6. call, ret

=> call은 프로시저를 호출 , ret는 프로시저 끝에서 호출 후 명령어 흐름으로 되돌아갈 때 사용.

 

NASM문법 NASM예제 AT&T예제

call <dest>

ret

call subroutine1

ret

call subroutine1

ret 

 

7. inc, dec

=> 목적지 값을 늘이거나 줄이거나.

 

NASM문법 NASM예제 AT&T예제

inc <dest>

dec <dest>

inc eax

dec eax

incl %eax

decl %eax

 

8. lea 

=> 소스의 유효한 주소를 목적지로 로드

 

NASM문법 NASM예제 AT&T예제

lea <dest>, <source>

lea eax, [dsi+4]

leal 4(%dsi), %eax

 

 

9. int

=> 프로세서에 시스템 인터럽트 신호를 던짐. 사용할 공통 인터럽트는 커널에 시스템 호출을 보내는 0x80이다.

 

NASM문법 NASM예제 AT&T예제

int <val>

int 0x80

int $0x80 

'이론충' 카테고리의 다른 글

TCP/IP-1  (0) 2018.11.21

1.  프로세스란? 

- 일반적으로는 실행중인 파일을 의미

 

 

  * 프로그램 vs 프로세스 

  - 프로그램은 실행파일 test.exe같은 것을 의미

  - 프로세스는 이 프로그램을 실행시켰을때 보게 되는 익스플로러 창 

 

  * 실행되는 프로세스 개수 = 메모리 구조 개수 

 

2. 프로세스의 범주 

- 메모리 구조 + 레지스터 Set 

- 프로세스 별로 독립적으로 할당받는 리소스 

 

3, 프로세스 스케줄러 

- 둘 이상의 프로세스가 적절히 실행되도록 컨트롤하는 요소(모듈) 

 

 

4. 프로세스의 상태 

* Ready와 Blocked상태의 차이점

- Ready상태는 스케줄러에 의해 선택되어 지금 당장이라도 실행 가능한 상태

- Blocked상태는 스케줄러에 의해 선택될수 없는 상태 

 

* I/O란? => CPU가 관여하지 않는다.      

- 데이터의 입출력, 송수신

   ex)  주소창에 'www.naver.com'을 입력하고 엔터키 누르는 것. 그러면 네이버 서버로부터 웹페이지 전송 받는것 => 데이터 입출력 

 

* Context Switching (켄텍스트 스위칭)

- A프로세스가 실행중일때, B프로세스의 요청이 들어오면 A의 프로세스 상태, 값을 저장한 후 B프로세스가 수행하도록 프로세스 상태, 레지스터 값을 교체하는 것.

- 즉, cpu에 있던 A의 데이터 <->  메모리에 있던 B의 데이터 

 

 

5. 프로세스의 생성 

- 바탕화면에서 아이콘 더블 클릭

- 프로그래밍으로 프로세스 생성 및 실행

 

=> 둘다 같은 원리이다. 부모 프로세스가 CreateProcess()함수로 자식 프로세스를 생성하는 느낌. 

 

6. 프로세스 생성 함수 

BOOL CreateProcess(
    LPCTSTR lpApplicationName,    // 생성될 프로세스의 이름
    LPTSTR lpCommandLine,         // 생성될 프로세스에 인자 전달
    LPSECURITY_ATTRIBUTES lpProcessAttributes, // 프로세스의 보안 속성 지정
    LPSECURITY_ATTRIBUTES lpThreadAttributes,   // 쓰레드의 보안 속성 지정
    BOOL bInheritHandles,                   // TRUE : 부모 프로세스가 소유하는 상속 가능한 핸들을 상속한다.
    DWORD dwCreationFlags,              // 생성하는 프로세스의 특성을 결정짓는 옵션(우선순위)
    LPVOID lpEnvironment,                  // 생성하는 프로세스의 Environment Block 지정
                                                           NULL : 부모 프로세스의 환경 블록 복사
    LPCTSTR lpCurrentDirectory,          // 생성하는 프로세스의 현재 디렉터리 설정
                                                            NULL : 부모 프로세스의 현재 디렉터리
    LPSTARTUPINFO lpStartupInfo,       // STARTUPINFO 구조체 변수 초기화한 후
                                                           변수의 포인터를 인자로 전달
    LPPROCESS_INFORMATION lpProcessInformation
                                                      //생성하는 프로세스의 정보를 얻기 위한 인자
                                                      //PROCESS_INFORMATION 구조체 변수의 주소값을 인자로 전달
);

출처: https://dakuo.tistory.com/82 [hacker dakuo]

 

 

7. 프로그래밍을 통한 프로세스 생성 

 

 

01. 프로젝트명: AdderProcess

 

// AdderProcess.cpp : 이 파일에는 'main' 함수가 포함됩니다. 거기서 프로그램 실행이 시작되고 종료됩니다.
//

// 메인함수의 전달인자를 뎃셈하는 프로그램

#include "pch.h"
#include 
#include 
#include 

int _tmain(int argc, TCHAR* argv[])
{
DWORD val1, val2;
val1 = _ttoi(argv[1]);
val2 = _ttoi(argv[2]);

_tprintf(_T("%d + %d = %d \n"), val1, val2, val1 + val2);

_gettchar();
return 0;
}

디버깅 후 만들어진 실행파일을 C:\\WinSystem로 복사 또는 이동한다. 

 

 

 

// CreateProcess.cpp : 이 파일에는 'main' 함수가 포함됩니다. 거기서 프로그램 실행이 시작되고 종료됩니다. 
// 

#include "pch.h" 
#include  
#include  
#include  
#include  

#define DIR_LEN MAX_PATH+1 

int _tmain(int argc, TCHAR* argv[]) 
{ 

STARTUPINFO si = { 0, };  // 구조체 변수 선언 및 초기화
PROCESS_INFORMATION pi;  

si.cb = sizeof(si); // 구조체 변수의 크기를 나타내는 멤버변수 cb초기화 
si.dwFlags = STARTF_USEPOSITION | STARTF_USESIZE;  // Flag지정 (내가 지정한 값만 참고하여 설정할 수 있도록 하는 것. ) 즉, 바로 밑 4줄인 x,y좌표와 프로세스 윈도우 가로,세로 길이값 참고를 위해 사용하는 Flag.
si.dwX = 100;  // 프로세스 x좌표
si.dwY = 200;  // 프로세스 y좌표
si.dwXSize = 300;  // 프로세스 윈도우의 가로 길이
si.dwYSize = 200;  // 프로세스 윈도우의 세로 길이 
si.lpTitle = _T("I am a boy!");  


TCHAR command[] = _T("AdderProcess.exe 10 20");  // 실행파일 명과 매개변수를 선언한 것. 실행파일 명은 위에서 만든것과 이름이 같아야 한다. 
TCHAR cDir[DIR_LEN]; 
BOOL state; 

GetCurrentDirectory(DIR_LEN, cDir);  // 현재 디렉터리 확인 
_fputts(cDir, stdout); 
_fputts(_T("\n"), stdout); 

SetCurrentDirectory(_T("C:\\WinSystem"));  // 현재 디렉터리를 c:\\WinSystem으로 변경하는 코드 


GetCurrentDirectory(DIR_LEN, cDir);  // 현재 디렉터리 확인
_fputts(cDir, stdout); 
_fputts(_T("\n"), stdout); 

state = CreateProcess(  // 프로세스 생성
NULL, 
command, // 메인함수에 전달될 문자열 
NULL, NULL, TRUE, 
CREATE_NEW_CONSOLE, 
NULL, NULL, &si, &pi 
); 

if (state != 0) 
_fputts(_T("Creation OK! \n"), stdout); 
else 
_fputts(_T("Creation Error! \n"), stdout); 

return 0; 
} 

 

디버깅하기!!  

 

 

<결과값>

 

=> 프로그래밍에 의해 프로세스 생성 및 실행 

 

 

 

패스워드크래킹_보고서_.pdf
0.34MB

 

'악성코드분석보고서' 카테고리의 다른 글

320전산대란_vti-rescan.exe  (0) 2019.03.08
침해사고분석_악성코드보고서  (0) 2019.02.28

PE 파일.docx


320전산대란 vti-rescan.exe

악성코드 정보, 정적/동적/상세 분석 

320전산대란_vti.pdf



'악성코드분석보고서' 카테고리의 다른 글

패스워드크래킹 보고서  (0) 2019.03.31
침해사고분석_악성코드보고서  (0) 2019.02.28

정리는 엉망이지만,,,, 그래도 첨부,,~ 

악성코드 분석 상세 내용이다!

파이널프로젝트_결과보고서_청일점_20190304.pdf



'악성코드분석보고서' 카테고리의 다른 글

패스워드크래킹 보고서  (0) 2019.03.31
320전산대란_vti-rescan.exe  (0) 2019.03.08

인생 첫 해킹대회,,, ☆


2019.02.23 am 4:00 - 2019.02.24 am 4:00

고등학생용 해킹대회라고,,했으면서,, 강사님....ㅎ..ㅎ.ㅎ..... 몸풀라면서,,,, 몸은 커녕,, 문제보기도 힘들고,,,,,,,,,,,, 

저 많은 문제중 풀수 있는 건 없었,,,,,,,,,,,,,,,,,,,,,,, 

내일부터 유투브를 보며 오답노트(?)를 할 것이다.

다음엔 만나서 해킹대회하자는데 넘나 기대되는 것 ㅎㅎㅎㅎ 집에서 혼자하면 노잼이여 


+ Recent posts