검색결과 리스트
i2sec/Reverse Engineering에 해당되는 글 2건
- 2014.04.28 Day-02 어셈블리어
- 2014.04.25 DAY 1 - 어셈블리언어
글
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 |
---|
설정
트랙백
댓글
글
DAY 1 - 어셈블리언어
1.리버스 엔지니어링이란?
- 이미 만들어진 시스템을 역으로 추적하여 처음의 문서나 설계기법 등의 자료를 얻어 내는 일을 말한다.
즉, 실행파일을 분석해 소스코드를 알아내는 일
2.어셈블리언어란?
-기계어와 1:1 대응관계에 있는 언어를 말한다.
3.바이너리 디버거 종류
- Olly DBG
=http://ollydbg.de
=동적 악성코드 분석시 사용
- IDA Pro
=http://hex-rays.com/odapro/idadown.htm
=그래프뷰 기능 존재, 정적 악성코드 분석시 사용
-WinDBG
=http://www.microsoft.com/whdc/devtools/debugging/default.mspx
=MS사에서 제작
=Kernel + User 디버깅 가능 (명령어로 입력해야되는 것이 단점)
4.레지스터
-cpu내에 존재하는 저장공간으로 읽는 속도가 가장 빠르다
32bit General-Purpose Resgisters (32bit 범용 레지스터) |
|
EAX |
EBP |
EBX |
ESP |
ECX |
ESI |
EDX |
EDI |
EFlAGS |
AF |
CF |
OF |
PF |
SF |
ZF |
EIP |
|
|
*EAX
=누산기, 산술연산을 저장 하는 공간
=리턴값 저장에 주로 사용
*EBX
=간접 주소 저장 공간
= ex> JMP 1000(1000 주소로 이동) == EBX =1000, JMP EBX
*ECX
= 반복 카운터(반복문에서 사용)
= 반복이 한번 진행될때마다 안의 값은 하나씩 감소
= ECX>0
= ECX=5 == 5번 반복
*EDX
= EAX의 보조역할
= ex>64bit의 값을 EAX에 담을 시 상위 32bit는 EAX에 저장되고 하위 32bit는 EDX에 저장된다.
//EBP와 ESP는 stack과 연관
*EBP
=스텍 프레임의 기준점(고정)
*ESP
=스텍 프레임의 최상단(유동적)
*스텍은 높은 곳에서 낮은 곳으로 변수 생성(그림에서는 올라가고 있지만 실질적으로는 주소 감소)
//ESI 와 EDI는 주소와 연관
*ESI
=시작 주소 저장
*EDI
=도착 주소 저장
*EFALGS
=상태값 저장(0,1) -> 1:set , 0:clear
=종류 : AF,CF,OF,PF,SF,ZF
*AF,CF,OF
=>자리올림=1, 자리내림=0
*PF
=> 짝수=1, 홀수=0
*SF
=> 음수:1, 양수 :0
*ZF
=> 산술 연산 결과 저장
=> (산술연살 결과 = 0) == 1 , 나머지 == 0
*bit별 명칭 분류
EAX |
|
4byte(32bit) |
AX |
|
2byte(16bit) |
AH / AL |
|
1byte(8bit) | 1byte(8bit) |
*64bit 레지스터
=32bit 레지스터 앞에 'E'가 붙는데 이것을 'R'로 바꾸면 된다.
=ex> RAX,RCX,RDX
출처 == i2sec
'i2sec > Reverse Engineering' 카테고리의 다른 글
Day-02 어셈블리어 (0) | 2014.04.28 |
---|