본문 바로가기

보안 공부/Reversing10

[리버싱] OllyDBG 단축키 모음 >> 단축키는 자신이 사용하기 나름이지만, 주로 ctrl+F2/ F7/ F8/ F9/ F2를 사용하였다. 2019. 11. 7.
[리버싱] 왜 스택은 높은 주소에서 낮은 주소로 채워질까? 사실 메모리 구조 부분을 리버싱 분류로 넣어야 할까 고민했지만, 스택 프레임을 조사하면서 힙과 스택의 비교하기 위해서 조사했기에 다른 공부를 할 때 더 조사하더라도 현재는 리버싱으로 분류해놓았다. 메모리 상에서 힙 영역, 스택 영역 : 힙과 스택 영역이 서로 반대로 데이터를 채워 나가기 때문에 서로의 영역을 침범할 수 있음 1) Stack Overflow : 스택이 힙 영역을 침범함 2) Hip Overflow : 힙이 스택 영역을 침범함 왜 스택은 높은 주소에서 낮은 주소로 채워질까? : 함수가 호출될 때 필요한 스택 메모리를 할당받는데, 이것은 함수 반환 후에 사용했던 해당 스택 메모리를 반환하여 전체적인 스택 메모리 상의 변경이 없어야 하기 때문이다. -> 결과적으로 제일 중요한 커널 영역을 침범하.. 2019. 11. 1.
[리버싱] 스택 프레임과 함수 프롤로그/에필로그 스택 메모리를 사용할 때 ESP, EBP, EIP 레지스터가 사용된다. 앞 전에 배웠던 레지스터들을 간단하게 정리하고 넘어가자. EIP 레지스터(Instruction Pointer) : 다음 실행할 명령어가 존재하는 메모리의 주소가 저장됨 EBP 레지스터(Base Pointer) : 하나의 스택 프레임의 시작 지점 주소가 저장됨 (Bottom) //새로운 함수가 호출되거나 실행 중이 함수가 종료되어 리턴될 때마다 값이 달라짐 ESP 레지스터(Stack Pointer) : 하나의 스택 프레임의 끝 지점 주소가 저장됨 (Top) //PUSH, POP명령에 따라서 ESP 값이 4byte씩 변함 -----------------------------------------------------------------.. 2019. 11. 1.
[리버싱] 리틀엔디안, 빅엔디안 CPU 종류마다 데이터를 메모리에 저장하는 방법이 다르다. 바이트 오더는 "리틀엔디안", "빅엔디안" 이 두가지 방식으로 저장하는데 여기서 엔디안이란? 컴퓨터의 메모리와 같은 1차원의 공간에 여러개의 연속된 대상을 배열하는 방법을 뜻한다. 먼저 바이트 오더를 말하기에 앞서 바이트를 알고가자. 1byte = 8bit이며, 1bit는 0과 1로 구성되어 있음을 알것이다. 1byte는 00000000으로 표현이 가능하고, 4byte인 정수를 표현하면 다음과 같다. 00000000 00000000 00000000 00000000 그럼 정수 1이 CPU마다 어떻게 저장되는가(리틀/빅 엔디안)을 예시를 보고 가도록 하자. 다음을 보면 알 것이다. 빅엔디안 : 00000000 00000000 00000000 0000.. 2019. 11. 1.
[리버싱] CMP와 TEST 명령어 차이 1) CMP - 형식 : CMP dest, src - 기능 : dest피연산자에서 src연산자를 묵시적으로 빼서 값을 비교한다. - 원칙 1) 뺀 값이 0일 경우 ZF가 1로 세트 되고, 다를 경우 0으로 세트 됨. 2) 처음 상태일 때는 NZ(Not Zero)로 ZF가 0이지만, 계산 값이 0일 경우 ZF가 1로 세트 되면서 NZ가 ZR로 변경됨. 3) 혼자 사용 X, 언제나 조건 점프 혹은 조건 이동 명령어와 함께 사용됨 2) TEST - 형식 : TEST opr1, opr2 - 기능 : 두 피연산자 사이에 논리적인 AND연산을 수행하여 ZERO 플래그에 영향을 주지만 결과값을 저장 X. - 원칙 1) OF, CF는 항상 0으로 세트 되고, 계산 값이 0일 경우.. 2019. 11. 1.
[리버싱] MOV와 LEA의 차이 MOV와 LEA의 차이 먼저 MOV와 LEA의 기능부터 알고 가보면 아래 내용과 같다. 1) MOV - 형식 : MOV dest, src - 기능 : src위치에 있는 데이터를 복사하여 dest위치에 저장 - 원칙 1) 메모리와 레지스터 사이의 데이터 이동. 2) 레지스터와 레지스터, 값을 레지스터나 메모리에 대입할 때 사용. 3) src와 dest의 크기가 같아야 함. 2) LEA - 형식 : LEA dest, src - 기능 : src오퍼랜드에서 지정된 주소를 dest로 로드 - 원칙 1) src의 오퍼랜드는 메모리에 위치해야 함. 2) mov와 비교하여 메모리 주소 표현 및 레지스터에 대한 직접적인 연산이 가능. 핵심은 제2연산자, 즉 src에 대한 추가 연산 방식이 다르다는 것이다. MOV AX,.. 2019. 9. 17.