검색결과 리스트
글
Day-02 어셈블리어
1.데이터 형식
메모리에 접근 했을때 얼만큼 읽어들일지 결정
데이터 타입 |
사용 용도 |
||
BYTE |
부호 없는 1 byte |
||
WORD |
부호 없는 2 byte |
||
DWORD |
부호 없는 4 byte |
2. 어셈블리언어 명령어
플랫폼에 따라서 다르다(IA32 : intel 기반, AT&T : linux 기반)
ADD [EBP-0x04],0x01
└> 명령어(OPCODE) └>피연산자(OPERAND)
1.명령어(OPCODE)
사용할 명령어가 들어가는 부분
2.피연산자(OPERAND)
operand의 갯수는 opcode에 따라 정해져 있다.(','로 구분)
<[EBP-0x04]>
메인 함수도 함수이기 때문에 호출 시 스텍프레임 생성
32bit 레지스터 이기때문에 자료형에 상관없이 4씩 변화
<0x01> : 상수
10진수로 표현가능하나 어셈블리어로 열면 16진수로 표시되어 있기 때문에 혼동이 될수도 있다.
<operand 표시법>
표시 기법 |
설명 |
mem |
메모리 |
label |
지정된 레이블 |
imm |
즉시 값, 상수 |
reg | 범용 레지스터 |
*레이블은 소스코드 중간에 이름을 지정하는것으로 뛰어넘을때나 반복할때 사용된다.
-뛰어넘기
int main(void)
{
int a = 0;
goto L1;
a = 5;
L1:
printf("%d\n", a);
return 0;
}
이렇게 되면 a=5;는 뛰어넘고 바로 printf로 가게 되어 0이 출력된다.
-반복하기
int main(void)
{
int a = 0;
L1:
a = 5;
printf("%d\n", a);
goto L1;
return 0;
}
이렇게되면 a=5; 와 printf가 계속 반복해서 실행되어 5가 무한번 출력된다.
3.INC
opernad의 값을 1증가시켜주는 명령어(operand 1개)
"++"연산자와 동일
결과 : a = 2
<사용가능한 operand>
INC reg (ex>INC EAX) |
INC mem(ex>INC [EBP-0x04]) |
*인라인 어셈
-상위레벨 언어에서 어셈블리어를 사용할 수 있게 해준다.
-문법상 오류가 발생해도 오류를 잘 표시 안된다
-한줄에는 한 명령어만!
-opcode 대/소문자 구분하지 않는다
-변수 a 대신에 [EBP-0x04]로 표현가능하다(피연산자 부분 참조)
-"_asm"영역 안에서는 기존 c언어의 함수를 사용할수없다(printf등)
4.DEC
operand의 값을 1감소시켜주는 명령어(operand 1개)
"--"연산자와 동일
결과 : a = 0
<사용가능한 operand>
DEC reg (ex>DEC EAX) | DEC mem(ex>DEC [EBP-0x04]) |
5.ADD
첫번째 operand의 값과 두번째 operand의 값을 더해서 첫번째 operand에 저장(operand 2개)
"+="과 동일
결과 : a = 20, b= 10 (동일한 결과지만 형태가 다른것을 보기위해서 저렇게 표현함)
<사용가능한 operand>
ADD reg, reg(ex>ADD EAX,EBX) |
ADD mem,reg(ex>ADD [EBP-0x04], EAX) |
ADD reg, mem(ex>ADD EBX, [EBP-0x04]) |
ADD reg, imm(ex>ADD EAX, 0x04) |
ADD mem, imm(ex>ADD [EBP-0x04], 0x01) |
|
6.SUB
첫번째 operand의 값과 두번째 operand의 값을 빼서 첫번째 operand에 저장(operand 2개)
"-="과 동일
결과 : a = -15, b = -2
*주석처리한결과가 다른 이유(주의!!!)
[EBP-0x08]은 b의 주소값이다. 그런데 b는 현재 0으로 초기화되있다.
이 경우 0에서 -2를 하는 것이아니라 메모리공간의 끝인 256에서 -2가 되기때문에 254가 출력된다.
*그렇다면 a는 왜 그렇게 되지 않을까?
a는 현재 5라고 초기화되어 있고 바로 앞에서 이미 계산이 되고 있기 때문에 이어서 계산이 진행된다.
<사용가능한 operand>
SUB reg, reg(ex>SUB EAX,EBX) | SUB mem,reg(ex>SUB [EBP-0x04], EAX) |
SUB reg, mem(ex>SUB EBX, [EBP-0x04]) | SUB reg, imm(ex>SUB EAX, 0x04) |
SUB mem, imm(ex>SUB [EBP-0x04], 0x01) |
|
7.MOV
첫번째 operand에 두번째 operand의 값을 복사(대입) 한다(operand 2개)
변수 초기화와 동일
결과 : a = 16
<사용가능한 operand>
MOV reg, reg(ex>MOV EAX,EBX) | MOV mem,reg(ex>MOV [EBP-0x04], EAX) |
MOV reg, mem(ex>MOV EBX, [EBP-0x04]) | MOV reg, imm(ex>MOV EAX, 0x04) |
MOV mem, imm(ex>MOV [EBP-0x04], 0x01) |
|
*operand가 mem,mem 은 실행되지 않는다
<해결법> : mem의 값을 reg에 저장 후 사용
레지스터는 저장공간이기 때문에 어떠한 레지스터를 사용하던 상관없다.
<예제 1>
a=16; b=5; b++; c=a+b; d=a-b; 를 어셈블리어로 표현하라.
결과 : a=16, b=6 c=22, d=10
<예제 2>
a=3; b=5; c=10; b++; c--; a=b+c; b=a-c; 를 어셈블리어로 표현하라.
결과 : a=15, b=6, c=9
'i2sec > Reverse Engineering' 카테고리의 다른 글
DAY 1 - 어셈블리언어 (0) | 2014.04.25 |
---|
설정
트랙백
댓글
글
백도어 탐지
1. Linux 프로세스 확인 및 열린 포트 확인
<ps -ef> : 프로세스 확인
<netstat -an> : 열린포트 확인
2. Windows 프로세스 확인 및 열린 포트 확인
윈도우 프로세스를 확인하기 위해서는 sysinternals suite 검색 후 다운로드가 필요하다.
다운로드 후 앞축을 풀면 파일이 여러게 있는데 그중에 우리가 볼것은!!!!
<pslist> - 윈도우 프로세스 확인을 위한 툴이다. 이툴은 CMD창에서 경로를 찾아가서 실행 시켜줘야한다.
<process explorer> - pslist보다 프로세스를 자세히 보는 프로그램
-분홍색=시스템프로세스, 보라색=내가 실행한 프로세스, 악성코드 감염시 빨간색 표시
<netstat -an> - 열린 포트를 확인해주는 명령어(따로 툴이 필요하지는 않다)
<TCPview> - 열린 포트를 실시간으로 확인 netstat와 유사하나 netstat는 정적 tcpview 동적
<https://www.virustotal.com/ko/> - 내가 가지고 있는 파일이 악성코드나 바이러스에 감염되어 있는지 확인해주는 사이트다.
3.바이러스 탐지 기법
1.파일 이름
(잘 사용안함-판별하기 힘듬)
2.해쉬
->해쉬값 비교을 비교해 변조 여부를 확인 하는 기법
->우회하기 쉬움
->www.virustotal.com - 해시값을 이용해 악성코드인지 판별해주는 사이트
3.시그니처
->기계어로 변환된 16진수 코드를 보고 진단하여 악성코드로 진단한다.
이미발견되고 정립 되어진 공격 패턴을 미리 입력해 두고, 입력된 패턴에 해당하는 트래픽을 발견하게 되었을 때 이를 감지하여 알려주는 기법이다.
이 기법은 모니터링 한 트래픽이 알려진 악성 행위의 특징과 일치하면 이를 공격으로 탐지하여 알려주는 것이므로, 많이 알려지고 공격자가 자주 사용하는 공격, 혹은 위협적이라고 알려진 공격 들을 전부 탐지 할 수 있다는 장점이 있다.
하지만 알려지지 않거나 입력되어 있지 않은 새로운 패턴에 대해서는 탐지 할 수 없다는 단점이 있다.
이 기법은 해커의 공격 목표로 만들어진 트래픽 이라는 것을 가정해 이에 따른 2가지 특징을 전제로 한다.
첫번째는 공격자는 강력한 공격을 위해 가능한 많은 트래픽을 보낼려고 하기 때문에 공격 트래픽은 TCP 흐름제와와 같은 트래픽 제어 프로토콜을 준수하지 않으며 공격 목표는 모든 패킷에 응답할 수 없게 되고 공격자와 공격 목표사이에는 트래픽 흐름이 불균형해진다.
두번째는 공격 트래픽은 무작위 패턴으로 만들어진다.
4.OPCODE
->기계어 오른쪽의 어셈블리어 부분이용 특정부분에서 특정값(실제값) 컴파일전 소스상에서 고쳐야 한다.
->어셈블리어 명령어(opcode)를 보고 악성코드인지를 확인하는 기법
5.행동기반
->동작되는 것을 보고 확인(소스 필요)
->실제동작 및 실행하는 것을 보고 판별
4.백도어 탐색시 유용한 명령어
<불필요한 SETUID 권한 설정 확인>'i2sec > System hacking' 카테고리의 다른 글
백도어(Backdoor) (0) | 2014.04.27 |
---|---|
SetUID (0) | 2014.04.27 |
Unix & Windows 인증 구조 (0) | 2014.04.27 |
패스워드 크래킹 (0) | 2014.04.23 |
Windows 단축키 및 주요 프로세스 (0) | 2014.04.21 |