반응형

PC리버싱 134

세그먼트레지스터

세그먼트 레지스터(segment register)는 현재 세그먼트라고 하는 메모리의 한 영역에 대한 주소지정을 제공한다. PC 계열에서 사용되고 있는 인텔 프로세서들은 자신의 주소지정 능력을 제공한다. CS,DS,SS,ES,FS,GS등이있다 CS레지스터 CS레지스터는 프로그램의 코드 세그먼트의 시작 주소를 포함한다. 이 세그먼트 주소에 명령어 포인터(instruction pointer, IP) 레지스터의 오프셋 값을 더하면, 실행하기 위해 메모리로부터 가져와야 할 명령어의 주소가 된다. 일반적인 프로그래밍에서는 이 레지스터를 직접 참조할 필요가 없다. DS레지스터 DS 레지스터는 프로그램의 데이터 세그먼트의 시작 주소를 포함함다. 명령어는 이 주소를 사용하여 테이터의 위치를 알아낸다. 이 주소에 명령어의..

범용레지스터 추가설명

추가적으로 더알아야할게있다 기본적으로 ax라는 16비트 상위레지스터 안에 하위레지스터인 AH AL이있다 외우는법은간단하다 H가 HIGH L이 LOW다 eax에서 ax는 0000???? 영역이다 ?가 ax범위 eax값이 0000FF12이다 범위는 마지막두자리다 이명령으로eax값 00002412 총정리 eax안에 는 ax라는 16bit레지스터가있고 그안에는 h는 high l은 low로 eax경우ah al 으로 두개로 나누어진다

리버스 엔지니어링,리버싱 정리2

이제 1편을 보았다면리버싱이 어떤것인지 알수있을것이다 이제 레지스터를 알아볼것이다일단적으로 범용레지스터 8개를 간단하게 이해시킬수있게노력해보겠다범용레지스터 8개의 용도는 나는 값을 저장 연산등으로정의해그것들을 그릇에 비유하겠다 그릇안에 값예시 12345678이라는 값이 있는 그릇이라고 나는범용레지스터의 용도를 정의한다그릇 끼리 같이 합쳐서 두배가될수도있고 적어질수도있고그런 연산작용을 한다이제 레지스터 8개의 각각 용도를 간단하게 알아보자 EAXEAX 연산할때 그값을 저장하는용도고 이걸 조금더자세히설명하면산술 연산을하며, 리턴값을 전달한다이게 제일 잘정리된 정의인것같다이런걸 알수있는 힌트가있다A 는 Accumulator로 계산이라는뜻을 지녔다EAX (Extended Accumulator Register) ..

리버스 엔지니어링,리버싱 정리1

리버싱에 대해서 정리해보자 기초적으로 어셈블리어와 기계어에대해서 간단한 역사를 알아보자 오래전 기계들은 0과1로 이루어진 예시 011010101 이런 명령을 사용헀다 이걸 효율적인 코딩을하기위해 거기서 한단계더 편한 어셈블리어가 나왔다 mov eax,100 add eax,100 sub eax,100 간단하게 eax의 변화로 이 말을해석하자면 eax에 100이라는 숫자를 입력했고 add 명령으로 100이라는 숫자가 더해 200이되었다 sub 명령으로 100이라는 숫자를 뺴서 100이다 이렇게 간단하게 볼수있다 이러한 리버싱을 통해 어떻게 코드가 짜여있는지알수있고 어떤 API 어떤구조인지도 알수있다 API 같은이야기등 모르는게있다면 구글에 한번쳐보는걸 추천한다 리버싱은 이렇게 정리하자 어셈블리어를 이용하여 ..

진짜 간단한 리버싱의 기초

리버싱은 사실상이렇다 책이있다 그책안에 내용을이해하는것이다 물론 그책은 우리가 읽지않은책이다 그책을 읽기위해 우리는 문자를 읽을수있었야한다 책안에 내용들은 여러용도들로 나누어서 분해되어서 내용이 저장되있고 서로 서로 맞물려서 작동한다 이제 옆에있는 책안에 글자를읽을수있다 하지만그책은 그림책이었다 그림도 함꼐읽을수있다 그림은 책에 내용을 더쉽고 어떻게진행되는지 알려준다 총정리하자면 리버싱은 책읽는것와 비슷하다 하지만 그책안에 문자들은 각각규칙있고 우리가 최소한그규칙을 알면 읽기편하다 그림들로 스토리의구성을 알수있다 문자들로 그안에 내용을 저장해서 보여줄수있다

