study/보안

x86 어셈블리 언어 - 주요 명령어 정리 (2)

lucykorea414 2023. 9. 8. 12:49
728x90

Opcode: 스택

push val : val을 스택 최상단에 쌓음

연산
rsp -= 8
[rsp] = val

예제

[Register]
rsp = 0x7fffffffc400
[Stack]
0x7fffffffc400 | 0x0  <= rsp
0x7fffffffc408 | 0x0
[Code]
push 0x31337

결과

[Register]
rsp = 0x7fffffffc3f8
[Stack]
0x7fffffffc3f8 | 0x31337 <= rsp 
0x7fffffffc400 | 0x0
0x7fffffffc408 | 0x0

 

pop reg : 스택 최상단의 값을 꺼내서 reg에 대입

연산
reg = [rsp]
rsp += 8

예제

[Register]
rax = 0
rsp = 0x7fffffffc3f8
[Stack]
0x7fffffffc3f8 | 0x31337 <= rsp 
0x7fffffffc400 | 0x0
0x7fffffffc408 | 0x0
[Code]
pop rax

결과

[Register]
rax = 0x31337
rsp = 0x7fffffffc400
[Stack]
0x7fffffffc400 | 0x0 <= rsp 
0x7fffffffc408 | 0x0

 

 

 


Opcode: 프로시저 (함수)

call addr : addr에 위치한 프로시져 호출

연산
push return_address
jmp addr

예제

[Register]
rip = 0x400000
rsp = 0x7fffffffc400 
[Stack]
0x7fffffffc3f8 | 0x0
0x7fffffffc400 | 0x0 <= rsp
[Code]
0x400000 | call 0x401000  <= rip
0x400005 | mov esi, eax
...
0x401000 | push rbp

결과

[Register]
rip = 0x401000
rsp = 0x7fffffffc3f8
[Stack]
0x7fffffffc3f8 | 0x400005  <= rsp
0x7fffffffc400 | 0x0
[Code]
0x400000 | call 0x401000
0x400005 | mov esi, eax
...
0x401000 | push rbp  <= rip

 

leave: 스택프레임 정리

연산
mov rsp, rbp
pop rbp

예제

[Register]
rsp = 0x7fffffffc400
rbp = 0x7fffffffc480
[Stack]
0x7fffffffc400 | 0x0 <= rsp
...
0x7fffffffc480 | 0x7fffffffc500 <= rbp
0x7fffffffc488 | 0x31337 
[Code]
leave

결과

[Register]
rsp = 0x7fffffffc488
rbp = 0x7fffffffc500
[Stack]
0x7fffffffc400 | 0x0
...
0x7fffffffc480 | 0x7fffffffc500
0x7fffffffc488 | 0x31337 <= rsp
...
0x7fffffffc500 | 0x7fffffffc550 <= rbp

 

ret : return address로 반환

연산
pop rip

예제

[Register]
rip = 0x401021
rsp = 0x7fffffffc3f8
[Stack]
0x7fffffffc3f8 | 0x400005    <= rsp
0x7fffffffc400 | 0x123456789abcdef
[Code]
0x400000 | call 0x401000
0x400005 | mov esi, eax
...
0x401000 | push rbp
0x401001 | mov rbp, rsp
0x401004 | sub rsp, 0x30
0x401008 | mov BYTE PTR [RSP], 0x3
...
0x401020 | leave
0x401021 | ret <= rip

결과

[Register]
rip = 0x400005
rsp = 0x7fffffffc400
[Stack]
0x7fffffffc3f8 | 0x400005
0x7fffffffc400 | 0x123456789abcdef    <= rsp
[Code]
0x400000 | call 0x401000
0x400005 | mov esi, eax   <= rip
...
0x401000 | push rbp
0x401001 | mov rbp, rsp
0x401004 | sub rsp, 0x30
0x401008 | mov BYTE PTR [RSP], 0x3
...
0x401020 | leave
0x401021 | ret

 

 

 


 

요약

  1. 스택
    • push val : rsp를 8만큼 빼고, 스택의 최상단에 val을 쌓습니다.
    • pop reg: 스택 최상단의 값을 reg에 넣고, rsp를 8만큼 더합니다.
  2. 프로시저
    • call addr: addr의 프로시저를 호출합니다.
    • leave: 스택 프레임을 정리합니다.
    • ret: 호출자의 실행 흐름으로 돌아갑니다.
728x90

'study > 보안' 카테고리의 다른 글

UPX 언패킹 실습  (0) 2024.01.31
IDA 단축키 모음  (0) 2023.09.15
x86 어셈블리 명령어(1) 리뷰 퀴즈  (0) 2023.09.08
x64 어셈블리 언어 - 주요 명령어 정리 (1)  (0) 2023.09.08
윈도우 메모리 구조  (0) 2023.09.07