-
REVERSING ์์ํ๊ธฐ - ๊ธฐ์ด ๊ฐ๋ 4 :: ์ด์ ๋ธ๋ฆฌ ์ธ์ดSECURITY/REVERSING 2020. 7. 8. 17:13
์ด์ ๋ธ๋ฆฌ ์ธ์ด
: ์์ฐ์ด์ ๊ธฐ๊ณ์ด ์ฌ์ด๋ก, CPU ์ ๋ช ๋ น์ด๋ค์ ์์ด์ ์ฝ์์ธ ๊ธฐํธ๋ก ํ๊ธฐํ ๊ฒ์ด๋ค.
์ด ๊ธฐํธ๋ค์ CPU ์ ๋ช ๋ น์ด(๊ธฐ๊ณ์ด) ์ ์ผ๋์ผ ๋์ํ๋ค.
์ปดํจํฐ ๊ตฌ์กฐ์ ๋ฐ๋ผ ์ฌ์ฉํ๋ ๊ธฐ๊ณ์ด๊ฐ ๋ค๋ฅด๊ณ , ๊ทธ์ ๋ฐ๋ผ ๋ง๋ค์ด์ง๋ ์ด์ ๋ธ๋ฆฌ์ด๋ ๋ค๋ฅด๋ค.
๊ธฐ๊ณ์ด๋ณด๋ค๋ ๋์ ์์ค์์ ํ๋ก๊ทธ๋จ์ ์์ฑํ ์ ์๋ค.
* ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋ถ๋ฅ
๊ธฐ๊ณ์ด (machine language) <-> ์ด์ ๋ธ๋ฆฌ์ด(assembly language) <-> ๊ณ ๊ธ ์ธ์ด(high-level language)
๊ธฐ๊ณ์ด์ ์ด์ ๋ธ๋ฆฌ์ด๊ฐ ์ ๊ธ ์ธ์ด, Python, C, Java ๋ฑ์ด ๊ณ ๊ธ ์ธ์ด์ ์ํ๋ค.
* ์ด์ ๋ธ๋ฌ(assembler) : ๊ธฐํธ๋ฅผ ์ด์ง์๋ก ๋ณํํ๋ ํ๋ก๊ทธ๋จ
1 ๊ฐ์
1.1 AT&T ๋ฐฉ์๊ณผ Intel ๋ฐฉ์
์ด์ ๋ธ๋ฆฌ ์ธ์ด๋ AT&T ์ Intel ์ ๋ ๊ฐ์ง (์๋ก ํธํ๋์ง ์๋) ๋ฌธ๋ฒ์ ๊ฐ์ง๋ค.
AT&T ์์ Intel ์์ ์ ๋์ฌ ๋ ์ง์คํฐ '%;, ๊ฐ '$" movl #1, %a
int $0x8016์ง์ 'h' , 2์ง์ 'b' ,
6์ง์ '0'mov a, 1
int 80h์ ๋ฏธ์ฌ long ์ 'l' , word ๋ 'w' , byte ๋ 'b' ๋ฑ movw %ax, %bx
movl %eax, %ebx์์ byte ptr
dword str[ebx]์ ๋ฏธ์ฌ์ ๋ฐ๋ผ ์คํผ๋๋์ ํฌ๊ธฐ๋ ์ ํด์ง ์คํผ๋๋์ ์์น sourse (์๋ณธ) ๋ค์์ destination (๋ชฉ์ ์ง) instr sourse, dest destination (๋ชฉ์ ์ง)
๋ค์์ sourse (์๋ณธ)instr dest, source ๋ฉ๋ชจ๋ฆฌ
์คํผ๋๋๊ธฐ๋ณธ ๋ ์ง์คํฐ๊ฐ ( ) ์ฌ์ด movl (%eax), %ebx ๊ธฐ๋ณธ ๋ ์ง์คํฐ๊ฐ [ ] ์ฌ์ด mov ebx, [eax] ๋ช ๋ น ์ํ movl 0x20(%ebx),%eax mov eax, [ebx+20h] instr %segreg:disp(base, index, scale).foo instr foo, segreg:[base+index*scale+disp] 1.2 Opcode ์ Operands
๋ช ๋ น์ด๋ Opcode(์ฐ์ฐ์) ๋ถ๋ถ๊ณผ Operand(์ฃผ์) ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ๋๋ค.
Opcode (Operation Code) : ๋ช ๋ น์ด์์ ์ฐ์ฐ ๋์์ ์ง์ ํ๋ ๋ถ๋ถ
Operand : ์ฐ์ฐ์ ๋์. ์ฆ, Opcode ์ ๋์์ด ๋๋ ๋ฐ์ดํฐ์ ์์น(์ฃผ์)
์์ฝํ์๋ฉด, ๋ช ๋ น์ด์ ์ธ์!
* Opcode ๋ Operand ์ ๊ฐ์์ ๋ฐ๋ผ 0-์ฃผ์ ๋ช ๋ น, 1-์ฃผ์ ๋ช ๋ น, 2-์ฃผ์ ๋ช ๋ น, 3-์ฃผ์ ๋ช ๋ น์ผ๋ก ๊ตฌ๋ถํ ์ ์๋ค.
0-์ฃผ์ ๋ช ๋ น : ๋จํญ ์ฐ์ฐ. ex. PUSH, POP
1-์ฃผ์ ๋ช ๋ น : ๋์ฐ๊ธฐ(Accumulator)๋ฅผ ์ด์ฉํ์ฌ ์ฐ์ฐ ์ํ
2-์ฃผ์ ๋ช ๋ น : ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์ฐ์ฐ์ ํํ. ์ฐ์ฐ ํ ์ ๋ ฅ ์๋ฃ์ ๊ฐ์ด ๋ณํํ๋ค.
(๊ฒฐ๊ณผ๊ฐ ์ ์ฅ๊ณผ ์ ๋ ฅ ์๋ฃ๋ฅผ ์ํ ๋ operand)
3-์ฃผ์ ๋ช ๋ น : ์ฐ์ฐ ํ ์ ๋ ฅ ์๋ฃ์ ๊ฐ์ด ๋ณด์กด๋๋ค. ๋ช ๋ น์ด์ ์ํ ์๊ฐ์ด ๊ฐ์ฅ ๊ธธ์ง๋ง ํ๋ก๊ทธ๋จ์ ๊ธธ์ด๋ ๊ฐ์ฅ ์งง๋ค.
(ํ operand ๋ ๊ฒฐ๊ณผ๊ฐ ์ ์ฅ, ๋๋จธ์ง ๋ operand ๋ ์ ๋ ฅ ์๋ฃ)
2 ๋ช ๋ น์ด
๋ช ๋ น์ด ์ํ ๋ด์ฉ ๋ช ๋ น์ด ์ํ ๋ด์ฉ MOV ๊ฐ์ ๋ฃ๋ ์ญํ (๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋จ)
(๋ฐ์ดํฐ ์ด๋)LEA ์ฃผ์๋ฅผ ๋ฃ๋ ์ญํ
(๋ฉ๋ชจ๋ฆฌ์ ์คํ์ ๊ฐ์ ๋ ์ง์คํฐ๋ก ๋ก๋)
Load Effective Address to RegisterPUSH Stack ์ ๋ฃ๊ธฐ POP Stack ์์ ๊ฐ์ ธ์ค๊ธฐ ADD (CARRY ๋ฅผ ํฌํจํ์ง ์๊ณ ) ๋ํ๊ธฐ SUB (CARRY ๋ฅผ ํฌํจํ์ง ์๊ณ ) ๋นผ๊ธฐ MUL ๊ณฑํ๊ธฐ DIV ๋๋๊ธฐ INC Operand ๋ด์ฉ์ 1 ์ฆ๊ฐ DEC Operand ๋ด์ฉ์ 1 ๊ฐ์ AND ๋ ผ๋ฆฌ AND ๊ฒ์ดํธ OR ๋ ผ๋ฆฌ OR ๊ฒ์ดํธ XOR ๋ฐฐํ ๋ ผ๋ฆฌ ํฉ (Exclusive OR) NOT ๋นํธ ๋ฐ์ (1์ ๋ณด์) CMP ๋ Operand ๋น๊ต
Compare
(๋ ๊ฐ์ ๋นผ์ ๊ฐ์ผ๋ฉด 0 -> ZF ๊ฐ 1)JMP Operand ์์น๋ก ์ ํ (JUMP)
(์ฃผ์๋ฅผ ์ง์ ์ง์ ํ ์๋, ๋ ์ง์คํฐ๋ฅผ ์ค ์๋ ์์)JE ๋น๊ต ๊ฒฐ๊ณผ๊ฐ ๊ฐ์ผ๋ฉด ์ ํ (๋ถ๊ธฐ)
Jump on EqualJNE ๋น๊ต ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅด๋ฉด ์ ํ (๋ถ๊ธฐ)
Jump on Not Equal
ZF ๊ฐ 0 ์ด์ด์ผ JNE ์์์ ์ฃผ์๋ก ๋์ด๊ฐNOP No OPeration
์๋ฌด ๋ช ๋ น๋ ์ํํ์ง ์๋ ์ฝ๋
NOP ๋ช ๋ น์ด ์์ฒด๋ 1 byte ์ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง๊ณ , ๋ช ๋ น์ด ์ฌ์ด์ ๋น๊ณต๊ฐ์ ์ฑ์์ค๋ค.
์ฐ๋ ๊ธฐ ๊ฐ. ๊ณต๊ฐ ์ฑ์ฐ๋ ~ like ์ง์CALL ํ๋ก์์ ํธ์ถ
(์ด ๋ช ๋ น์ด๊ฐ ์คํ๋๋ฉด ๋ณต๊ท ์ฃผ์๋ฅผ Stack ์ PUSH)RET CALL ๋ก (Stack ์ PUSH ๋ ์ฃผ์๋ก) ๋ณต๊ท
Return from CALL3. ์ฃผ์ ์ง์ ๋ฐฉ์
- ๋ ์ง์คํฐ ์ฃผ์ ์ง์ (Immediate Addressing)
: ๋ ์ง์คํฐ์ ์ฃผ์ ๊ฐ์ ์ง์ ์ง์
์ฒ๋ฆฌ ์๋๊ฐ ๊ฐ์ฅ ๋น ๋ฅด๋ค. (โต ๋ ์ง์คํฐ๊ฐ CPU ์์ ์์ผ๋ฏ๋ก ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ๋ ์ํธ ์์ฉํ ํ์๊ฐ ์๋ค.)
ex. mov edx, eax
- ์ง์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ ์ง์ (Direct Addressing)
: ๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์๋ฅผ ์ง์ ์ง์ ํ๋ ๋ฐฉ์
์ฆ, ์ฃผ์ ํ๋์ ์ ํจ ์ฃผ์(=Operand ์ ์ฃผ์)๋ฅผ ์ง์ ์ ์ฅํ๋ค.
๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์ฃผ์ ์ง์ ๋ฐฉ์์ด๋ค.
ํ ๋ฒ์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ๋ง ์์ผ๋ฉด ๋๋ค.
(์ฃผ๋ก ํผ์ฐ์ฐ์ ํ๋๊ฐ ๋ฉ๋ชจ๋ฆฌ ์์น๋ฅผ ์ฐธ์กฐํ๊ณ ๋ค๋ฅธ ํ๋๊ฐ ๋ ์ง์คํฐ๋ฅผ ์ฐธ์กฐํ๋ค.)
ex. mov eax, [8080h]
- ๋ ์ง์คํฐ ๊ฐ์ ์ฃผ์ ์ง์ (Indirect Affressing)
: ๋ ์ง์คํฐ์ ์ฃผ์๊ฐ์ ๋ฃ์ด์ฃผ๊ณ , ํด๋น ์ฃผ์์ ๊ฐ์ ๋์ ํ๋๋ก ๋ง๋ ๊ฒ์ด๋ค. (์ฝ๊ฒ ๋งํ๋ฉด ํฌ์ธํฐ)
์ฃผ์ ํ๋์ Operand ๊ฐ ์ ์ฅ๋ ๊ธฐ์ต์ฅ์น ์ฃผ์๊ฐ์ ๊ฐ๊ณ ๋ ์ง์คํฐ๋ฅผ ์ง์ ํ๋ ๋ฐฉ์
์ฆ, ์ฃผ์ ํ๋์ ์ ํจ ์ฃผ์๊ฐ ์ ์ฅ๋์ด ์๋ ๊ธฐ์ต์ฅ์น ์ฃผ์๋ฅผ ์ ์ฅํ๋ค.
๋ ๋ฒ์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ด ์์ด์ผ ํ๋ค.
(์ธ๊ทธ๋จผํธ(Seagment) : ์คํ์ (offset) ํ์)
ex. DS:[BX]
- ์ธ๋ฑ์ค ์ฃผ์ ์ง์
: ๋ ์ง์คํฐ ๊ฐ์ ์ง์ ๋ฐฉ์์ ๋ณ์๊ฐ ๋ํด์ง ๋ฐฉ์ (์ฝ๊ฒ ๋งํ๋ฉด ๋ฐฐ์ด)
ex. [BX + 20h]
- ๋ฒ ์ด์ค ๋ ์ง์คํฐ ์ฃผ์ ์ง์
: ์ค์ ์ฃผ์ ์์ฑ์ ์ํด ๋ฒ ์ด์ค ๋ ์ง์คํฐ (BX/BP) ์ ์ธ๋ฑ์ค ๋ ์ง์คํฐ (DI/SI) ๋ฅผ ๊ฒฐํฉ์ฃผ๋ก 2์ฐจ์ ๋ฐฐ์ด์ ์ฃผ์ ์ง์ ์ ์ฌ์ฉํ๋ค.
ex. [BX + SI]
- ๋ณ์๋ฅผ ๊ฐ๋ ์ธ๋ฑ์ค ์ฃผ์ ์ง์
: ์ค์ ์ฃผ์ ์์ฑ์ ์ํด ๋ฒ ์ด์ค ๋ ์ง์คํฐ, ์ธ๋ฑ์ค ๋ ์ง์คํฐ, ๋ณ์ ๊ฒฐํฉ
ex. [BX + SI + 20h]
๋ ์ง์คํฐ ๊ฐ์ ์ฃผ์ ์ง์ , ์ธ๋ฑ์ค ์ฃผ์ ์ง์ , ๋ฒ ์ด์ค ,, ๋ฑ๋ฑ ๋น์ทํด ๋ณด์ด์ง๋ง ์ฐจ์ด๋ ์ฉ๋ !!!
์ฉ๋์์ ์ฐจ์ด๋ฅผ ๋ณด์ธ๋ค.
4. call
- ์์คํ ์ฝ (System call) ์ด๋
: ์์ฉ ํ๋ก๊ทธ๋จ์์ ์ด์ ์ฒด์ ์๊ฒ ์ด๋ ํ ๊ธฐ๋ฅ์ ์ํํด๋ฌ๋ผ๊ณ ์์ฒญํ๋ ํ๋์ ์๋จ
User mode ์์ ์ด์ ์ฒด์ (kernel mode) ์ ๋ช ๋ น์ ์ฌ์ฉํ๊ธฐ ์ํด ์ฐ๋ ๊ฒ์ด๋ค.
(์ฌ์ฉ์๊ฐ ๋ง๊ตฌ ์ ๊ทผํ๋ฉด ๊ณค๋ํ ๊ทธ๋ฐ ๊ฒ๋ค...)
์ข ๋ฅ: ํ๋ก์ธ์ค ์ ์ด (Porcess Control), ํ์ผ ์กฐ์(File Manipulation), ์ฅ์น ๊ด๋ฆฌ (Device Management), ์ ๋ณด ์ ์ง (Information Maintenance), ํต์ (Communication)
ex. open(), read(), write() ...
์ฃผ์ ! printf() ๋ system call ์ ์๋๊ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ !!!! (stdio.h)
5. ํจ์
- ํจ์ ํ๋กค๋ก๊ทธ
๋ฒ ์ด์ค ํฌ์ธํฐ (EBP) ๋ฅผ Stack ์ ์ ์ฅํ๊ณ ํ์ฌ ์คํ ํฌ์ธํฐ (ESP) ๋ฅผ ๋ฒ ์ด์ค ํฌ์ธํฐ์ ์ ์ฅํ๋ค.
ํจ์๊ฐ ํธ์ถ (CALL) ๋ ๋, ์คํ ํ๋ ์(Stack Frame) ์ ๊ตฌ์ฑํด์ฃผ๋ ์์ ์ ์ผ์ปซ๋๋ค.
push eip
push ebp (SFP)
mov ebp, esp
- ํจ์ ์ํ๋ก๊ทธ
ํ์ฌ ์คํ ํฌ์ธํฐ๋ฅผ ๋ฒ ์ด์ค ํฌ์ธํฐ๋ก ๋ฐ๊พผ ํ RET ์ ํตํด ๋ค์ ์ฃผ์๋ก ์ ํํ๋ค.
ํจ์์ ์ํ ๊ณผ์ ์ ํตํด ESP ๊ฐ ๋ณ๊ฒฝ๋์์ ์ ์๋๋ฐ, ์ด ํ์ EBP ์ ๋๊ธฐํํด์ฃผ๋ ์์ ์ด๋ค.
mov esp, ebp (leave)
pop ebp (leave)
ret
(ret ::
pop eip
jmp eop)
(* 64 bit ํ๊ฒฝ์์๋ esp / ebp ๊ฐ ํ์ฅ๋์ด rsp / rbp ๊ฐ ๋๋ค.)
๋ฐ๋ผ์ ํจ์ ํธ์ถ์ ์ ์ฒด ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
1. ํจ์๊ฐ ์ฌ์ฉํ Parameter ์ Stack ์ ๋ฃ๊ณ ํจ์์ ์์ ์ง์ ์ผ๋ก ์ ํ << CALL
2. ํจ์ ๋ด์์ ์ฌ์ฉํ ์คํ ํ๋ ์ ์ค์ << ํ๋กค๋ก๊ทธ
3. ํจ์ ์ํ
4. ์ฒ์ ์ํํ ์ง์ ์ผ๋ก ๋์๊ฐ๊ธฐ ์ํด ์คํ์ ๋ณต์ << ์ํ๋ก๊ทธ
์ฆ, ํ๋กค๋ก๊ทธ์ ์ํ๋ก๊ทธ๋ ์คํ ํ๋ ์์ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ฉฐ ๋ง์ง๋ง์ ๋๊ธฐํํด์ฃผ๋ ์์ !
* Stack Frame ์คํ ํ๋ ์
: (ESP ๊ฐ ์๋) EBP ๋ ์ง์คํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์คํ ๋ด์ ๋ก์ปฌ ๋ณ์, ํ๋ผ๋ฏธํฐ, ๋ณต๊ท ์ฃผ์์ ์ ๊ทผํ๋ ๊ธฐ๋ฒ
์ฆ, ๊ฐ ํจ์๊ฐ ์ฌ์ฉํ๋ ์คํ์ ์์ญ!
* EIP
EIP (Extended Instruction Pointer) : ํ์ฅ๋ ๋ช ๋ น ์ง์์.
๋ค์์ CPU ๊ฐ ํด์ผ ํ ์ผ(๋ฉ๋ชจ๋ฆฌ์, CODE ์ ์ฃผ์)์ ๊ธฐ์ต
'SECURITY > REVERSING' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฆฌ๋ ์ค(Linux) ๊ธฐ์ด - 01 ๋ช ๋ น์ด (0) 2020.07.14 REVERSING ์์ํ๊ธฐ - VMware & Ubuntu Linux 32 bit and 64 bit ์ค์นํ๊ธฐ (1) 2020.07.09 REVERSING ์์ํ๊ธฐ - ๊ธฐ์ด ๊ฐ๋ 3 :: Endian (0) 2020.07.08 REVERSING ์์ํ๊ธฐ - ๊ธฐ์ด ๊ฐ๋ 2 :: ๋ ์ง์คํฐ(Register) (0) 2020.07.08 REVERSING ์์ํ๊ธฐ - ๊ธฐ์ด ๊ฐ๋ 1 :: ๋ฉ๋ชจ๋ฆฌ ์์ญ(RAM) (0) 2020.07.08