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
요약
- 스택
- push val : rsp를 8만큼 빼고, 스택의 최상단에 val을 쌓습니다.
- pop reg: 스택 최상단의 값을 reg에 넣고, rsp를 8만큼 더합니다.
- 프로시저
- 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 |