ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 리버싱 메모장
    리버싱/리버싱스러운것 2023. 5. 8. 13:03

    기계어: 컴퓨터에게 명령 내릴려고 만든거, 0과 1로 구성

    어셈블리어: 기계어가 사람이 보기 어려워서 어셈블리어를 만듬, 그리고 이를 기계어로 바꿔주는 어셈블러 개발

    어셈블리어보다 더 쉬운 언어들(C, C++등)을 만들고 이를 기계어로 바꿔주는 컴파일러 개발

    이러한 사람이 이해하기 쉬운 언어들을 고급언어라고 함, 기계어나 어셈블리어는 저급언어

    컴파일러 : 소스코드를 어셈블리어로 바꿔줌

    파이썬 자바스크립트는 컴파일 안함 대신 인터프리팅함

    인터프리터: 사용자의 입력, 사용자의 스크립트를 그때 그때 번역하여 CPU에 전달


    <범용 레지스터>
    rax(accumlator regiser) 함수의 반환 값
    rbx(base register) x64에서는 주된 용도 없음
    rcx(counter register) 반복문의 반복 횟수, 각종 연산의 시행 횟수
    rdx(data register) x64에서는 주된 용도 없음
    rsi(source index) 데이터를 옮길 때 원본을 가리키는 포인터
    rdi(destination index) 데이터를 옮길 때 목적지를 가리키는 포인터
    rsp(stack pointer) 사용중인 스택의 위치를 가리키는 포인터
    rbp(stack base pointer) 스택의 바닥을 가리키는 포인터

    <플래그 레지스터> - 프로세서의 현재 상태를 저장함
    CF(Carry Flag) 부호없는 수의 연산 결과가 비트의 범위를 넘을 경우 설정
    ZF(Zero Flag) 연산의 결과가 0일 경우 설정
    SF(Sign Flag) 연산의 결과가 음수일 경우 설정
    OF(Overflow Flag) 부호 있는 수의 연산 결과가 비트 범위를 넘을 경우 설정


    <섹션> - 유사한 용도로 사용되는 데이터가 모여있는 영역
    .text : 실행 가능한 기계코드가 위치하는 영역
    .data: 컴파일 시점에 값이 정해진 전역 변수들이 위치한 영역
    .rdata: 컴파일 시점에 값이 정해진 전역 상수와 참조할 DLL 및 외부 함수들의 정보가 저장

    스택: 기존 주소보다 낮은 주소로 확장, 지역변수느 함수의 리턴주소가 저장됨
    예) scanf("%d", &choice) 지역변수 choice가 스택에 저장

    힙: 여러 용도로 사용하기 위해 할당받는 공간, 모든 종류의 데이터 저장가능, 스택과 다른점은 비교적 스택보다 더 큰데이터를 저장할 수 있고, 전역적으로 접근 가능, 실행중 동적으로 할당받음
    예) malloc(), calloc() 등으로 할당 받은 메모리


    <x64 어셈블리 언어>

    명령어(Operation Code, Opcode)와 피연산자(Operand)로 구성

    데이터 이동  mov(값대입), lea(주소를대입)
    산술 연산  inc(1증가), dec(1감소), add(더하기), sub(빼기)
    논리 연산  and, or, xor, not
    비교 cmp(둘이 대소비교, 서로뻄), test(둘이 AND연산)
    분기 jmp(rip 값 이동), je(비교한 두 피연산자가 같으면 점프), jg(비교한 두 연산자 중 전자(왼쪽)가 더크면 점프)
    스택 push, pop
    프로시져 call, ret, leave
    시스템 콜 syscall

    QWORD PTR [0x8048000] 0x8048000의 데이터를 8바이트만큼 참조
    DWORD PTR [0x8048000] 0x8048000의 데이터를 4바이트만큼 참조
    WORD PTR [rax] rax가 가르키는 주소에서 데이터를 2바이트 만큼 참조
    Byte 1바이트만 참조

    call : 주소에 위치한 프로시져(특정 기능을 수행하는 코드조각, 함수) 호출, 이 다음 명령어의 주소를 스택에 저장


    올리디버그 단축키
    컨트롤 + F2 디버깅처음부터 다시 시작
    F7 코드를 한줄씩 실행하는데 함수호출하면 그 함수속으로 들어가서 한줄한줄 또 실행 뭐 그런식 가능
    F8 위랑 같은데 얘는 함수자체를 그냥 실행시킴, 실행하고 바로 다음줄로 넘어간다는 뜻
    컨트롤 + F9 리턴까지 실행, 함수 코드내에서 끝까지 실행시켜서 탈출할때 씀
    컨트롤 + G 원하는 주소로 이동, 메모리를 확인할때 등 사용
    F4 커서 위치까지 실행
    ; 코멘트 추가
    : Label 추가(눌러보니까 위에거랑 똑같은듯)
    F2 브레이킹포인트, 중단점 설정
    F9 실행, 브레이킹 포인트있으면 거까지
    * 현재 어디까지 실행되있는지 보여줌
    - 직전 커서 위치를 다시 보여줌
    엔터 커서가 CALL/JMP 명령어에 위치해 있다면 해당 주소를 따라가서 보여줌, 실행되는거아님(뭔소리야)



    '리버싱 > 리버싱스러운것' 카테고리의 다른 글

    Abex Crack me #3  (0) 2023.05.11
    Tut.ReverseMe1 분석  (0) 2023.05.11
    Abex Crack me #2  (0) 2023.05.10
    Abex Crack me #1  (0) 2023.05.10
    대망의 HelloWorld.exe 디버깅 및 분석  (0) 2023.05.06
Designed by Tistory.