본문 바로가기

Reverse engineering11

리버싱#1 - gdb 명령어 사용하는 방법! - 먼저 작성 코드 확인 - gdb a.out 실행 - disassemble = disas 명령어 실행 여기서 % = AT&T 방식의 경우 레지스터를 %형식으로 사용 인텔 방식을 사용할 경우에는 표현 방식을 변경 해 주어야 한다. run으로 프로그램을 시작해보면, Segmentation fault 에러 발생!! 그래서 Breakpoint를 만들어 주어야한다! 0x08048060 첫 번째 줄에 breakpoint가 걸렸다! tip - breakpoint 할 때 b main+7 하면 오류!! 위치를 지정할 시! *main+7 이렇게 해야 한다! 현재 지금 프로그램의 문맥의 위치가 화살표로 표시되어있다! 아직 저 push 명령어 실행 전! 현재 문맥에서의 register의 값들이 다 나오게 된다! eip - .. 2021. 3. 1.
리버싱#1 NASM(넷와이드 어셈블러) 사용법 NASM(넷와이드 어셈블러는 인텔 x86 아키텍처용 어셈블러) 설치 • 윈도우: http://www.nasm.us/pub/nasm/releasebuilds/?C=M;O=D 에서 다운로드 후 설치 • 리눅스(우분투 계열): apt-get install nasm NASM 프로그램 구조 - 우분투 접속 후 root 권한을 이용하여 nasm 설치 hello.o 는 nasm을 돌리고 나오는 오브젝트 파일이다! 그 파일을 링크 하겠다! 컴파일과 링킹하는 과정을 동시에 하겠다! > 결과로 a.out 파일이 생긴다! • PUSH: 스택에 데이터를 삽입 (push 명령어는 자동으로 ESP를 4 바이트 감소 시킴) push word / dword / word • POP: 스택에서 데이터를 꺼냄 (스택에서 4 바이트를 꺼내.. 2021. 2. 25.
리버싱#1 x86 어셈블리 소개 x86 아키텍처 • 데이터 타입: 어셈블리 기본 • 주소 표기법: 리틀 엔디안 / a b c d -> d c b a • 레지스터: 8개의 범용 레지스터, EIP, EFLAGS • 호출 규약: cdecl, stdcall, fastcall • 명령어 세트: 가변 길이 명령어 형식을 사용 • 피연산자: 레지스터, 메모리 주소, 주소값, 숫자 • 기본 문법: AT&T(원투) 또는 Intel (투원) / 리눅스 AT&T 사용 윈도우 Intel 방식 ex> AT&T = add a,b > b=a+b // Intel 방식 = add a,b > a=a+b 레지스터 • 8개의 범용 레지스터 + EIP(32비트) • EFLAGS 레지스터(32비트) • 세그먼트 레지스터(16비트) • EAX - 산술 연산에 사용, 함수 리턴.. 2021. 2. 25.
리버싱#1 어셈블리 기본!! 어셈블리 기본! 숫자 표현 > 10진수 : 사람이 이해하는 숫자 > 16진수 : 컴퓨터와 대화하기 위한 숫자 > 2진수 : 컴퓨터가 이해하는 숫자 - 1의 보수 : 0은 1로, 1은 0으로 변경 - 2의 보수 : 1의 보수에서 1을 더한 값 메모리 주소와 섹션 > 모든 운영체제는 사용자 모드와 커널 모드로 메모리를 나누어 관리 > 모든 프로그램은 사전에 약속된 형식을 따름 프로그램과 메모리 코드 실행 흐름에 따라 변화하는 값들은 스택 또는 힙에 쌓이게 된다. 스택 > 함수 호출 시 생성되는 지역 변수와 매개 변수가 저장되는 영역, LIFO 구조 힙 > 동적으로 메모리 할당 시 사용하는 영역 어셈블리 명령어 세트! > 데이터 이동 : 메모리 메모리, 메모리 레지스터, 레지스터 레지스터 > 산술/논리 연산 .. 2021. 2. 19.
728x90
반응형