Reverse Engineering DAY_006 레지스터, 레지스터 곱셈 나눗셈, disassemble main, OllyDBG 레지스터, Register, 어셈블리어 명령어, OllyDBG 레지스터 이해, OllyDBG 실습, Reversing Engineering

2024. 2. 24. 21:12Information Security 정보보안/Reverse Engineering 리버스 엔지니어링

728x90

배울내용: 

레지스터

레지스터 곱셈 나눗셈

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이라는 값을 레지스터에서는 이런식으로 출력을 시킨다. 

 

728x90