[ASC ์คํฐ๋] 4์ฃผ์ฐจ - ๋ ์ง์คํฐ, ์ด์ ๋ธ๋ฆฌ, ์ฐ์ต๋ฌธ์ , GDB ์ฌ์ฉ๋ฒ
๐ ์ง๋ ์ฐจ์
( x86-64 ์ํคํ ์ฒ ๊ธฐ๋ฐ )
1. ๋ ์ง์คํฐ(Register)
CPU๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ์ ์ฅํ๊ณ ์ฌ์ฉํ ๋ ์ด์ฉํ๋ ๋ณด๊ด์์ด๋ค.
๋ฉ๋ชจ๋ฆฌ๋ ๋ณด์กฐ ๊ธฐ์ต ์ฅ์น๋ณด๋ค ๋น ๋ฅด๋ค.
1.1. 32๋นํธ ๋ ์ง์คํฐ โจ
- E๋ก ์์ํ๋ค.
ex) 32bit EAX > 16bit AX > 8bit AH + 8bit AL
- ๋ฐ์ดํฐ ๋ ์ง์คํฐ
(1) EAX(Accumulator)
์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๊ณ ํจ์ ๋ฐํ ๊ฐ์ ๋ด๋๋ค.
(2) ECX(Counter)
์ฃผ๋ก ์นด์ดํ ํ ๋ ์ฌ์ฉํ๋ค. ( for๋ฌธ์ i ๊ฐ์ด )
(3) EBX(Base)
์ฃผ๋ก ์ฃผ์์ ๊ธฐ๋ณธ ๊ฐ์ ์ ์ฅํ๋ค.
(4) EDX(Data)
์ฃผ๋ก ์ฐ์ฐํ ๋ ์ฌ์ฉํ๋ค.
- ์ธ๋ฑ์ค ๋ ์ง์คํฐ
(5) ESI(Source), EDI(Destination)
๊ฐ๊ฐ ์ถ๋ฐ์ง์ ๋ชฉ์ ์ง ์ฃผ์๋ฅผ ์ ์ฅํ๋ค. ( strcpy($ESI, $EDI); )
- ํฌ์ธํฐ ๋ ์ง์คํฐ
(6) EBP(Base Pointer)
ํ์ฌ ํจ์ ์คํ ํ๋ ์์ ๋ฒ ์ด์ค ์ฃผ์๋ฅผ ์ ์ฅํ๋ค.
(7) ESP(Stack Pointer)
ํ์ฌ ํจ์ ์คํ ํ๋ ์์ ์ต์๋จ ์ฃผ์๋ฅผ ์ ์ฅํ๋ค.
(8) EIP(Instruction Pointer)
๋ค์์ ์คํํ ์ด์ ๋ธ๋ฆฌ ๋ช ๋ น์ ์ฃผ์๋ฅผ ์ ์ฅํ๋ค.
- ์ํ ๋ ์ง์คํฐ
OF : ์ค๋ฒํ๋ก์ฐ ๋ฐ์์ 1๋ก ์ค์ , ๊ณ์ฐ ๊ฒฐ๊ณผ๊ฐ ํผ์ฐ์ฐ์์ ๋ฐ์ดํฐ ํ์ ์ ๋ฒ์ด๋๋ฉด 1, ๊ณ์ฐ๊ฒฐ๊ณผ๊ฐ ๋ถํธ๋นํธ๋ฅผ ์นจ๋ฒํ ๋
SF : ์ฐ์ฐ ๊ฒฐ๊ณผ๊ฐ ์์[๋ถํธ(์ต์์) bit๊ฐ 1]๋ฉด 1์ด๋ฉด 1๋ก ์๋๋ฉด 0์ผ๋ก ์ค์
ZF : ์ฐ์ฐ ๊ฒฐ๊ณผ๊ฐ 0์ด๋ฉด 1๋ก ์๋๋ฉด 0์ผ๋ก ์ค์ ( if๋ฌธ ๋น๊ต )
CF : 2์ง์ ๋ง์ ์์ ์๋ฆฌ ์ฌ๋ฆผ์ด ๋ฐ์ํ๋ฉด 1๋ก ์ค์ , ์ฐ์ฐ ๋ช ๋ น์ผ๋ก Carry(์๋ฆฌ ์ฌ๋ฆผ)์ด๋ Borrow(๋ถํธ ๋นํธ ์ ๋นํธ์ ๋ณ๊ฒฝ์ด ์๊น)๊ฐ ๋ฐ์ํ ๋ 1๋ก ์ค์
PF : ํ์ 8๋นํธ์์ 1์ ๊ฐ์๊ฐ ์ง์๋ฉด 1
AF : ํ์ 4๋นํธ์์ ์ฌ๋ฆผ ๋น๋ฆผ ๋ฐ์์ 1
( ๋ณธ๋ ์ฉ๋์ ๋ค๋ฅด๊ฒ ์ฌ์ฉํด๋ ๋ฌธ์ ๊ฐ ๋์ง ์๋๋ค. )
1.2. 64๋นํธ ๋ ์ง์คํฐ
- R๋ก ์์ํ๋ค.
- 32๋นํธ์ ๋ ์ง์คํฐ ์ญํ ์ ๋น์ทํ์ง๋ง ํจ์์ ์ธ์๋ฅผ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ์ด ๋ค๋ฅด๋ค.
- 32๋นํธ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ธ์๋ฅผ ์คํ์ pushํด์ ํจ์๋ฅผ ํธ์ถํ๋ค. func(1,2,3); => push 1 push 2 push 3 call
- 64๋นํธ๋ ๋ ์ง์คํฐ์ ์ธ์์ ๊ฐ์ ๋ด์ ํจ์๋ฅผ ํธ์ถํ๋ค. RDI, RSI, RDX, RCX, r8, r9 ... ์์๋๋ก ์ธ์๋ฅผ ๋ด๋๋ค.
(๋ฆฌํ์๋์ vs ๋น ์๋์)
int x = 0x12345678
์ฃผ์์ > ์ฃผ์ํฐ
Little : 0x78 > 0x56 > 0x34 > 0x12
Big: 0x12 > 0x34 > 0x56 > 0x78
2. ์ด์ ๋ธ๋ฆฌ ์ธ์ด(Assembly)
- ์ด์ ๋ธ๋ฌ : ์ด์ ๋ธ๋ฆฌ ์ธ์ด => ๊ธฐ๊ณ์ด
- ์ญ์ด์ ๋ธ๋ฌ : ๊ธฐ๊ณ์ด => ์ด์ ๋ธ๋ฆฌ ์ธ์ด
- ์ ์ ๋ถ์์ ๋ฐ์ด๋๋ฆฌ์ ํ๋ก๊ทธ๋จ ์ฝ๋๋ฅผ ์ฝ์ด์ ๋์์ ๋ถ์ํ๋ ๋ฐฉ๋ฒ ( IDA, GDB ์ด์ฉ )
- x86, x86-64 ์ด์ ์๋ AT&T, Intel ํ๊ธฐ๋ฒ์ด ์กด์ฌํจex) mov $5, %eax; mov eax, 5; > Intel ํ๊ธฐ๋ฒ์ด ์ข ๋ ์ฝ๊ธฐ ํธํจ
< x64 ์ด์ ๋ธ๋ฆฌ ์ธ์ด ๊ตฌ์กฐ >
mov eax, 3
๋์ฌ | ํผ์ฐ์ฐ์
Opcode | Operand1, Operand2
< ๋ช ๋ น์ด >
๋ช ๋ น ์ฝ๋ | |
๋ฐ์ดํฐ ์ด๋(Data Transfer) | mov, lea |
์ฐ์ ์ฐ์ฐ(Arithmetic) | inc, dec, add, sub |
๋ ผ๋ฆฌ ์ฐ์ฐ(Logical) | and, or, xor, not |
๋น๊ต(Comparison) | cmp, test |
๋ถ๊ธฐ(Branch) | jmp, jz, jnz, je, jne, jg, jge, jl, jle |
์คํ(Stack) | push($esp-=4), pop($esp+=4) |
ํ๋ก์์ ธ(Procedure) | call, ret, leave |
์์คํ ์ฝ(System call) | syscall |
- MOV [Destination] [Source]
Source์ ์๋ ๋ฐ์ดํฐ๋ฅผ Destination์ผ๋ก ์ฎ๊น
๋ฉ๋ชจ๋ฆฌ๋ ๋ ์ง์คํฐ์์ ๋ฐ์ดํฐ์ ์ด๋์ด๋ ๋์ ์
- LEA [Destination] [Source]
Source์ ์ง์ ๋ ์ฃผ์๋ฅผ Destination์ผ๋ก ๋ก๋
์ง์ญ๋ณ์๋ ๋งค๊ฐ๋ณ์์ & ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ ๋
- ADD OPR1 OPR2
OPR2์ ๊ฐ์ OPR1 ๊ฐ์ ๋ํด OPR1์ ์ ์ฅ
ex) add eax, ebx; eax = eax + ebx
- SUB OPR1 OPR2
OPR1์ ๊ฐ์ OPR2 ๊ฐ์ ๋นผ๊ณ OPR1์ ์ ์ฅ
ex) sub eax, ebx; eax = eax - ebx
- CMP VAL1 VAL2
VAL1๊ณผ VAL2์ ๊ฐ์ ๋น๊ต
ex)
VAL1 < VAL2 : ZF=0, CF=1
VAL1==VAL2 : ZF=1, CF=0
VAL1 > VAL2 : ZF=0, CF=0
- JMP ADDR
ํ๋ก๊ทธ๋จ์ ํ๋ฆ์ ๋ฐ๊ฟ ๋ ์ฌ์ฉ
$RIP ๋ ์ง์คํฐ์ ๊ฐ์ด ADDR ์ฃผ์๋ก ๋ฐ๋
- CALL TARGET
ํจ์ ํธ์ถํด ์คํ ํ๋ฆ ๋ณ๊ฒฝJMP ๋ช ๋ น์ด์ ๋ค๋ฅด๊ฒ ๋ค์ ๋ฆฌํด๋ ์ ์๋๋ก Return address๋ฅผ ์คํ์ ์ ์ฅ๋ค์ ์คํํ ๋ช ๋ น์ด์ ์ฃผ์๋ฅผ ์คํ์ ๋ฃ์
- Data Type
BYTE : 1๋ฐ์ดํธ(8bit) ๋ถํธ ์๋ ์ ์
WORD : 2๋ฐ์ดํธ(16bit) ๋ถํธ ์๋ ์ ์
DWORD : 4๋ฐ์ดํธ(32bit) ๋ถํธ ์๋ ์ ์
QWORD : 8๋ฐ์ดํธ(64bit) ๋ถํธ ์๋ ์ ์
๋ถํธ ์๋ ์ ์๋ ์์ S๋ฅผ ๋ถ์ธ๋ค.
TYPE PTR[ADDR] : ADDR์ TYPEํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ก ํ ๋ณํ
๋ฉ๋ชจ๋ฆฌ ํผ์ฐ์ฐ์ | |
QWORD PTR [0x8048000] | 0x8048000์ ๋ฐ์ดํฐ๋ฅผ 8byte๋งํผ ์ฐธ์กฐ |
DWORD PTR [esi] | $esi ํฌ์ธํฐ ์ฃผ์ ๊ฐ์ 4byte๋งํผ ์ฐธ์กฐ |
WORD PTR [rax] | $rax๊ฐ ๊ฐ๋ฅดํค๋ ์ฃผ์์์ ๋ฐ์ดํฐ๋ฅผ 2๋ฐ์ดํธ๋งํผ ์ฐธ์กฐ |
MOV rax, QWORD PTR[rsi] | $rsi ํฌ์ธํฐ ์ฃผ์ ๊ฐ์ $rax์ ๋์ |
ex) esp=0x12345678, *esp=100 | |
MOV eax, DWORD PTR[esp]; | $eax=100 |
LEA eax, DWORD PTR[esp]; | $eax=0x12345678 |
3. ์ฐ์ต๋ฌธ์
*esi = 0x12345678, eax = 0x87654321์ผ๋ mov eax, DWORD PTR[esi]; $eax์ ๊ฐ์?
*esi = 0x12345678, eax = 0x87654321์ผ๋ mov ax, WORD PTR[esi]; $eax์ ๊ฐ์?
*esi = 0x12345678, eax = 0x87654321์ผ๋ mov ah, BYTE PTR[esi]; $eax์ ๊ฐ์?
MOV AL, 100; ADD AL, 100; CMP AX, 200; ๋ช ๋ น์ ์ํ ํ ์ํ ๋ ์ง์คํฐ์ ๊ฒฐ๊ณผ๋?
( ํ์ด )
^.^
4. GDB ์ฌ์ฉ๋ฒ
- ๋๋ฒ๊น (debugging)์ด๋ ์ปดํจํฐ ํ๋ก๊ทธ๋จ ๊ฐ๋ฐ ์ค์ ๋ฐ์ํ๋ ์์คํ ์ ๋ ผ๋ฆฌ์ ์ค๋ฅ๋ ๋น์ ์์ ์ฐ์ฐ์ ์ฐพ์๋ด๊ณ ๊ทธ ์์ธ์ ๋ฐํ๊ณ ์์ ํ๋ ์์ ๊ณผ์ ์ด๋ค.
- ๋๋ฒ๊ฑฐ๋ ๋์ ํ๋ก๊ทธ๋จ์ ํ ์คํธํ๊ณ Debugํ๋๋ฐ ์ฐ์ด๋ ๋๊ตฌ(ํ๋ก๊ทธ๋จ)
ํ์ผ ์คํ
: gdb -q "ํ์ผ๋ช "
ํจ์ ๋์ค์ด์ ๋ธ
: disassemble main ( mainํจ์์ ๊ธฐ๊ณ์ด๋ฅผ ์ด์ ๋ธ๋ฆฌ์ด๋ก ๋ฐ๊พผ๋ค. )
AT&T -> intel
: set disassembly-flavor intel
๋ธ๋ ์ดํฌ ํฌ์ธํธ ๊ฑธ๊ธฐ
: b*main ( ์ฌ๋ณผ์ด ์์ ๋ )
: b*0x04005bd ( ํน์ ์ฃผ์ ๋ธ๋ ์ดํฌ ํฌ์ธํธ ๊ฑธ๊ธฐ )
๋ธ๋ ์ดํฌ ํฌ์ธํธ ์ญ์
: delete
: delete "๋ฒํธ"
์คํํ๊ธฐ
: r
: r arg1 arg2 ... ( ์ธ์๊ฐ ์๋ ๊ฒฝ์ฐ )
: continue ( ๋ค์ ๋ธ๋ ์ดํฌ ํฌ์ธํธ๊น์ง ์คํ )
: ni (ํ ์คํ ์ฉ ์คํ step over)
: si ( step into ) ํจ์๋ฅผ ๋ง๋๋ฉด ํจ์ ๋ด๋ถ๋ก ๋ค์ด๊ฐ
์ข ๋ฃํ๊ธฐ
: q or k
์ ๋ณดํ์ธ
: info reg ( ๋ ์ง์คํฐ ์ ๋ณด ํ์ธ )
: info break ( ๋ธ๋ ์ดํฌ ํฌ์ธํธ ๊ฑด ์์น ํ์ธ )
์คํ์ค์ธ ํ๋ก์ธ์ค gdb์ ๋ถ์ด๋ ๋ฒ
: at
๊ธฐํ ๊ฟํ
: finish ( ํ์ฌ ํจ์ ์ข ๋ฃ )
: stack [์ซ์] ( ์คํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ๊ฐ ํ์ธ ๊ฐ๋ฅ )
: libc, pie, ld, heap, code, got
: vmmap ( ๋ฉ๋ชจ๋ฆฌ๋งต ํ์ธ )
: p [name], p [register] ( printํด์ค, ๋ ์ง์คํฐ์๋ $๋ฅผ ๋ถ์ฌ์ ์ฐ๊ธฐ )
: bt ( back trace, ์ด์ ์ ์คํ๋ ํจ์๋ค ์ถ์ )
: set [ํ์ ] [์ฃผ์] ( ๊ฐ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ํน์ ์ฃผ์์ ๊ฐ ์ ์ฅ ๊ฐ๋ฅ )
: magic ( ํจ์ ์คํ์ ํ์ธ ๊ฐ๋ฅ )
์ฐ์ต๋ฌธ์ ํ์ด1 : gdb_test1
22๋ฒ์งธ ์ค scanf()์ ๋ธ๋ ์ดํฌ ํฌ์ธํธ ๊ฑธ๊ณ ์คํํด๋ณธ๋ค.
cmp๋ก 0x31337๊ณผ ๊ฐ์์ง ๋น๊ตํ๊ณ ์๋ค.
์ ๋ ฅ๊ฐ์ 0x31337๊ณผ ๋น๊ตํ์ฌ ๊ฐ์ผ๋ฉด return 1; ํด์ฃผ๋ฏ๋ก ์ ๋ ฅ๊ฐ์ผ๋ก 0x31337์ ๋ฃ๋๋ค.
ํ์ด์ฌ์ ์ฌ์ฉํด์ 16์ง์์์ 10์ง์๋ก ๋ฐ๊พผ๋ค.
์ฐ์ต๋ฌธ์ ํ์ด2 : gdb_test2
(ํ์ด๊ณผ์ )
test eax, eax : ๋ eax๊ฐ ๊ฐ์์ง ๋น๊ตํ๋ค.
jne : ์ง์ ์ ๋น๊ตํ ๋ ํผ์ฐ์ฐ์๊ฐ ๊ฐ์ง ์์ผ๋ฉด ์ ํ
์ ๋ต์ด ์๋ ๊ฐ์ ์ ๋ ฅํ์ ๋ 40์ผ๋ก ์ ํํ๋ ๊ฒ์ผ๋ก ๋ด์ eax,eax๊ฐ ๊ฐ์ง ์๋๋ณด๋ค.
eax, eax๋ฅผ ๊ฐ๊ฒ ๋ง๋ค์ด์ฃผ๋ฉด ๋๋ค. ==========> ์ด๋ป๊ฒ????
๋๊ฐ์ eax์ธ๋ฐ ์ ๋ค๋ฅผ ์ ์๋์ง ๋ชจ๋ฅด๊ฒ ์ด์ test eax, eax ์ด์ ์ฐ์ฐ๋ค์ ๊ฐ ๋ ์ง์คํฐ ๊ฐ๋ค์ ํ์ธํด๋ณด๊ธฐ๋ก ํ๋ค.
rax, eax ๋ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ด ์๋๋ค๊ณ ํ๋ค..!
์ค ์ด๊ฒ key ๊ฐ์ธ๊ฐ๋ณด๋ค. 10์ง์๋ก ๋ฐ๊ฟ์ ํ ์คํธ๋ก ๋ณํํด๋ดค๋๋ 'T'๋ผ๊ณ ๋์จ๋ค.. ( ์ T๋ง ๋์ค์ง )
ํ key๊ฐ์ด ๋์๋ค.. x/s '๋ฉ๋ชจ๋ฆฌ์ฃผ์' ๋ ๋ฌธ์์ด์ ํ์ธํ๋ ๋ช ๋ น์ด..! ๊ทธ๋ฌ๊ณ ๋ณด๋๊น ๋ฉ๋ชจ๋ฆฌ์ฃผ์๊ฐ ์๋๋ผ ์ค์๋ก ๋ ์ง์คํฐ ๋ฃ์๋๋ฐ ์ ๋ต์ด ๋์๋ค....์์ง ๋์ ์๋ฆฌ๋ฅผ ์ ๋ชจ๋ฅด๊ฒ ๋คใ
์คํฐ๋๋ ์ง๋ฌธํ๊ณ ์ดํดํด์ ๋ ์ถ๊ฐํ๊ฒ ๋ค..
โญ๊ณต๋ถํ ๊ฒ๋ค
1. ์ปดํจํฐ ๊ตฌ์กฐ
2. ๋ ์ง์คํฐ
3. ์ด์ ๋ธ๋ฆฌ
4. 16์ง๋ฒ
5. ๋๋ฒ๊ฑฐ๋ ์นํด์ง๊ธฐ