๐ธ Linux Memory Layout
Quiz: Linux Memory Layout
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdlib.h>
int a = 0xa;
const char b[] = "d_str";
int c;
int foo(int arg) {
int d = 0xd;
return 0;
}
int main()
{
int *e = malloc(sizeof(*e));
return 0;
}
Q1. a๊ฐ ์์นํ๋ ์ธ๊ทธ๋จผํธ๋ ์ด๋์ธ๊ฐ?
A. ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ
โ ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ์๋ ์ปดํ์ผ ์์ ์ ์ ํด์ง๋ ์ ์ญ๋ณ์ ๋ฐ ์ ์ญ ์์๊ฐ ์์น. a๋ ์ ์ญ๋ณ์.
Q2. b๊ฐ ์์นํ๋ ์ธ๊ทธ๋จผํธ๋ ์ด๋์ธ๊ฐ?
A. ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ
โ b๋ ์ ์ญ ์์.
Q3. foo๊ฐ ์์นํ๋ ์ธ๊ทธ๋จผํธ๋ ์ด๋์ธ๊ฐ?
A. ์ฝ๋ ์ธ๊ทธ๋จผํธ
โ ์คํ ๊ฐ๋ฅํ ํจ์์ ์ฝ๋ ๋ฐ์ดํฐ๋ ์ฝ๋ ์ธ๊ทธ๋จผํธ์ ์์น.
Q4. โd_strโ์ด ์์นํ๋ ์ธ๊ทธ๋จผํธ๋ ์ด๋์ธ๊ฐ?
A. ์ฝ๊ธฐ ์ ์ฉ ๋ฐ์ดํฐ (rodata) ์ธ๊ทธ๋จผํธ
โ ์ ์ญ ์์์ ๊ฐ์ ๋ฐ์ดํฐ๋ ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ ์ค์์๋ ์ฐ๊ธฐ ๊ถํ์ด ๋ถ์ฌ๋์ง ์์ ์ธ๊ทธ๋จผํธ์ ์ ์ฅ๋จ.
Q5. d๊ฐ ์์นํ๋ ์ธ๊ทธ๋จผํธ๋ ์ด๋์ธ๊ฐ?
A. ์คํ ์ธ๊ทธ๋จผํธ
โ ํจ์์ ์ธ์, ์ง์ญ๋ณ์, ๋งค๊ฐ๋ณ์์ ๊ฐ์ ์์ ๋ณ์๋ค์ ํ๋ก๊ทธ๋จ ์ค์ ๋์ ์ผ๋ก ํ ๋น ๋ฐ์ ์คํ ์ธ๊ทธ๋จผํธ์ ์ ์ฅ๋จ.
Q6. c๊ฐ ์์นํ๋ ์ธ๊ทธ๋จผํธ๋ ์ด๋์ธ๊ฐ?
A. BSS ์ธ๊ทธ๋จผํธ
โ ์ด๊ธฐํํ์ง ์์ ์ ์ญ ๋ณ์์ฒ๋ผ ์ปดํ์ผ ์์ ์ ๊ฐ์ด ์ ํด์ง์ง ์๋ ๋ฐ์ดํฐ๋ BSS ์ธ๊ทธ๋จผํธ ์ ์ฅ๋จ. ํ๋ก๊ทธ๋จ ์์ ์ 0์ผ๋ก ์ด๊ธฐํ.
Q7. e๋ ์ด๋ ์ธ๊ทธ๋จผํธ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๋ฆฌํค๋๊ฐ?
A. ํ ์ธ๊ทธ๋จผํธ
โ malloc()
, calloc()
๊ณผ ๊ฐ์ ํจ์๋ฅผ ํตํด ํ๋ก๊ทธ๋จ ์ค ๋์ ์ผ๋ก ํ ์ธ๊ทธ๋จผํธ์ ํ ๋น ๋ฐ์.
๐ธ Computer Architecture
- ๋ช ๋ น์ด ์งํฉ๊ตฌ์กฐ(Instruction Set Architecture, ISA) : ์ปดํจํฐ ๊ตฌ์กฐ ์ค์์ CPU๊ฐ ์ฌ์ฉํ๋ ๋ช ๋ น์ด์ ๊ด๋ จ๋ ์ค๊ณ. ex) ์ธํ ์ x86-64 ์ํคํ ์ฒ
- ์ปดํจํฐ ๊ตฌ์กฐ์ ์ธ๋ถ ๋ถ์ผ
- ๊ธฐ๋ฅ ๊ตฌ์กฐ์ ์ค๊ณ
- ํฐ ๋ ธ์ด๋ง ๊ตฌ์กฐ
- ํ๋ฒ๋ ๊ตฌ์กฐ
- ์์ ๋ ํ๋ฒ๋ ๊ตฌ์กฐ
- ๋ช
๋ น์ด ์งํฉ๊ตฌ์กฐ
- x86, x86-64
- ARM
- MIPS
- AVR
- ๋ง์ดํฌ๋ก ์ํคํ
์ฒ
- ์บ์ ์ค๊ณ
- ํ์ดํ๋ผ์ด๋
- ์ํผ ์ค์นผ๋ผ
- ๋ถ๊ธฐ ์์ธก
- ๋น์์ฐจ์ ๋ช ๋ น์ด ์ฒ๋ฆฌ
- ํ๋์จ์ด ๋ฐ ์ปดํจํ
๋ฐฉ๋ฒ๋ก
- ์ง์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ
- ๊ธฐ๋ฅ ๊ตฌ์กฐ์ ์ค๊ณ
ํฐ ๋ ธ์ด๋ง ๊ตฌ์กฐ
์ฐ์ฐ๊ณผ ์ ์ด๋ ์ค์์ฒ๋ฆฌ์ฅ์น(CPU), ์ ์ฅ์ ๊ธฐ์ต์ฅ์น(memory), ์ฅ์น๊ฐ์ ๋ฐ์ดํฐ๋ ์ ์ด ์ ํธ ๊ตํ์ ๋ฒ์ค(bus)๋ฅผ ์ฌ์ฉ.
- ์ค์์ฒ๋ฆฌ์ฅ์น
- ์ฐ์ ๋ ผ๋ฆฌ์ฅ์น(ALU) - ์ฐ์ /๋ ผ๋ฆฌ ์ฐ์ฐ ์ฒ๋ฆฌ
- ์ ์ด์ฅ์น(Control Unit) - CPU ์ ์ด
- ๋ ์ง์คํฐ(Register) - CPU์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ
- ๊ธฐ์ต์ฅ์น
- ์ฃผ๊ธฐ์ต์ฅ์น : ํ๋ก๊ทธ๋จ ์คํ ๊ณผ์ ์์ ํ์ํ ๋ฐ์ดํฐ ์์ ์ ์ฅ์ ์ฌ์ฉ
- ๋จ(Random-Access Memory, RAM)
- ๋ณด์กฐ๊ธฐ์ต์ฅ์น : ์ด์์ฒด์ , ํ๋ก๊ทธ๋จ๊ณผ ๊ฐ์ ๋ฐ์ดํฐ ์ฅ๊ธฐ๊ฐ ๋ณด๊ด์ ์ฌ์ฉ
- ํ๋ ๋๋ผ์ด๋ธ
- SSD
- ์ฃผ๊ธฐ์ต์ฅ์น : ํ๋ก๊ทธ๋จ ์คํ ๊ณผ์ ์์ ํ์ํ ๋ฐ์ดํฐ ์์ ์ ์ฅ์ ์ฌ์ฉ
- ๋ฒ์ค
- ๋ฐ์ดํฐ ๋ฒ์ค(Data Bus)
- ์ฃผ์ ๋ฒ์ค(Address Bus)
- ์ ์ด ๋ฒ์ค(Control Bus)
- ๋์
- ํ๋กํ ์ฝ
- ๋ ์ง์คํฐ๊ฐ ์กด์ฌํจ์๋ CPU ์์ ๋ ์ง์คํฐ๊ฐ ํ์ํ ์ด์
- CPU์ ์ฐ์ฐ์๋๊ฐ ๊ธฐ์ต์ฅ์น์์ ๋ฐ์ดํฐ ๊ตํ์๋๋ณด๋ค ์๋์ ์ผ๋ก ๋น ๋ฅด๊ธฐ ๋๋ฌธ์, ๊ธฐ์ต์ฅ์น๋ง์ ์ฌ์ฉํ๋ฉด ๋ณ๋ชฉํ์์ด ๋ฐ์. ๋ฐ๋ผ์ ๊ตํ์๋๋ฅผ ๋จ์ถํ๊ธฐ ์ํด ๋ ์ง์คํฐ์ ์บ์๋ผ๋ ์ ์ฅ์ฅ์น๋ฅผ ๋ด๋ถ์ ๊ฐ๊ณ ์์.
- ์ค์์ฒ๋ฆฌ์ฅ์น
x86-64 ์ํคํ ์ฒ
๐ถ x86 Assembly
Quiz: x86 Assembly 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[Register]
rbx = 0x401A40
=================================
[Memory]
0x401a40 | 0x0000000012345678
0x401a48 | 0x0000000000C0FFEE
0x401a50 | 0x00000000DEADBEEF
0x401a58 | 0x00000000CAFEBABE
0x401a60 | 0x0000000087654321
=================================
[Code]
1: mov rax, [rbx+8]
2: lea rax, [rbx+8]
Q1. ๋ ์ง์คํฐ, ๋ฉ๋ชจ๋ฆฌ ๋ฐ ์ฝ๋๊ฐ ๋ค์๊ณผ ๊ฐ๋ค. Code๋ฅผ 1๊น์ง ์คํํ์ ๋, rax์ ์ ์ฅ๋ ๊ฐ์?
โ 0xC0FFEE
Q2. Code๋ฅผ 2๊น์ง ์คํํ์ ๋, rax์ ๋ค์ด์๋ ๊ฐ์?
โ 0x401a48
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[Register]
rax = 0x31337
rbx = 0x555555554000
rcx = 0x2
=================================
[Memory]
0x555555554000| 0x0000000000000000
0x555555554008| 0x0000000000000001
0x555555554010| 0x0000000000000003
0x555555554018| 0x0000000000000005
0x555555554020| 0x000000000003133A
==================================
[Code]
1: add rax, [rbx+rcx*8]
2: add rcx, 2
3: sub rax, [rbx+rcx*8]
4: inc rax
Q3. ๋ ์ง์คํฐ, ๋ฉ๋ชจ๋ฆฌ ๋ฐ ์ฝ๋๊ฐ ๋ค์๊ณผ ๊ฐ๋ค. Code๋ฅผ 1๊น์ง ์คํํ์ ๋, rax์ ์ ์ฅ๋ ๊ฐ์?
โ 0x3133A
Q4. Code๋ฅผ 3๊น์ง ์คํํ์ ๋, rax์ ์ ์ฅ๋ ๊ฐ์?
โ 0
Q5. Code๋ฅผ 4๊น์ง ์คํํ์ ๋, rax์ ์ ์ฅ๋ ๊ฐ์?
โ 1
1
2
3
4
5
6
7
8
9
10
11
[Register]
rax = 0xffffffff00000000
rbx = 0x00000000ffffffff
rcx = 0x123456789abcdef0
==================================
[Code]
1: and rax, rcx
2: and rbx, rcx
3: or rax, rbx
Q6. ๋ ์ง์คํฐ, ๋ฉ๋ชจ๋ฆฌ ๋ฐ ์ฝ๋๊ฐ ๋ค์๊ณผ ๊ฐ๋ค. Code๋ฅผ 1๊น์ง ์คํํ์ ๋, rax์ ์ ์ฅ๋ ๊ฐ์?
โ 0x1234567800000000
Q7. Code๋ฅผ 2๊น์ง ์คํํ์ ๋, rbx์ ์ ์ฅ๋ ๊ฐ์?
โ 0x000000009ABCDEF0
Q8. Code๋ฅผ 3๊น์ง ์คํํ์ ๋, rax์ ์ ์ฅ๋ ๊ฐ์?
โ 0x123456789ABCDEF0
1
2
3
4
5
6
7
8
9
10
[Register]
rax = 0x35014541
rbx = 0xdeadbeef
==================================
[Code]
1: xor rax, rbx
2: xor rax, rbx
3: not eax
Q9. ๋ ์ง์คํฐ, ๋ฉ๋ชจ๋ฆฌ ๋ฐ ์ฝ๋๊ฐ ๋ค์๊ณผ ๊ฐ๋ค. Code๋ฅผ 1๊น์ง ์คํํ์ ๋, rax์ ์ ์ฅ๋ ๊ฐ์?
โ 0xEBACFBAE
Q10. Code๋ฅผ 2๊น์ง ์คํํ์ ๋, rax์ ์ ์ฅ๋ ๊ฐ์?
โ 0x35014541
Q11. Code๋ฅผ 3๊น์ง ์คํํ์ ๋, rax์ ์ ์ฅ๋ ๊ฐ์?
โ 0xCAFEBABE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[Register]
rcx = 0
rdx = 0
rsi = 0x400000
=======================
[Memory]
0x400000 | 0x67 0x55 0x5c 0x53 0x5f 0x5d 0x55 0x10
0x400008 | 0x44 0x5f 0x10 0x51 0x43 0x43 0x55 0x5d
0x400010 | 0x52 0x5c 0x49 0x10 0x47 0x5f 0x42 0x5c
0x400018 | 0x54 0x11 0x00 0x00 0x00 0x00 0x00 0x00
=======================
[code]
1: mov dl, BYTE PTR[rsi+rcx]
2: xor dl, 0x30
3: mov BYTE PTR[rsi+rcx], dl
4: inc rcx
5: cmp rcx, 0x19
6: jg end
7: jmp 1
Q12. end๋ก ์ ํํ๋ฉด ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋๋ค๊ณ ๊ฐ์ ํ์. ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋์ ๋, 0x400000 ๋ถํฐ 0x400019๊น์ง์ ๋ฐ์ดํฐ๋ฅผ ๋์๋๋ ์์คํค ๋ฌธ์๋ก ๋ณํํ๋ฉด?
1
2
3
4
5
6
7
8
9
# solve.py
mem = [0x67,0x55,0x5c,0x53,0x5f,0x5d,0x55,0x10,
0x44,0x5f,0x10,0x51,0x43,0x43,0x55,0x5d,
0x52,0x5c,0x49,0x10,0x47,0x5f,0x42,0x5c,
0x54,0x11,0x00,0x00,0x00,0x00,0x00,0x00]
for i in range(0x20):
print(chr(mem[i]^0x30), end="")
โ Welcome to assembly world!
Quiz: x86 Assembly 2
[Dreamhack] Quiz: x86 Assembly 2