-
소프트웨어 역공학 시험 정리여러가지 공부 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 > 종료가 된다'여러가지 공부' 카테고리의 다른 글
네트워크 분석 실무 중간고사 정리 (0) 2022.04.20 소프트웨어 역공학 실습 GDB exam1, exam1-1 (0) 2022.04.20 네트워크 VPN (0) 2022.04.18 소프트웨어 역공학 3주자 (0) 2022.04.18 도커와 쿠버네티스 비교 (0) 2022.04.18