오버플로우레지스터에대하여

오버플로우 플래그가 on 되는 바이너리/정수 연산도 두개다 : 1. 두 수의 합으로 부호 비트가 on 되었을때, "오버플러우" 플래그가 on된다. 0100 + 0100 = 1000 (overflow flag is turned on) 2. 두 수의 합으로 부호 비트가 off 되었을때, "오버플로우" 플래그가 on 된다. 1000 + 1000 = 0000 (overflow flag is turned on) 다른 경우, 오버플로우 플래그는 off 됨. * 0100 + 0001 = 0101 (overflow flag is turned off) * 0110 + 1001 = 1111 (overflow flag is turned off) * 1000 + 0001 = 1001 (overflow flag is turne..

플래그(상태) 레지스터

플래그 기호이름의미 Z 제로 플래그 연산 결과가 0일 경우에 참이 된다. C 캐리 플래그 부호 없는 숫자의 연산 결과가 비트 범위를 넘어섰을 때 참이 된다. A 보조 캐리 플래그 연산 결과 하위 니블(4bits)에서 비트 범위를 넘어섰을 때 참이 된다. 이진화 십진법(BCD) 연산에 사용된다. V / O / W 오버플로 플래그 부호 있는 숫자의 연산 결과가 비트 범위를 넘어섰을 때 참이 된다. N / S 네거티브 플래그, 사인 플래그 연산 결과가 음수일 때 참이 된다. I / E 인터럽트 플래그 이 플래그가 참일 경우에만 인터럽트 요구를 받아들인다. 일반적으로 관리자 모드에서만 값을 변경 할 수 있다. P 패리티 플래그 연산 결과에서 1로된 비트의 수가 짝수일 경우 참이 된다. D 디렉션 플래그 문자열 ..

레지스터

레지스터는 다시 목적에 따라서 범용 레지스터, 세그먼트 레지스터, 플래그 레지스터, 인스트럭션 포인터로 구성된다. 범용 레지스터는 논리 연산, 수리 연산에 사용되는 피연산자, 주소를 계산하는데 사용되는 피연산자, 그리고 메모리 포인터가 저장되는 레지스터 세그먼트 레지스터는 code segment, data segment, stack segment 를 가리키는 주소가 들어있는 레지스터 플래그 레지스터는 프로그램의 현재 상태나 조건 등을 검사하는데 사용되는 플래그들이 있는 레지스터이다. 인스트럭셕 포인터는 다음에 수행해야 하는 명령이 있는 메모리 상에 주소가 들어가 있는 레지스터 이다. 위 의 그림은 일반적 시스템의 프로그램 레지스터 구성이다. 위의 그림은 범용 레지스터의 구성이다. 그림을 보면 알겠지만 전..

세그먼트 레지스터

어셈블리 코드를 보다보면 DS:[EAX], SS:DWORD PTR[EBP-4] 뭐 대강 이런식으로 DS:, CS:, SS: 이런 부분들을 자주 볼수있다. 이것들의 정체는 세그먼트 레지스터로 16비트인데 페이징이 없던시절, 메모리 영역 관리/분리 등을 위해서 사용되었다. 먼저 real mode 상에서는 주소지정이 세그먼트:오프셋 방식으로 이루어진다. 이 말은, CS:0x1234 이런식으로 메모리 주소가 표현된다는 것인데 여기서 세그먼트 레지스터는 16비트이므로 65536 개의 세그먼트 영역이 존재할 수 있다. 한 세그먼트는 16바이트(4비트공간)의 크기를 갖는다. 즉 CS 가 0xAAAA 라면 선형주소에 더해지는 값은 0xAAAA0 이 된다. 뭔가 계산이 깔끔하지않고 더럽지만 아무튼 이렇다. 세그먼트값을 ..

반응형