티스토리 뷰
안녕하세요!
지난 시간에는 mov 명령어를 알아보았는데요, 이번 시간에는 add, sub 명령어를 알아보겠습니다.
※ r/m 32 주소형식 : 피연산자 크기 속성이 32비트인 명령어에 사용하는 더블워드 범용 레지스터 또는 메모리 피연산자.
※ r/m32는 다음과 같은 형식을 가지는 문법을 의미합니다.
# mov eax, ebx (ebx에 담긴 내용을 eax로 복사)
# mov eax, [ebx] (ebx에 담긴 내용이 가리키는 주소의 내용을 eax로 복사)
# mov eax, [ebx+ecx*X] (ebx에서 ecx*X 만큼 떨어진 곳에 위치한 주소의 내용을 eax로 복사)
# mov eax, [ebx+ecx*X+Y] (ebx에서 ecx*X+Y 만큼 떨어진 곳에 위치한 주소의 내용을 eax로 복사)
ADD : 더하기
SUB : 빼기
#목적지는 r/m32 또는 레지스터.
#출발지는 r/m32 또는 레지스터 또는 상수값.
#출발지와 목적지가 모두 r/m32일 수는 없다. (Memory to Memory는 불가능하다.)
#OF, SF, ZF, AF, PF, CF에 영향을 준다. (플래그 비트가 변할 수 있다.)
직접 어셈블리 프로그램을 짜보면서 분석해보겠습니다.
mov eax, esp (esp의 값을 eax에 복사한다.)
sub eap, 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을 뺀 값을 [esp-4]에 저장한다.)
직접 gdb로 esp와 레지스터 값들이 어떻게 변하는지 확인해보겠습니다.
이 상태에서는 esp의 값으로 0xbffff160이 들어있습니다.
mov 명령어가 실행되어 esp의 값이 eax에 복사되어 저장되었음을 확인할 수 있습니다.
eax에는 0xbffff160이 저장되어 있습니다.
esp의 값에서 0x8만큼 감소시키고 그 결과를 esp에 저장합니다.
이 명령어를 실행하면 스택에서 8바이트 만큼 공간을 할당합니다.
esp의 값이 이전의 값에서 0x8만큼 감소된 0xbffff158이 저장되어있음을 확인할 수 있습니다.
mov 연산을 통해서 eax의 값이 가리키는 주소 0xbffff160의 위치에 0x1이 저장되었음을 확인할 수 있습니다.
eax-0x4의 결과 값은 0xbffff160 - 0x4 이므로 0xbffff15c가 됩니다.
*main+12의 mov의 instruction이 실행되면 0xbffff15c가 가리키는 스택의 지점에 0x2가 저장됩니다.
마지막 sub 명령어까지 수행되고 나면 0xbffff15c가 가리키는 지점의 내용이 1 만큼 감소되어 저장됩니다.
스택의 구조가 대충 이런식으로 할당된다고 생각하시면 됩니다.
그러면 이번에는 마지막의 sub 명령어를 add로 바꿔서 결과를 확인해보겠습니다.
add 명령어가 실행되면서 0xbffff15c가 가르키는 위치에 저장되어 있던 값인 0x2가 0x1 만큼 증가하여 0x3이 저장된 것을 확인할 수 있습니다.
이번 시간에는 ADD와 SUB를 알아보았는데요, 크게 어렵지는 않았습니다.
다음 시간에는 lea, and, or, xor 명령어에 대해 공부해보겠습니다! ^^
'Reversing' 카테고리의 다른 글
[리버싱] 어셈블리어 inc, cmp, test, dec, jcc, call, jmp 명령어를 알아보자! [x86] (7) (0) | 2019.01.03 |
---|---|
[리버싱] 어셈블리어 lea, and, or, xor 명령어를 알아보자! [x86] (6) (3) | 2019.01.02 |
[리버싱] 어셈블리어 mov 명령어를 알아보자! [x86] (4) (2) | 2018.12.28 |
[리버싱] gdb 사용하여 프로그램 분석하기! [x86] (3) (0) | 2018.12.27 |
[리버싱] 무작정 어셈블리 프로그램 만들어보기! [x86] (2) (7) | 2018.12.27 |
- Total
- Today
- Yesterday
- mov
- Sub
- 해킹
- system call
- 리눅스 시스템 콜
- 논리연산
- 터미널
- gdb
- vim
- 어셈블리어
- 리버스 엔지니어링
- Push
- 치트엔진
- add
- 사이버공격
- 어셈블러
- 리버싱
- 스택
- ubuntu
- reversing
- cmp
- 어셈블리
- nasm
- 리눅스
- jmp
- linux
- 우분투
- 명령어
- call
- instruction
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |