세그먼트 레지스터 ! Windows / Linux 에서 각각 사용 용도가 다른 것 같음. 나중에 다시 자세히 정리.! 세그먼트 레지스터는 과거 286 ~ 80386 시스템에서 사용되었으며, 현재는 거의 사용되지 않음.! In Real mode(??) -> Boundary(기준값) + Offset(세그먼트 레지스터 - 메모리 주소 시작과의 차이)로 액세스함. 세그먼트란?세그먼트란, 프로그램에 정의된 특정 영역으로, 코드, 데이터, 그리고 스택으로 알려져 있는 것을 포함한다.한 세그먼트는 패러그래프 경계(paragraph boundary), 즉 16(hex 기준)으로 나누어지는 위치에서 시작한다.세그먼트는 메모리의 거의 어느 곳이나 위치할 수 있고, 실제 모드에서 최대64kb(in x86)의 크기를 가질 수..
함수 호출 규약 _ 기본적인 함수 호출 + 간단한 스택 사용어셈블리에서의 기본적인 함수 호출 규약 예제 Caller Function int main(int argc, char* argv[]) { sum(1, 2); return 0; } .text:080483F8 public main .text:080483F8 main proc near .text:080483F8 .text:080483F8 argc = dword ptr 8 .text:080483F8 argv = dword ptr 0Ch .text:080483F8 envp = dword ptr 10h .text:080483F8 .text:080483F8 000 push ebp .text:080483F9 004 mov ebp, esp .text:080483F..
** 번역한 내용이 대부분임. 문서 하단에 출처 참조함. 명령어 - 데이터 이동 / 산술 및 논리 연산기계어는 주로 3가지 목표를 가진다. 1. 데이터 이동 / 2. 알고리즘, 로직 / 3. 프로그램 흐름 제어여기에서는, x86 시스템에서의 중요한 명령어를 예시를 들어 설명합니다.단, 여기서 나타내는 예제들은 완전한 x86 명령어들은 아니지만, 보편적으로 유용한 부분을 가지고 있습니다. 완벽한 예제들을 보려면, Intel에서 제공하는 명령어 예제들을 참고하면 됩니다. # 기호 표시 Any 32-bit register (EAX, EBX, ECX, EDX, ESI, EDI, ESP, or EBP)Any 16-bit register (AX, BX, CX, or DX)Any 8-bit register (AH, ..
1. 바이트 순서 _ Little Endian 과 Big Endian 엔디안이란? (일부 출처)컴퓨터의 메모리와 같은 1차워느이 공간에 여러 개의 연속된 대상을 배열하는 방법. 이 때,바이트를 배열하는 방법을 바이트 순서(Byte order)라 한다. 빅 엔디안은 최상위 바이트(MSB - Most Signficant Byte) 부터 차례로 저장하며,리틀 엔디안은 최 하위 바이트(LSB - Last Significant Byte) 부터 차례로 저장한다. 예를 들어, 메모리에 데이터를 저장한다고 가정해 보자. Double Word (4바이트) 형식의 데이터 0x 12 34 56 78을 메모리 주소 0x 00 00 01 00 에 넣는다.이 때, Big endian 과 Little endian의 데이터를 넣는 ..
메모리, 주소 접근 모드 1. 전역, 정적 변수 선언우리는 x86 어셈블리에서 전역 변수와 비슷한 static 변수 지역을 특별한 어셈블러 명령을 이용해서 선언할 수 있으며,이는 반드시 .DATA 세그먼트에 선언되어야 한다. (세그먼트와 관련된 내용은 추후 추가 예정) 생성할 수 있는 메모리의 크기로는 1, 2, 4bytes 이다.* signed / unsigned : 최상위 비트를 부호 연산으로 사용하는지의 유무DB - Byte : 1바이트 > -127 ~ 127(signed), 0~254(unsigned), ASCII CharacterDW - Word : 2바이트 > -32767 ~ 32767(signed), 0~65534(unsigned)DD - Double Word : 4바이트 > word*wor..
1. 어셈블리 언어의 정의 (출처 : 위키백과)어셈블리 언어란, 기계어와 일대일 대응이 되는 컴퓨터 프로그래밍의 저급 언어이다.컴퓨터 구조에 따라 사용하는 기계어가 달라지게 되며(ARM, MIPS), 이에 따라 기계어에 대응되어 만들어지는 어셈블리어도 각각 다르게 된다. 어셈블러는 니모닉 기호(mnemonics -> ex> ADD eax, 1 에서의 ADD와 같은, 사람이 보기 쉽게 만든 언어를 말한다.)를 opcode(Operation Code -> 기계어의 일부로, 수행할 명령어를 나타내는 부호를 말함.) 로 변환하고, 메모리 위치와 기타 존재물에 따라 식별자를 다시 분석함으로써, 목적 코드(실행될 수 있는 기계어 코드) 를 만들어낸다. 2. 레지스터 (범용)x86 기반 CPU는 8개의 범용 레지스터..
어쩌다가 발견한 거라 남겨 둠. 다음은 http://reversing.kr 에서 출제한 Easy_CrackMe 파일의 어셈블리 코드 중 일부이다. 1. Ollydbg 2. IDA 먼저 올리디버거 에서는 일반적으로 표시하듯이 ESP + n 형태로 메모리 주소를 가리키고 있는데, IDA 에서는 ESP + 현재 스택 포인터 + var_? 형태로 표시하고 있다. 언뜻 보기에 왜 저렇게 표시했을까 싶은데, IDA 에서 자동으로 스택의 사용을 조사해서 지역 변수를 찾아내는데 용이하게 만든 것이다.IDA의 디스어셈블러 화면 시작 부분을 보면 이렇게 var_? 형태로 특정 값이 설정되어 있는데, 이는 함수 시작 시EBP 의 주소를 기준으로 스택 상에 변수가 위치하는 오프셋 값이다. String, var_63, var_..
IDA 6.8 버전 기준. 들어가기 전에...IDA란? Interactive DisAssembler 의 약자로, 강력한 바이너리 정적 분석 기능을 가진 툴이라 할 수 있다.특히 같이 설치되는 Hexray Decompiler 는 왠만한 ASM 코드를 가상 C언어 Pseudocode로 변환하고, 이를 기반으로 디버깅 할 수 있는 점이 큰 장점으로 꼽히고 있으며, C++, Python을 기반으로 하는 다양한 플러그인을 제작해 사용할 수 있다.이 외에도 찾아보면 다양한 장점이 존재한다. - 셋팅 1. 플러그인 설치먼저, 초기 설치 시 같이 설치되는 IDAPython을 설치하지 않았다면, 과감하게 전체 삭제 후 다시 설치하자.물론 수동으로 나중에 따로 설치해도 되겠지만 이거 은근히 귀찮고 잘 안된다. 플러그인은 ..
풀 업, 풀 다운 저항이란1. 플로팅 상태 (Floating) 디지털 회로에서, IC나 모듈과 같은 칩에 정보를 입력할 때 5V(High - H) 또는 0V(Low - L) 전압을 가한다. 이 때, 입력 핀에는 "반드시" H 또는 L 의 전압 신호가 들어와야 하는데(Low값의 전압이 0V라고 해서 전기 신호를 아예 보내지 않는 것이 아니다!), 입력 핀에 아무런 전압도 입력이 안 되는 상태가 되면 칩이 오작동하게 되는데, 이러한 칩의 상태를 플로팅 되었다고 한다. 즉, 칩의 정보 입력 단자에 아무것도 연결이 되어 있지 않거나, 서로 절연되어 있을 때 칩에서 핀의 입력 값을 알 수 없는 상태가 되어 오작동하게 되는 플로팅 현상을 막기 위해 고안된 것이 바로 풀 업, 풀 다운 저항이다. 2. 풀 업(Pull..
임베디드(임베디드 시스템)의 정의와 개요"임베디드"는 사전적으로 "내장된" 이라는 의미를 가지고 있다. 즉, "임베디드 시스템"이라는 용어를 정의할 때 "내장된" 이라는 의미를 가진다는 것이다.먼저 "임베디드 시스템"을 어떠한 시스템에 내장된 시스템이라고 할 수 있겠고, 또 어떤 하드웨어와, 이 하드웨어를 제어할 때 필요한 소프트웨어가 내장된 시스템을 지칭하는 용어라고도 할 수 있겠다. 집집마다 사용하는 공유기를 예로 들어 보자. A라는 회사는 공유기를 만들기 위해, 먼저 하드웨어를 구성했다. PCB판을 구하고, 그 위에 회로를 구성한다. 연산장치인 CPU, 네트워크 모듈과 기타 부품들을 납땜하는 식으로. 하지만 하드웨어만으로는 공유기를 만들 수 없다. 네트워크 모듈을 제어하는 알고리즘(소프트웨어)을 R..