printf등을 포함한 모든 함수는 에필로그 할때 모두 ret가 있음
EIP : 다음 실행할 명령어의 주소
EBP : 스택의 제일 높은 주소 (기준점)
ESP : stack의 제일 아래 부분, 현재 진행 stack지점
1. PUSH : 스택에 값을 저장한다 PUSH후에는 스택이 4byte 증가, ESP레지스터가 4byte감소
ex) PUSH EBP --->EBP의 값을 스택에 저장
2. POP : 스택 끝에 저장된 값을 가져온다 POP후에는 스택이 4byte감소, ESP레지스터가 4byte증가
ex) POP EBP ---> 스택 끝의 값을 꺼내서 EBP에 저장
3. MOV : 지정한 값을 지정한 곳에 넣어주는 역할을 한다.(주소에 저장된 값을 저장)
ex) MOV ESP, EBP --->스택 프레임 제거 = leave
ex) MOV EBP, ESP
4. LEA : MOV와 동일한 역할을 수행(주소를 그대로 저장)
ex) LEA EAX, [EBP + 10] ---> EBP+10의 주소를 EAX에 저장
5. INC, DEC : INC는 값을 1증가, DEC는 값을 1감소
ex) INC EAX ---> EAX 1증가
ex) DEC EAX ---> EAX 1감소
6. NEG : 들어있는 값의 부호를 바꿈
7. NOT : 들어있는 값의 비트를 반전
8. IMUL(D,S) : 값을 서로 곱함
9. AND(D,S) : AND 논리연산을 하여 D에 저장
10. OR(D,S) : OR 논리연산을 하여 D에 저장
11. XOR(D,S) : XOR 논리연산을 하여 D에 저장
12. ADD : 두 오퍼랜드의 덧셈연산 수행
ex) ADD EAX, 3A ---> EAX에 3A를 더한 뒤 EAX에 저장
ex) ADD ESP, 0x8 ---> ESP에 0x8만큼 더함 (ESP의 주소가 커지고 스택이 줄어듬)
13. SUB : 두 오퍼랜드의 뺄셈연산 수행
ex) SUB ESP, 10 ---> ESP에서 10을 뺀 뒤 ESP에 저장
ex) SUB ESP, 0x8 ---> ESP가 0x8주소 만큼 뻄 (ESP의 주소가 작아지고 스택이 늘어남)
14. TEST(D,S) : AND 논리 연산을 한다(값을 D에 저장 하진 않음)
=> 연산한 결과가 Flags 레지스터에 영향을 끼침
15. CMP(D,S) : SUB와 같이 뺄셈 연산을 한다(값을 D에 저장하진 않음)
=> 두 값(D,S)이 같을 때 ZF=1, CF=0이 되고, D<S일 때에는 ZF=0, CF=1, 반대로 D>S일 때에는 ZF=0, CF=0이 됩니다.
16. CALL : 함수 호출 명령어, 스택에 리턴주소를 PUSH한 뒤 바로 뒤의 주소 값으로 점프한다. (위에 새로운 ret를 쌓음)
≒ PUSH retaddr and JMP
17. RET : 함수 내부에서 다시 원래 코드로 돌아오는 명령어이며 CALL명령어 수행 시 스택에 저장했던 복귀주소로 돌아온다 ≒ POP EIP and JMP EIP
18. leave: 에필로그 과정을 함
≒ MOV ESP, EBP
POP ebp
JMP : 무조건 점프
JE : 비교 결과가 같으면 점프
JGE : 비교결과가 크거나 같으면 점프
JLE : 비교결과가 작거나 같으면 점프
JNE : 비교결과가 같지 않으면 점프
JZ : 0이면 점프
JG(Jump if greater): 왼쪽값이 크면 점프
CF(Carry Flag : 더하기,빼기등 연산에서 자리올림이 생기면 CF의 값이 1이된다(부호 없는 값끼리의 연산)
OF(Overflow Flag) : OF는 부호가 있는 (signed) 값의 연산에서 CF의 역할을 한다. 연산에 사용된 값들에 부호가 있을 경우에는 CF 대신 OF를 사용한다.
자리 올림 == 표시할 수 있는 값의 범위를 넘어감
ZF(Zero Flag) : CPU는 값을 비교할때 빼기연산을 하는데 그 과정에서 두 값이 같아서 연산의 결과가 0일 때 ZF는 1이 되고 값이 다르면 ZF = 1
SF(Sign Flag) : 부호있는 연산에서 쓰여서 결과가 음수인지 혹은 양수인지를 가리킨다. 결과가 양수일 때, 최상위 비트가 0이면 SF=0, 반대로 음수일때 최상위 비트가 1이면 SF=1이 된다.
출처: 윈도우 시스템 해킹가이드 버그헌팅과 익스플로잇
'STUDY > Pwnable' 카테고리의 다른 글
[Dreamhack] Shell_basic (2) | 2022.10.21 |
---|---|
pwntools (0) | 2022.10.11 |
환경변수 이용하는 법 (0) | 2020.01.02 |
메모리 조작하기2 (0) | 2019.12.24 |
메모리 조작하기1 (0) | 2019.12.24 |