
x86 Assembly๐ค: Essential Part(2)
1. x86-64 ์ด์ ๋ธ๋ฆฌ ๋ช ๋ น์ด Pt.2
Opcode : ์คํ ๐งฑ
x64 ์ํคํ ์ณ์์๋ ๋ค์์ ๋ช ๋ น์ด๋ก ์คํ์ ์กฐ์ํ ์ ์๋ค.
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 : ํ๋ก์์ ๐
ํ๋ก์์ (Procedure)
: ํน์ ๊ธฐ๋ฅ์ ์ํํ๋ ์ฝ๋ ์กฐ๊ฐ
- ๋ฐ๋ณต๋๋ ์ฐ์ฐ์ ํ๋ก์์ ํธ์ถ๋ก ๋์ฒด -> ์ฝ๋์ ๊ธธ์ด๋ฅผ ์ค์ผ ์ ์๋ค
- ๊ธฐ๋ฅ ๋ณ๋ก ์ฝ๋ ์กฐ๊ฐ์ ์ด๋ฆ์ ๋ถ์ -> ์ฝ๋์ ๊ฐ๋ ์ฑ์ ๋์ธ๋ค
ํธ์ถ(Call)
: ํ๋ก์์ ๋ฅผ ๋ถ๋ฅด๋ ํ์
๋ฐํ(Return)
: ํ๋ก์์ ์์ ๋์์ค๋ ๊ฒ
โก ํ๋ก์์ ๋ฅผ ํธ์ถํ ๋๋ ํ๋ก์์ ๋ฅผ ์คํํ๊ณ ๋์ ์๋์ ์คํ ํ๋ฆ์ผ๋ก ๋์์์ผ ํ๋ฏ๋ก,
call ๋ค์์ ๋ช ๋ น์ด ์ฃผ์(return address, ๋ฐํ์ฃผ์)๋ฅผ ์คํ์ ์ ์ฅํ๊ณ ํ๋ก์์ ๋ก rip๋ฅผ ์ด๋์ํจ๋ค.
x64 ์ด์ ๋ธ๋ฆฌ ์ธ์ด์๋ ํ๋ก์์ ์ ํธ์ถ๊ณผ ๋ฐํ์ ์ํ call, leave, ret ๋ช ๋ น์ด๊ฐ ์๋ค.
โฃ 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 = 0x401000
rsp = 0x7fffffffc3f8
[Stack]
0x7fffffffc3f8 | 0x400005 <= rsp
[Code]
0x400000 | call 0x401000
0x400005 | mov esi, eax
...
0x401000 | mov rbp, rsp
...
0x401007 | leave
0x401008 | ret <= rip
๊ฒฐ๊ณผ )
[Register]
rip = 0x400005
rsp = 0x7fffffffc3f8
[Stack]
0x7fffffffc3f8 | 0x400005
0x7fffffffc400 | 0x0 <= rsp
[Code]
0x400000 | call 0x401000
0x400005 | mov esi, eax <= rip
...
0x401000 | mov rbp, rsp
...
0x401007 | leave
0x401008 | ret
์คํ ํ๋ ์์ ํ ๋น๊ณผ ํด์
Quiz : x86 Assembly 1
end๋ก ์ ํํ๋ฉด ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋๋ค๊ณ ๊ฐ์ ํ์. ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋์ ๋, 0x400000 ๋ถํฐ 0x400019๊น์ง์ ๋ฐ์ดํฐ๋ฅผ ๋์๋๋ ์์คํค ๋ฌธ์๋ก ๋ณํํ๋ฉด ์ด๋ ๋ฌธ์์ด์ด ๋์ค๋๊ฐ?
A) Welcome to assembly world!
์ด์ ๋ฆฌ๋ทฐ ํด์ฆ์ ๊ฐ์ ๋ฌธ์ ์ด๋ฏ๋ก ์ค๋ช ์ ์๋ตํ๋๋ก ํ๊ฒ ๋ค.
Quiz : x86 Assembly 2
๋ค์ ์ด์ ๋ธ๋ฆฌ ์ฝ๋๋ฅผ ์คํํ์ ๋ ์ถ๋ ฅ๋๋ ๊ฒฐ๊ณผ๋ก ์ฌ๋ฐ๋ฅธ ๊ฒ์?
main๋ถํฐ ์ดํด๋ณด์.
push rbp : rbp๋ฅผ ์คํ ์ต์๋จ์ ์์
mov rbp, rsp : rsp์ ๋ค์ด์๋ ๊ฐ์ rbp์ ๋์
mov rdi, 0x400500 : 0x400500๋ฅผ rdi์ ๋์ (rdi = 0x400500)
call 0x400497 <write_n> : write_nํจ์๋ก ์ด๋
write_nํจ์ ์ฝ๋
push rbp : rbp๋ฅผ ์คํ ์ต์๋จ์ ์์
mov rbp, rsp : rsp์ ๋ค์ด์๋ ๊ฐ์ rbp์ ๋์
mov QWORD PTR[rbp-0x8], rdi : rdi์ ๋ค์ด์๋ ๊ฐ์ rbp-0x8์ด ๊ฐ๋ฆฌํค๋ ์ฃผ์์ ๋์
mov DWORD PTR[rbp-0xc], esi : esi์ ๋ค์ด์๋ ๊ฐ์ rbp-0xc๊ฐ ๊ฐ๋ฆฌํค๋ ์ฃผ์์ ๋์
* QWORD PTR : 8byte
DWORD PTR : 4byte
xor rdx, rdx : ๊ฐ์ ๊ฒ์ ์ฐ์ฐํ ๊ฒ์ด๋ฏ๋ก ๋ชจ๋ ๋นํธ๊ฐ 0์ด ๋๋ฏ๋ก rdx์ ๊ฐ์ 0์ด๋ค.
mov edx, DWORD PTR[rbp-0xc] : rbp-0xc๊ฐ ๋ค์ด์๋ ์ฃผ์์ ํด๋นํ๋ ๊ฐ์ edx์ ๋์ (์ด์ ์ rbp-0xc๊ฐ ๊ฐ๋ฆฌํค๋ ์ฃผ์๋ esi์ ์ ์ฅ๋จ)
mov rsi, QWORD PTR[rbp-0x8] : rbp-0x8๊ฐ ๋ค์ด์๋ ์ฃผ์์ ํด๋นํ๋ ๊ฐ์ rsi์ ๋์ (์ด์ ์ rbp-0x8๊ฐ ๊ฐ๋ฆฌํค๋ ์ฃผ์๋ rdi์ ์ ์ฅ๋จ)
mov rdi, 0x1 : 0x1์ ๊ฐ์ rdi์ ๋์
mov rax, 0x1 : 0x1์ ๊ฐ์ rax์ ๋์
syscall : rax๋ฅผ ์์ฒญ (rax๋ 0x1์ ๊ฐ์ ๊ฐ์ง)
syscall์์ rax๊ฐ 0x1๊ฐ์ ๊ฐ์ง๋ฉด ์ปค๋์ write ์์คํ ์ฝ์ ์์ฒญํ๋ค.
rdi, rsi, rdx๊ฐ ๊ฐ๊ฐ 0x1, 0x400500, 0์ด๋ฏ๋ก ์ปค๋์ write(0x1, 0x400500, 0)์ ์ํํ๋ค.
x86 ์ํคํ ์ฒ๋ ๋ฆฌํ ์๋์ธ ๋ฐฉ์์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์
0x400500 -> 0x7233346479203730๊ณผ ๊ฐ์ด ์ ์ฅ๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก 0x400508 -> 0x2064336275363f00 ๊ณผ ๊ฐ์ด ์ ์ฅ๋๋ค.
๋ฐ๋ผ์ ์ ์ฒด ๋ฐ์ดํฐ๋ 0x72333464792037302064336275363f00์ด๋ค.
์ด๋ฅผ ์์คํค ์ฝ๋๋ก ๋ฐ๊พธ๋ฉด r34dy 70 d3bu6?๋ผ๋ ํ ์คํธ๋ก ๋ฐ๊ฟ ์ ์๋ค.
'DreamHack > Reversing (Dreamhack)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Reversing] rev-basic-0 dreamhack stage 5 (0) | 2022.05.19 |
---|---|
[Reversing] 4์ฃผ์ฐจ dreamhack stage 5 - (1) (0) | 2022.05.14 |
[Reversing] 3์ฃผ์ฐจ dreamhack stage 3 (0) | 2022.05.08 |
[Reversing] 2์ฃผ์ฐจ_dreamhack stage 3 - (1) (0) | 2022.04.30 |
[Reversing] 2์ฃผ์ฐจ dreamhack stage 3 (0) | 2022.04.30 |