ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 소프트웨어 역공학 시험 정리
    여러가지 공부 2022. 4. 19. 11:43

    컴퓨터 아키텍처 구조

    - 입력 -> 처리 -> 저장 -> 출력

    처리 -> 저장

    - 저장소 (C,D) >> 메모리 로드 >> 프로그램에 CPU 할당 처리 >> 메모리 >> 저장소에 저장

     

    CPU (중앙 처리 장치): 명령어를 해석하여 데이터를 연산/처리하는 장치, 빠른 연산을 처리하기 위해 사용되는 공간

    레지스터: CPU에서 연산에 사용하는 데이터를 기억하는 소규모 기억 장치

    캐시: 메모리 모르 시간을 줄이기 위한 임시 기억 장치

    CISC (복합 명령어 집합 구조)

    RISC (축약 명령어 집합 구조)

     

    메모리: 실행될 프로그램과 데이터가 잠시 머무는 장소// 모든 프로그램이 실행되려면 반드시 메모리를 거쳐야 함

    -> 메모리의 반은 운영체제에 사용되는 것이므로 사용자의 접근을 막고 반 정도는 사용을 하지 못한다

    -> 메모리 영역은 사용자 영역과 커널 영역을 분리가 된다

     

    운영체제: 하드웨어 적인 자원을 관리, 응용 서비스를 제공

     

    프로그램 제작 과정: 비주얼 스튜디오 실행 -> 코드 작성 -> 빌드 -> 완성

    빌드: 전처리 -> 컴파일 -> 어셈블리 -> 링크 -> 로드

    소스코드 파일을 실행 가능한 소프트웨어 형태로 가공

     

    리버싱: 빌드 과정을 거꾸로 뒤집는 것

    - 실행 파일에서 오브젝트를 화인 어셈블리 코드를 가지고 원본 소스 코드를 만들어 내는 것

     

    스택: 함수 호출시 생성되는 지역변수와 매개변수가 저장되는 영역, 프로그램 복귀 주소 (프로그램 실행 중에 다른 프로그램이 실행이 되고 끝나면 다시 올라올 주소가 저장이 됨)

    BP (스택의 시작 지점) // SP (스택의 최대 크기)

    - 실행중 일시 메모리 크기 변경이 불가함

    - 높은 주소에서 낮은 주소

    - LIFO (가장 처음에 들어간 데이터가 제일 나중에 나옴)

     

    힙: 동적으로 메모리를 할당하는 영역 // 완벽한 크기를 계산할 수 없기 때문에 사용

    - 메모리 스택 부분에 힙이 시작되는 포인트를 지정

    - 낮은 주소에서 높은 주소

     

    레지스터 (Register)란? 변수는 변수인데, CPU가 사용하는 변수

    - eax: 연산의 결과들이 저장 // 32bit (eax) -> 16bit(ax) -> 8bit(ah/al)

    - ebx: 메모리 주소들을 저장하기 위한 용도 // 32bit(ebx) -> 16bit(bx) -> 8bit(bh, bl)

    - ecx: for, while 반복 명령어 카운터로 사용 // 32bit(ecx) -> 16bit(cx) -> 8bit (ch, cl)

    - edx: eax와 같이 사용되며 연산의 결과나 높은 연산 또는 부호확장 // 32bit(edx) -> 16bit(dx) -> 8bit(dh, dl)

    - esi: 데이터를 조작하거나 복사할 때 데이터의 주소가 저장

    - edi: 목적지의 주소가 저장

    - esp: 스택의 끝 지점을 나타냄

    - ebp: 스택의 첫 시작 주소 베이스 포인트

    - eip: 다음의 실행할 명령어의 주소를 나타냄

    - eflags: 숫자의 부호를 저장

     

    =================================실습================================

     

    exam1.asm

    PUSH: 스택에 데이터를 삽입

    POP: 스택에서 데이터를 꺼냄

     

    exam1.asm PUSH&POP

     

    GDB로 디버깅

    push 0x10 push 0x12345678을 이용해서 레지스터에 값을 입력

    - 0x12345678 0x10 순으로 저장이 됨

    pop eax >> 0x12345678을 먼저 꺼냄

    pop ebx >> 0x10이 나옴

     

    exam1-1.asm

    MOV: 데이터 복사를 담당하는 명령어

    - 레지스터 -> 레지스터

    - 메모리 <-> 레지스터

    - Immediate 값 -> 레지스터 또는 메모리

    exam1-1.asm MOV

    mov eax, ebx -> ebx의 값을 eax에 저장
    mov ebx, 0xbffff098 -> 0xbffff098이란 값을 ebx에 저장
    mov dword [ebx], 0x10 -> 0xbffff098곳에 0x10을 저장
    mov ebx, eax -> ebx 값인 0x0을 ebx에 저장 

    Segmentation Fault

    - 프로그램이 허용되지 않는 메모리 영역에 접근을 시도하거나, 잘못된 방법으로 메모리 영역에 접근을 시도할 경우 발생

    - 내 영역을 넘어가 버렸다는 것은...

           -프로그래머가 생각하지 못한 사용자 입력 값이 있었다....

           -> 그냥 프로그램을 잘못 짰다

     

    exam2.asm

    SUB: 빼기

    exam2.asm SUB

    mov eax, esp -> eax에 esp 값을 넣어줌
    sub esp, 8 -> esp에 값에 8을 빼서 esp에 저장
    mov [eax], dword 1 -> eax값이 가르키는 주소에 1을 저장
    mov [eax-4], dword 2 -> eax에 4를 뺀 곳에 2를 저장
    sub [eax-4], dword 1 -> eax에 4를 뺀 곳에 1을 빼서 저장 >> 0x1이 저장

     

    exam2-1.asm

    ADD: 더하기

    exam2-1.asm ADD

    mov eax, esp -> esp의 값을 eax에 저장 
    add esp, 8 -> esp의 값에 8을 더함 
    mov [eax], dword 1 -> eax의 값이 가르키는 주소에 1을 저장
    mov [eax+4], dword 2 -> eax+4가 값이 가리키는 곳에  2 저장
    add [eax+4], dword 1 -> eax+4가 값이 가르키는 곳에 1을 더함

     

    exam3.asm

    LEA: 복사 (Load Effective Address - 유호 주소 로드)

    * MOV와 무엇이 다른가?

    - mov eax, [ebp+esp+4] -> ebp+esp+4의 값이 가리키는 곳의 갑을 eax에 저장
    - lea eax, [ebp+esp+4]  -> ebp+esp+4의 값이 eax에 저장이 됨

     

    exam3.asm MOV & LEA

    mov eax, 1
    mov ebx, 4
    mov ecx, 7
    lea eax, [eax+ecx] -> 1+7의 값 0x8이 그냥 그 상태 그대로 나와서 eax에 저장
    lea ebx, [ebx*4] -> 0x4 * 4를 한 값 16=0x1이 ebx에 저장이 됨
    mov eax, [eax+ecx] -> eax+ecx 의 값 0x15가 가리키는 값이 eax에 저장이 됨

     

    exam4.asm

    AND, OR, XOR

    - AND: 두 비트가 모두 1일 때만 1

    - OR: 두 비트 중 하나라도 1 이면 1

    - XOR: 두 비트가 다를 때 만 1

     

    exam4.asm AND, OR, XOR

    mov eax, 0x33
    mov ebx, 0x55
    mov ecx, 0x42
    and eax, ebx -> 0x33을 이진수 코드로 바꾸고 0x55도 이진수 코드로 바꾸어 and 연산 (둘 다 참일 때
    참을 해주면 된다) eax =0x17
    or eax, ecx -> 0x17과 0x42 를 이진수 코드로 바꾸고 or 연산을 해주면 된다 ( 하나라도 참이면 참 둘 다
    참이여도 참 ) eax = 0x53
    xor eax, 0xac -> 0x53과 0xac를 인진수 코르도 바꾸고 xor 연산 ( 참과 거짓이 둘 다 있어야 참 )
    eax는 0xff가 된다

     

    exam5.asm

    - CMP : 비교 명령어로 두 값을 비교하는 방식이 아닌 뺄셈이다
    cmp a, b  == a-b  // ( +, a가 크다), ( 0, 둘이 같다 ), ( -, a가 작다) >> 를 이용해 값을 비교
    이 것을 확인하는 방법이 eflas의 것이다

    EFLAGS:  cf ( 덧셈, 뺄셈 사용 시에 올림수나 내림수 사용 시 )
    zf ( 결과가 0이면 나옴 )
    sf ( 연산의 결과가 음수 '-'이면 나옴 )
    -> 를 통해 값을 비교할 수 있다.

    - TEST: 0인지 아닌지 확인을 하는 명령어, 프로그램을 확인을 위한 명령어

     

    exam5.asm CMP & TEST

    mov eax, 2 
    cmp eax, 2 -> eflags에 zf 확인 둘이 같음 
    cmp eax, 1 -> eflags에 zf, sf 둘 다 없다는 걸 확인 eax가 더 큼
    cmp eax, 3 -> eflags에 sf, cf 확인 3이 더 크다는 것 확인
    test eax, eax -> eax가 0인지 확인 X
    mov eax, 0 -> eax 값을 0으로 변환
    test eax, eax -> eflags에 zf 확인 eax가 0인 것을 확인

     

    exam6.asm

    - INC : 해당 레지스터에 1을 상승 시키는 값
    inc eax > eax=0 >> eax=0x1
    - JMP: 무조건 점프문 
    해당 명령문을 쓰면 eip 다음 명령어 주소가 점프하는 곳으로 잡혀 있음
    - JCC: 조건 점프문 
    jne ( jump not equal ) 조건과 같지 않을 시 점프
    je ( jump equal ) 조건과 같을시 점프 
    jle ( jump less equal ) 조건과 같거나 작거나 시 점프

     

    exam6.asm INC & JMP & JCC

    mov ecx, 0
    mov eax, ecx
    inc ecx -> ecx를 1 올려서 0x1로 만들었다
    cmp ecx, 255 -> 0x1인 ecx와 0xff를 비교해서 eflags에 sf와 cf가 나와 ecx는 255보다 작다는 걸
    알 수 있다
    jne 0x8048067  -> 같지 않으므로 0x8048067로 이동해서 이 것이 무엇인지 묻는 걸 확인을 함
    ret > 종료가 된다 

     

     

Designed by Tistory.