본문 바로가기

Hacking & Security/Reverse Engineering

(7)
ASPACK unpacking 문제를 풀다가 Aspack을 처음 접해서 해당 공부 내용을 남기고자 블로깅을 진행한다. 0x00. Packer 패커란 실행 파일 압축기를 의미한다, 정확한 명칭은 Run_Time Packer다. '실행 압축'이란 실행 파일에 실행 코드를 원본 형태로 두지 않고 압축을 진행한 것을 의미한다. 또한 압축해제 코드를 실행 파일에 같이 넣어놓은것이다. 따라서 프로그램이 실행될 대 먼저 압축해제 코드가 진행되서 원본 실행코드 압축이 풀리고 실행이되어진다. 0x01. 패커 사용 목적 패커의 사용목적은 크게 두가지로 나뉜다. 첫번째 사용목적은 실행 파일의 크기를 압축하여 줄이고자 하는 목적 두번쨰 사용목적은 PE 파일 내부의 코드, 소스 등을 감추기 위한 목적이다. 0x02. 언패킹 EXEINFO와 같은 툴을 통해 ..
Stolen Bytes Stolen Bytes Stolen Bytes란 훔쳐진 바이트란 의미로 프로그램의 한 부분의 코드를 훔쳐내어 다른 부분으로 옮겨진 코드를 의미한다. 주로 옮겨지는 코드는 EP 위 몇개의 코드들이며 옮겨진 코드들은 OEP주소로 점프하기 전 위치에서 PUSH되어진다. 이부분의 명령어들은 이동된 곳 또는 할당받은 메모리 공간에서 실행되어진다. 만일, 보호된 프로세스의 메모리가 덤프 되었을 때 Stolen bytes를 복구하지 못한다면 덤프된 실행파일은 정상적으로 작동하지 않는다. POPAD와 jmp OEP 사이에 연속되어진 PUSH부분을 Stolen Bytes라고 한다. PUSHAD PUSHAD는 모든 Register를 Stack에 적재(push)하는 명령어이다. POPAD POPAD는 Stack에 백업되어있..
x86 그리고 x64 0x00. 개요 윈도우즈 PC에는서 프로그램등을 다운받을때 x86, x64버전이 표시되었던 것을 본적이 있을것이다. 두 버전 중 한 가지를 꼭 선택해야만 다음 단계로 넘어갈 수 있기에 의무적으로 하나는 선택을 해야했다. 과연이 두 버전에는 어떠한 차이가 있으며 무엇을 선택하는게 옳을까? 0x01. 32bit & 64bit 어떠한 것을 고를지 선택하기 위해서는 bit의 개념을 알아야 한다. bit란 Binary Digit의 약자이며 CPU가 처리하는 데이터의 최소단위의 크기가 몇 bit인지 에서 나온 단어로 숫자 0과 1 두 수 만으로 이루어진 숫자열을 의미한다. 여기서 왜 0과 1 두 수만 이용하는지에 대한 의문이 들 수 있다. 컴퓨터는 모든 데이터를 0과 1 을 이용한 이진법으로만 처리하기 때문이다. ..
#1. Reverse Engineering 리버싱 기초 낙서장. 어셈블리어 : CPU가 이해하는 기계어와 1:1 매칭되는 low level 언어. CPU 아키텍처마다 어셈블리어가 다르다. -> 즉 , 많은 어셈블리어가 존재한다.기호로 이루어져 있어서 되게 직관적이다 상용되어지는 문법은 2개이다. ( Intel , AT&T )일반저인 형태 : 명령 operand1 , operand2(operand : 연산의 대상으로 레지스터나 숫자 등이 올 수 있다. ) ex1) AT&T) mov $0x1, %eaxex2) Intel) mov eax, 0x1 이번글에서는 Intel 문법을 이용하겠다. 레지스터 : 값을 담아놓는 공간 ( = 다기능변수 ) , CPU에 존재하며 여러가지 레지스터가 존재한다. 범용 레지스터 ( x86 기준)eax : accumulato..
Reverse Engineering 2 EP 디버거가 멈춘 곳은 EP (Entry Point ) 코드로 , HelloWorld.exe의 실행 시작 주소다. 위에서 EP는 4011A0 입니다. 일단 EP 코드에서 눈에 띄는 건 CALL 명령과 그 밑의 JMP 명령이다. 코드윈도우가 총 4가지 칸으로 나눠져있음을 확인할수 있다. 순서대로 Address , Instruction , Disassembled code , comment 이다.Address 프로세스의 가상 메모리 내의 주소 Instruction IA32 (또는 x86) CPU 명령어 Disassembled code OP code를 보기 쉽게 어셈블리 코드로 변환한 코드 comment 디버거에 추가한 주석 EP부분을 해석해보면 " 0040270C 함수를 호출(Call) 한 후 , 00401..
Reverse Engineering (이 글은 나뭇잎을 참고했습니다 . ) 리버스 엔지니어링 ( 역공학 ) 일반적인 의미에서 리버스 엔지니어링 ( Reverse Engineering ) 이라고 하며 기계장치 혹은 시스템의 구조 , 기능 , 동작등을 분석하고 그 원리를 이해하며 단점을 보완하고 새로운 아이디어를 추가하는 일련의 작업이다. 리버싱에는 크게 두가지 분석방법이있다. 1 ) 정적 분석파일의 겉모습을 관찰하여 분석하는 방법으로 정적 분석 단계에서는 파일을 실행하지 않는다. 파일의 종류( EXE , DLL , DOC , ZIP 등 ) , 크기 , 헤더 ( PE )정보 , 내부문자열 , 디버깅 정보등 다양한 내용을 확인하는것이다. 또한 디스어셈블러를 이용하여 내부 코드와 그 구조를 확인하는 것 또한 정적분석의 범주에 들어갈 수 있다. 이..
디버깅 단축키 , 기본 어셈블리어 출발지점 EP(Entry Point) 단축키 ctrl + F2 : 재시작F7 : 명령어를 한줄 한줄 실행하되 안으로 들어감F8 : 명령어를 한줄 한줄 실행하되 자세히 안봄 Ctrl + G : 원하는 주소로 이동; : 주석을 달수 있음F2 : 브레이크 포인트 설정F9 : 브레이크 포인트 까지 실행 * : 나의 위치를 알 수 있음엔터 : 안을 자세히 들어가 볼 수 있다.( F7은 안에 들어가서 실행하는건데 enter는 안을 들여다 보기만 함 ) 마우스 우클릭 > search for > all ref text strings // 모든 문자열을 볼 수 있음. 마우스 우클릭 > search for > all intermodule calls //모든 함수를 볼 수 있음.Ctrl + E : 덤프창 내용 수정시 사용 ..