본문 바로가기

어셈블

아이다(IDA)의 Debugging - IF문 분석 C언어로 if문을 컴파일한 것을 IDA로 분석해보자. #include void main() { int a = 3; int b = 5; if( a > b) { printf(" a 가 크다 "); } else { printf(" b 가 크다 "); } } IDA 그래프 기능으로 본 해당 소스의 흐름이다. 가운데 지점에서 빨간선과 초록선으로 분기하고 각각의 일을 실행한 후 하나로 합쳐지며 프로그램이 종료된다. .text:00411390 push ebp 에 breakpoint를 설정한다. 디버그 모드로 전환(F9)하여 분석을 해보겠다. 다음은 Main함수이다. .text:00411390 main proc near ; CODE XREF: j_mainj .text:00411390 .text:00411390 var_.. 더보기
아이다(IDA)의 Debugging - FOR문 분석 C언어로 for문을 컴파일한 것을 IDA로 분석해보자. #include int main(void) { int i = 0; int result = 0; for ( i ; i 더보기
아이다(IDA)의 Debugging - Stack 분석 IDA의 디버깅을 통한 스택의 Stack 분석 분석해볼 프로그램은 IDA의 사용법을 알아보기 위해 예제로 썻던 것을 계속 쓰겠다. 다시 한번 설명하면 func( ) 함수에 세 개의 값을 파라미터로 전달하고 그 값들의 합을 리턴하는 프로그램이다. #include func(int a, int b, int c) { return a+b+c; } int main(void) { int sum; sum = func(1, 2, 3); return sum; } 프로그램이 실행되기 전의 Stack이다. ESP, EBP의 위치를 살펴본다. .text:00401060 push ebp : EBP가 가리키는 곳이 SFP(Saved Frame Pointer)로 변하고, 그 윗부분이 RET로 바뀌며 스택에 EBP값 12FFC0h값을.. 더보기
아이다(IDA) 사용법 디스어셈블러 : 바이너리 파일을 역으로 어셈블리어로 재구성해주는 툴 IDA가 거의 독보적인 자리를 차지하고 있고, 기능도 다양하다. 아이다(IDA)의 장점 : 1. 거의 모든 CPU를 지원 2. FLIRT(Fast Library Identification and Recognition Technology)는 기계어의 코드로부터 컴파일러 특유의 Library 함수를 산출해낼 수 있는 강력한 기능 3. 각종 플러그인 지원 4. Obfuscation(난독화) 코드도 해석이 잘됨 IDA 설정 : IDA의 설정 파일은 ..\IDA\cfg 경로에 있으며 세부 설정을 할 수 있다. 단축키(idagui)를 재설정할 수 있고 disable된 설정을 enable시킬 수도 있다. 디스어셈블 상태와 디버깅 상태에서 특정 어셈블.. 더보기
스택과 콜링컨벤션의 이해 Function(1, 2)라고 선언이 된 함수가 사용된다면 push 2 push 1 call 004017E0 이와 같은 어셈블리 코드가 되는데, 파라미터는 뒤에서부터 push가 된다. 그 이유는 스택(stack)에 값을 순서대로 쌓아놓고, 나중에 쌓인 값을 우선으로 해 빼서 사용하기 때문이다. 일반적인 메모리 구조는 그림과 같다. 프로그램이 실행되기 위해서는 실행에 필요한 모든 것들이 메모리에 적재되어야만 한다. Text : 컴파일된 프로그램 소스가 기계어의 형태로 위치 Data : 프로그램에서 초기화된 데이터들의 위치 BSS : 초기화되지 않은 변수들의 위치. 항상 0으로 초기화됨 Stack : 지역변수, Command Line arguments 위치 Heap : 동적으로 할당된 변수들이 위치 Stac.. 더보기
상황별 기초 어셈블리어 어셈블리 명령어를 상황별로 어떻게 사용되는지 정리해보며 공부해보자. 1. 데이터 이동 : 어셈블리에서 데이터를 옮기고자 할때는 MOV 명령어를 사용한다. MOV [복사될 곳], [읽어들일 곳] MOV EAX, EBX의 경우 EBX 레지스터를 EAX에 대입한다. MOV EAX, [EBX]로 표현되어 있는 경우에는 EBX가 가리키는 값을 EAX에 대입한다. MOV EAX, [EBP+10]의 경우 EBP의 주소에서 20만큼 증가한 주소지의 값을 EAX에 대입한다 MOV EAX, [EBP-10]의 경우 EBP의 주소에서 20만큼 감소한 주소지의 값을 EAX에 대입한다 [EBP+10]과 [EBP-10]의 경우에 함수 내부에 존재하는 명령이었다면 EBP를 기준으로 10 증가된 경우에는 파라미터로 넘어오는 값일 수 .. 더보기
기초 어셈블리어. 데이터 타입 : 타입 설 명 BYTE 8bit 부호 없는 정수 SBYTE 8bit 부호 있는 정수 WORD 16bit 부호 없는 정수 SWORD 16bit 부호 있는 정수 DWORD 33bit 부호 없는 정수 SDWORD 32bit 부호 있는 정수 FWORD 48bit 정수 QWORD 64bit 정수 TBYTE 80비트 정수 피연산자(operand) 타입 : 피연산자 설 명 r8 8bit 범용 레지스터 r16 16bit 범용 레지스터 r32 32bit 범용 레지스터 Reg 임의의 범용 레지스터 Sreg 16bit 세그먼트 레지스터 imm 8, 16, 32bit 즉시값 imm8 8bit 즉시값 imm16 16bit 즉시값 imm32 32bit 즉시값 r/m8 8bt 범용 레지스터, 메모리 r/m16 16b.. 더보기