STUDY/Pwnable

어셈블리어 기초

Dalseung 2020. 1. 15. 21:49

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