리버싱 정리

Tamszero·2024년 11월 7일

이비전

목록 보기
8/12

리버싱이란?

: 프로그램의 소스구조를 역으로 파악하는 것

고급언어가 기계어로 번역되는 과정

  1. 전처리
    : 컴파일러가 소스코드를 어셈블리어로 컴파일 하기 전에 필요한 형식으로 가공하는 과정
  2. 컴파일
    : C로 작성된 소스코드를 어셈블리어로 번역하는 과정
  3. 어셈블
    : 컴파일로 생성된 어셈블리어 코드를 ELF형식의 Object file로 변환하는 과정
    오브젝트 파일로 변환이 되면 어셈블리코드가 기계어로 번역된다
    Gcc에서 -c 옵션을 통해 목적파일로 변환이 가능
  4. 링크
    : 여러 목적 파일들을 연결하여 바이너리로 만드는 과정. 링크를 하면 실행가능한 프로그램이 완성
  5. EXE파일

역분석은 이 반대 과정을 수행한다

컴퓨터 구조

  • 컴퓨터가 효율적으로 작동하도록 하드웨어 및 소프트웨어의 기능을 고안하고 이들을 구성
  • X86-64 및 x64의 아키텍쳐 : 레지스터
    1. 범용 레지스터 : eax, ebx, ecx, edx
    1. 세그먼트 레지스터
    2. 명령어 포인터 레지스터
    3. 플래그 레지스터

범용 레지스터

  • eax : 곱셈과 나눗셈 명령에 사용, 함수의 리턴값이 저장
  • ebx : ESI나 EDI와 결합하여 인덱스에 사용
  • ecx : 반복 명령어에서 카운터로 사용된다
  • edx : 부호 확장 명령
  • esp : stack point
  • ESI : 데이터를 조작하거나, 복사시에 소스 데이터의 주소가 저장
  • EDI : 복사시에 목적지의 주소가 저장

세그먼트 레지스터

  • 6가지의 세그먼트 레지스터 : CS, DS, ES, FS, GS
  • 각 레지스터의 크기는 16비트

명령어 포인터 레지스터

  • CPU가 어느 부분의 코드를 실행하는지 가리킨다
  • X64에서는 rip

플래그 레지스터

  • 프로세서의 현재 상태를 저장하고 있는 레지스터
  • CF : carry flag 부호 없는 수의 연산결과가 비트의 범위를 넘을 경우 설정됨
  • ZF : zerro flag 연산의 결과가 0일 경우 1로 설정
  • SF : sign flag 연산의 결과가 음수일 경우 설정
  • OF : overflow flag 부호있는 수의 연산 결과가 비트 범위를 넘을 경우 설정됨

모든 변수들은 같은 메모리 공간을 사용한다

  • AX에 E21F를 대입하면?
    : AH에 E2가 AL에 1F가 저장된다
  • EAX에 1234 0000을 대입하고 그 후에 AL에 12를 대입하면?
    : AH에 1234, AL에 0000이 들어가고 AL에 다시 12가 들어가니 AL에는 최종적으로 0012가 저장

어셈블리어 구조

어셈블리어 명령어 정리


출처: https://aistories.tistory.com/12

*AX의 값은 얼마?

1. THIS로 점프한다
2. AX에 1을 대입
3. FUNC을 호출
4. AX에 2를 대입
5. 리턴
6. AX와 2를 비교 -> AX - 2 = 0 이므로 ZF는 1

0개의 댓글