2024. 2. 24. 21:12ㆍInformation Security 정보보안/Reverse Engineering 리버스 엔지니어링
배울내용:
레지스터
레지스터 곱셈 나눗셈
disassemble main
OllyDBG 레지스터
Register
어셈블리어 명령어
OllyDBG 레지스터 이해
OllyDBG 실습
Reversing Engineering
리버싱 엔지니어링 기초
이전시간 : Assembly 명령어 (레지스터 Register) 1
https://sarimus.tistory.com/87
Reverse Engineering DAY_005 레지스터, OllyDBG 레지스터 , Register, 범용 레지스터, 인덱스 레지스터, 포
배울내용: 레지스터 OllyDBG 레지스터 Register 범용 레지스터 인덱스 레지스터 포인터 레지스터 어셈블리어 명령어 OllyDBG 레지스터 이해 OllyDBG 실습 Reversing Engineering 리버싱 엔지니어링 기초 배울내
sarimus.tistory.com
배울내용 : Assembly 명령어 (레지스터 Register) 2
지난 시간에는 간단한 add, sub 또는 move 로 더하고 빼고 그리고 값을 특정값으로 초기화나 이동시켜주는걸 했다
이번엔 추가적으로 Assembly 명령어를 더 볼것이다.
01. 레지스터 초기화
이는 보통 변수를 초기화하거나, 계산 결과를 담을 레지스터를 초기화할 때 사용된다.
xor eax,eax
02. 레지스터 값 1씩 증가, 감소
명령어들은 반복문에서 카운터를 증가시키거나 감소시키는 용도로 주로 사용다.
> inc eax
> dec eax
03. 레지스터값 교체
이는 두 변수의 값을 교환하거나, 레지스터에 저장된 값들을 임시로 바꿀 때 유용하다 . 주로 변수나 레지스터 값 교환 등의 작업에서 사용된다.
> xchg eax, ebx
물론 곱셈과 나눗셈 또한 가능하다
> mul ( 곱셈 )
형태 : A X B
A: EAX
B: mul EBX
이때 B 위치에는 레지스터 와 메모리값만 올수있다
ex) B: mul DWORD PTR [402000]
문제 풀어보기 :
MOV EAX, 5
MOV EBX, 6
MUL EBX
MUL EBX
만약 위같이 되있을때 EAX 와 EBX 의값을 어떻게 될까?
이렇게 된다
B4 가 된이유는 180이 HEX 값으로 표기가 되면 B4 가 된다, 그리고 MUL 명령어를 사용하여 EBX의 값을 곱하면 EAX 레지스터에 저장된다. 다시 MUL 명령어를 사용하여 EBX의 값을 다시 곱하면 결과가 EAX에 저장된다.
>div ( 나눗셈 )
위의 테이블 처럼 나눠진다.
8byte 경우
edx(나머지) : eax(몫) 에 저장
4byte 경우
dx : ax 에 저장
2byte 경우
ax 에 저장
1byte 경우
al 에 저장
문제 풀어보기 :
MOV EBX, 3
MOV EAX, 20
MOV EDX, 0
DIV EBX
그러면 조금 이상하다
분명 20을 나누는데 EAX 에 몫이 A 가 들어간다
HEX값이 A 면 10진수로 10 인데 도저히 그런값이 안나온다
그이유는 20에 있다 , EAX 에 10진수가 아닌 HEX 값이 들어갔기 때문에 16진수인 HEX 값 20은 10진수로 32입다.
곧 32 % 3 을 했을때 몫이 10이고 나머지가 2 라는게 납득이 된다.
이번엔 Kali 로가서 vi SARIMUS1.c 로 한다음에 아래처럼 써준다
그리고 저장한뒤에 컴파일시켜준다
그리고 확인 해보면
1 + 2 =3 이니깐 3이 출력이 되는걸 볼수있다
그리고한번 gdb SARIMUS1 에 들어가서 set disassembly-flavor intel 하고
disassemble main 하면 아래처럼 보인다
a 라는 변수에다가 1 넣어주고 b 에다가 2 넣어주고 그걸 더한뒤에 c에 합을넣고 prinf 를 이용해 출력한게 assembly 로 보면 위에처럼보인다 그럼 한줄한줄 해석해보자
친숙한 단어로 보기
(gdb)
<+0>: push rbp (EBP 라생각하면됨)
<+1>: mov rbp,rsp (RSP 를 출발시킴)
<+4>: sub rsp,0x10 (rsp - 10을 뻄) (10 만큼메모리할당)
<+8>: mov DWORD PTR [rbp-0x4],0x1 (ebp에서 4바이트정도할당)그안에 1 넣음
<+15>: mov DWORD PTR [rbp-0x8],0x2 (8 바이트 할당후 2넣음)
<+22>: mov edx,DWORD PTR [rbp-0x4] edx 에다가 옴김 메모리주소 4바이트할당한걸
<+25>: mov eax,DWORD PTR [rbp-0x8] eax 에다가 옮김메모리주소 8바이트할당한걸
<+28>: add eax,edx eax가 3이됨
<+30>: mov DWORD PTR [rbp-0xc],eax eax3을 메모리주소안에 3넣음
<+33>: mov eax,DWORD PTR [rbp-0xc] 그저장된 3을 eax에 저장
<+36>: mov esi,eax esi가 3 이됨. eax값을 옮겨서
<+38>: lea rax,[rip+0xe9e] # 0x2004 메모리값을 그대로 옮김 rax로,
<+45>: mov rdi,rax rdi에 옮겨놓고 rax에있는걸
<+48>: mov eax,0x0 eax를 0으로 채움
<+53>: call 0x1030 <printf@plt> 0x1030 번지수가서 printf 호출
<+58>: mov eax,0x0 다시 eax를 0으로 채움
<+63>: leave 끝냄.
<+64>: ret
이렇게해서 3이라는 값을 레지스터에서는 이런식으로 출력을 시킨다.