어셈블리 명령어 명령코드 데이터 이동 mov, lea 산술 연산 inc, dec, add, sub 논리 연산 and, or, xor, not 비교 cmp, test 분기 jmp, je, jg 스택 push, pop 프로시저 call, ret, leave 시스템 syscall 데이터 이동 mov a, b : b에 들어있는 값을 a에 대입 mov rdi, [rsi+scx*8] "rsi+scx*8" 값을 rdi에 대입 lea a, b : b의 유효 주소를 a에 저장 lea rdi, [rsi+scx*8] "rsi+scx*8" 을 rsi에 대입 산술 연산 add a, b : a에 b의 값을 더함 add eax, ebx eax += ebx sub a, b : a에 b의 값을 뺌 sub eax, ebx eax -= ..
컴퓨터 구조 기능 구조의 설계 명령어 집합구조 마이크로 아키텍처 하드웨어 및 컴퓨터 방법론 폰 노이만 구조 x86, x86-64 캐시 설계 직접 메모리 접근 하버드 구조 ARM 파이프라이닝 - 수정된 하버드 구조 MIPS 슈퍼 스칼라 - - AVR 분기 예측 - - - 비순차적 명령어 처리 - x-86-64 아키텍처 x64 아키텍처에는 범용, 세그먼트, 명령어 포인터, 플래그 레지스터가 존재한다. 범용 레지스터 x86-64에서 범용 레지스터는 8바이트를 저장할 수 있다. 이름 주용도 rax(accumulator register) 함수의 반환 값 rbx(base register) - rcx(counter register) 반복문의 반복 횟수, 각종 연산의 시행 횟수 rdx(data register) - r..
리눅스 프로세스 메모리 구조 리눅스 프로세스의 메모리는 크게 5가지 세그먼트로 구분된다. 1. 코드 세그먼트 2. 데이터 세그먼트 3. BSS 세그먼트 4. 힙 세그먼트 5. 스택 세그먼트 1. 코드 세그먼트 실행 가능한 기계코드가 위치하는 영역 부여 권한 : 읽기, 쓰기 더보기 int main() { return 31337; } 위와 같은 함수를 실행시켰을 때 "554889e5b8697a00005dc3" 라는 기계코드로 변환되고 해당 기계코드가 위치하는 장소가 코드 세그먼트이다. 2. 데이터 세그먼트 컴파일 시점에 값이 정해진 전역 변수 및 전역 상수들이 위치하는 영역 부여 권한 : 읽기, 쓰기 데이터 세그먼트는 data 세그먼트와 rodata 세그먼트로 나뉜다. 값이 변할 수 있는 데이터들이 위치하는..
crackme4 사실 엄청나게 쉽게 푸는 방법이 있다. "0040112A" 의 값인 "JE SHORT test.0040113B" 의 값중 "JE"를 "JMP" 바꿔주면 된다. 하지만 이렇게 풀면 실력이 안오를것 같다. 먼저 코드분석을 위해 serial 값이 딱 들어가기 직전에 Break Point를 걸었다. 첫번째로 중요한 부분은 여기 부분이다. "ESI"의 값과 "EAX"값을 비교하면 참, 거짓 결과에 따라 JE 함수가 실행된다. 현재 "EAX" 의값은 "7", "ESI"의 값 또한 "7"이다. 여기서 "ESI" 의 값은 "hACKErS" 의 문자길이 이고, "EAX"의 값은 내가 입력한 값의 문자열 길이이다. 즉, 내가 입력해야 할 문자열의 길이는 7글자이다. 두번 째로 중요한 부분이다. 바로 이분이..
crackme3 crackme3번 먼저 프로그램을 돌려서 아무 값이나 입력해보았다. "asdasd" 라는 값을 입력하였을 때 "Wrong word!!!" 라는 값이 나왔다. 이제 OllyDbg 에서 파일을 분석해보자 가장 먼저 Search for -> All intermodular calls 에서 GetDlgItemTextA 라는 수상한 부분을 발견하였다. (물론 결과론적인 이야기지만 엄청난 삽질 끝에 발견한 부분이다.)\ 해당 부분에 브레이크 걸고 실행해보았다. 마찬가지로 asdasd 라는 값을 넣고 F8을 연타해보았다. 현재 "EDX"에 내가 입력한 "asdasd" 라는 값이 들어가있었다. 계속 위의 "LEA EDX" 를 통해 내가입력한 값을 EDX 주소에 저장하였고, "LEA EAX"를 통해 EAX..
x86, x64 x86과 x64는 CPU의 아키텍처를 나타내는 용어로, x86은 32비트 프로세서를, x64는 64비트 프로세서를 의미한다. 레지스터는 CPU가 데이터를 일시적으로 저장하는 기억장치로, x86에서는 EAX, EBX 등의 4바아트 레지스터가 있고, x64에서는 RAX, RBX 등의 8바이트 레지스터가 있다. x86과 x64의 장단점 x86의 장점은 호환성이 높고, 32비트 프로그램을 실행하는데 더 효율적이다. 하지만 단점으로는 메모리 인식률이 4GB로 제한되어 있고, 데이터 처리량과 속도가 낮다. x64의 장점은 메모리 인식률이 4GB 이상으로 확장되어 있고, 데이터 처리량과 속도가 높다. 하지만 단점은 호환성이 낮고, 64비트 프로그램을 실행하는데 더 많은 자원을 필요로 한다. BoF B..