일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Kotlin
- CustomScrollView
- Button
- activity
- 앱
- viewmodel
- android
- DART
- livedata
- ScrollView
- Dialog
- TEST
- 계측
- appbar
- Navigation
- intent
- LifeCycle
- 테스트
- textview
- Flutter
- scroll
- 앱바
- drift
- textfield
- binding
- Compose
- 안드로이드
- tabbar
- Coroutines
- data
- Today
- Total
Study Record
[리버싱] 어셈블리어 문법 본문
→ AT&T 문법 : "명령어 [source] [dest]"
→ intel 문법 : "명령어 [dest] [source]"
※ 참고 사항
CF, ZF, SF, OF는 각각 1바이트로 전부 4바이트의 크기를 차지하는 레지스터이다.
CF : Carry Flag : 연산시 Carry가 발생하면 1로 세팅된다. 오버플로우를 탐지하는데 쓰이기도 한다.
ZF : 가장 최근에 계산된 명령어의 결과값이 0이면 1로 세팅된다.
SF : 가장 최근에 계산된 명령어의 결과값이 음수면 1로 세팅된다.
OF : 가장 최근에 계산된 명령어가 2's complement 오버플로우를 일으키면 1로 세팅된다.
xor %eax, %eax
각 비트가 서로 다른 값일 때만 결과가 1이 되고 같은 값이라면 결과는 0이 된다.(mod 2)
→ 레지스터를 0으로 초기화하는 방법 중 하나이다.
sub $0x8, %esp
esp 레지스터 가리키는 주소에서 0x8만큼 주소를 뺀다. (esp = esp - 0x8)
add $0x10, %esp
%esp 값에 $0x10(십진수:16) 만큼 더한다.
and $0xfffffff0, %esp
%esp 스택의 내용과 $0xfffffff0 값을 bit AND 연산을 한다.
%esp 값의 마지막 4bit 부분의 값을 0로 만든다.
mov %esp, %ebp
현재 esp 값을 ebp 레지스터에 저장한다.
lea 0xfffffffc(%ebp), %eax -> Intel : lea $eax, [ebp - 4]
exa 레지스터에 [ebp - 4] 주소값을 저장한다.
※ mov vs lea
ebp 레지스터 값이 0x0010이고 0x0014 위치에 값 30이 저장되어 있다면,
mov eax, [ebp+4] 명령을 통해 eax 레지스터엔 값 30이 저장되고
lea eax, [ebp+4] 명령을 통해 eax 레지스터엔 0x0014가 저장된다.
cmpl %ebx, %eax
우선 두 개의 파라미터를 뺀다. (%eax - %ebx) 여기서 중요한 점이 있다. 뺄셈을 진행했을 때 그 값을 저장하지 않고 CF, ZF, SF, OF 레지스터 값들을 설정한다.
- Carry가 있는가? 있으면 CF를 1로 세팅
- 뺄셈한 값이 0인가? 0이면 ZF를 1로 세팅 (같을 경우)
- 뺄셈한 값이 음수인가? 음수면 SF를 1로 세팅
- 오버플로우가 발생헀는가? 발생했으면 OF를 1로 세팅
test %eax, %eax
첫번째 인자와 두번째 인자를 AND 연산시켜 ZF 를 설정한다. %eax 값이 0이면 ZF == 1 로 셋팅된다.
jns 0x8048484
single Flag(SF == 0)가 해제되었으면 분기(양수면 분기)한다.
jne 0x8048484
jump not equal 로 ZF플래그가 0 일때 점프 한다. 즉 같지 않을때 점프한다.
je 0x804864d
ZF플래그가 1 이면 점프한다.
출처: https://operatingsystems.tistory.com/entry/SP-Conditional-Jump [Maybe]
'리버싱 > 기본' 카테고리의 다른 글
[리버싱] Hack Me 리버싱 의사코드 복원 (5,6단계) (0) | 2021.11.15 |
---|---|
[리버싱] netcat(nc) CMD (0) | 2021.11.15 |
[리버싱] 간단한 어셈블리 코드 분석 후 복원 (0) | 2021.11.12 |
[리버싱] gdb 사용법 (0) | 2021.11.12 |
[리버싱] 자주 사용되는 C언어 코드 분석 + 함수 (0) | 2021.11.12 |