์ƒˆ์†Œ์‹

์ธ๊ธฐ ๊ฒ€์ƒ‰์–ด

๐Ÿ“  Secure

2022-06-23

  • -
๋ฐ˜์‘ํ˜•

์˜ค๋Š˜ ์ˆ˜์—… ๋ชฉํ‘œ

1. ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ํ•˜๊ธฐ (์„œ๋ฒ„ ๋ฐ ๋„คํŠธ์›Œํฌ ๋“ฑ, ๊ธฐ๋ณธ ์ธํ”„๋ผ ๊ตฌ์ถ•)
- ์˜ค์ „ -
2. ์œˆ๋„์šฐ PE
- ์˜คํ›„ -
3. GSN3 ์™ธ๋ถ€ ์ธํ„ฐ๋„ท ์—ฐ๊ฒฐ
- ์˜คํ›„ -

Inside : DB, Win7, Win10
DMZ : Web, Mail, DNS, NTP

Image_NT_headers32
 - Signature
 - Image_File_headers32
 - Image_Optional_header32
- address of entry point
- Image base

RVA
VA



Section Alignment : 0000 1000
File Alignment : 0000 0200
--> ํด๋Ÿฌ์Šคํ„ฐ์™€ ๋น„์Šทํ•œ ์—ญํ• ์„ ํ•œ๋‹ค
Section = ๋ฉ”๋ชจ๋ฆฌ
file = ํŒŒ์ผ

Number Of Rva And Sizes : 0000 0010
-> Image_Data_Directory์˜ ๋ฐฐ์—ด ๊ฐœ์ˆ˜
 - 16๊ฐœ Data Driectrory๊ฐ€ ์กด์žฌํ•œ๋‹ค.

158๋ถ€ํ„ฐ ์‹œ์ž‘
Data Directory[0] -> Export
 -> 0000 0000 / 0000 0000
Data Directory[1] -> Import
 -> 0000 7604 / 0000 00C8
..
..
..
Data Directory[F] -> 
--- ์œ„์—์„œ ๊ตฌํ•œ ์ฃผ์†Œ๊ฐ’์€ ๋‚˜์ค‘์— INT IAT์™€ EAT์—์„œ ์‚ฌ์šฉํ•  ์˜ˆ์ •
INT = Import Name Table
IAT = Import Application Table



-----------------------------------------NT ํ—ค๋” ๋ ----------
๊ฐ ์˜์—ญ๋ณ„(text, data, rsrc) ํ—ค๋” ๋ณด๊ธฐ
์˜์—ญ๋ณ„ ํ—ค๋”์˜ ๊ตฌ์กฐ๋Š” ์ „๋ถ€ ๋™์ผํ•˜๋‹ค

typedef struct _IMAGE_SECTION_HEADER {
  BYTE  Name[IMAGE_SIZEOF_SHORT_NAME];
  union {
    DWORD PhysicalAddress;
    DWORD VirtualSize;  -> ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์„น์…˜์ด ์ฐจ์ง€ํ•˜๋Š” ํฌ๊ธฐ
  } Misc;
  DWORD VirtualAddress;  -> ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์„น์…˜์ด ์‹œ์ž‘ํ•˜๋Š” ์ฃผ์†Œ(RVA)
  DWORD SizeOfRawData;  -> ํŒŒ์ผ์—์„œ ์„น์…˜์ด ์ฐจ์ง€ํ•˜๋Š” ํฌ๊ธฐ
  DWORD PointerToRawData; -> ํŒŒ์ผ์—์„œ ์„น์…˜์ด ์‹œ์ž‘ํ•˜๋Š” ์ฃผ์†Œ
  DWORD PointerToRelocations;
  DWORD PointerToLinenumbers;
  WORD  NumberOfRelocations;
  WORD  NumberOfLinenumbers;
  DWORD Characteristics;  -> ์†์„ฑ
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;

=== text section header ===
VirtualSize : 0000 7748 ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์„น์…˜์ด ์ฐจ์ง€ํ•˜๋Š” ํฌ๊ธฐ
VirtualAddress : 0000 1000 ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์„น์…˜์ด ์‹œ์ž‘ํ•˜๋Š” ์ฃผ์†Œ
SizeOfRawData : 0000 7800 ํŒŒ์ผ์—์„œ ์„น์…˜์ด ์ฐจ์ง€ํ•˜๋Š” ํฌ๊ธฐ
PointerToRawData : 0000 0400 ํŒŒ์ผ์—์„œ ์„น์…˜์ด ์‹œ์ž‘ํ•˜๋Š” ์ฃผ์†Œ

=== data section header ===
VirtualSize : 0000 1BA8
VirtualAddress : 0000 9000
SizeOfRawData : 0000 0800
PointerToRawData : 0000 7C00

=== rsrc section header ===
VirtualSize : 0000 8304
VirtualAddress : 0000 B000
SizeOfRawData : 0000 8400
PointerToRawData : 0000 8400


----->
RVA(๋ฉ”๋ชจ๋ฆฌ) to RAW(ํŒŒ์ผ์— ์žˆ์„ ๋•Œ)

ํŠน์ • ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ€ ๋‚˜์™”์„ ๋•Œ
์ด ์œ„์น˜(HxD๋กœ ๋ณผ ์ˆ˜ ์žˆ๋Š”)๋ฅผ ์ฐพ์•„์•ผ ํ•œ๋‹ค!

๊ณต์‹ :
RAW = (๋‚ด๊ฐ€ ์ฐพ๋Š”)RVA - Virtual Address + Point to Raw Data

RVA : 5000์ผ ๋•Œ RAW(offset ์ฃผ์†Œ)๋Š” ๋ฌด์—‡์ผ๊นŒ์š”?
RAW : RVA(5000) - VA(1000) + PRD(400) = 4400


RVA : 13314์ผ ๋•Œ RAW(offset ์ฃผ์†Œ)๋Š” ๋ฌด์—‡์ผ๊นŒ์š”?
RAW : RVA(13314) - VA(B000) + PRD(8400) = 10714


RVA : ABA8์ผ ๋•Œ RAW(offset ์ฃผ์†Œ)๋Š” ๋ฌด์—‡์ผ๊นŒ์š”?
RAW : RAV(ABA8) - VA(9000) + PRD(7C00) = 97A8




# ip route 0.0.0.0 0.0.0.0 192.168.0.1
# access-list 1 permit 192.168.100.0 0.0.0.255
# ip nat inside source list 1 int fa0/1 over
# int fa0/0
# ip nat inside
# int fa0/1
# ip nat outside
# exit




INT / IAT
(Import ๊ด€๋ จ Table)


๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ / DLLํŒŒ์ผ SYSํŒŒ์ผ
์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰ํ•  ๋•Œ

DOS์‹œ์ ˆ์— 
๊ด€๋ จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ์ „๋ถ€ ํฌํ•จํ•ด์„œ ์ฝ”๋”ฉ

ํ•จ์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์‹์œผ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“ค์ž

kernel32.dll ๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์•ˆ์—
์—ฌ๋Ÿฌ๊ฐœ์˜ ํ•จ์ˆ˜๋“ค

Import Name Table  -> DLL ์ด๋ฆ„์„ ์ฐพ๊ณ 
Import Application Table -> ํ•จ์ˆ˜๋ฅผ ์ฐพ๋Š”๋‹ค


IAT INT




Data Directory[1] -> Import
 -> 0000 7604(RVA) = ์œ„์น˜
     7604(RVA) - 1000(VA) + PDR(400) = 6A04 
 -> 0000 00C8(RVA) = ํฌ๊ธฐ


IMAGE_IMPORT_DESCRIPTOR {
    union {
        DWORD   Characteristics;            
        DWORD   OriginalFirstThunk;       // INT(Import Name Table) address (RVA)
    };
    DWORD   TimeDateStamp;
    DWORD   ForwarderChain;
    DWORD   Name;                         // library name string address (RVA)
    DWORD   FirstThunk;                   // IAT(Import Address Table) address (RVA)
} IMAGE_IMPORT_DESCRIPTOR;



1. NAME์˜ ์œ„์น˜๋ฅผ ๋”ฐ๋ผ๊ฐ€์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(DLL)์˜ ์ด๋ฆ„์„ ํŒŒ์•…ํ•œ๋‹ค. (O)
2. OriginalFirstThunk(INT)์˜ ์ฃผ์†Œ๋ฅผ ๋”ฐ๋ผ๊ฐ€์„œ ํ•จ์ˆ˜ ์‹œ์ž‘ ์ฃผ์†Œ๋ฅผ ํŒŒ์•…ํ•œ๋‹ค.
3. FirstThunk(IAT)์˜ ์ฃผ์†Œ๋ฅผ ๋”ฐ๋ผ๊ฐ€์„œ ์‹ค์ œ ๋กœ๋”ฉ ์ฃผ์†Œ๋ฅผ ํŒŒ์•…ํ•œ๋‹ค.



2. OriginalFirstThunk 0000 7990
-> 7990 -> 6D90
--> 7A7A -> 6E7A : PageSetupDlgW

1. Name 0000 7AAC
-> 7AAC --> 6EAC : comdlg32.dll

3. FirstThunk 0000 12C4
-> 12C4 --> 6C4 : 76324906

010012C4

comdlg32.dll ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์•ˆ์— PageSetupdlgW ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ




EAT
Export Application Table

EAT ์‹œ์ž‘ ์ฃผ์†Œ : 0000262C
-> 262C -> 1A2C
EAT ์‚ฌ์ด์ฆˆ : 00006CFD


EAT IAT์˜ ์ฐจ์ด์ 
IAT๋Š” Import๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์˜ด
EAT๋Š” ๋ณด๋‚ด๋Š” ์—ญํ• ๋งŒ ํ•˜๊ธฐ๋•Œ๋ฌธ์— ๋‹จ ํ•œ๊ฐœ๋งŒ ์กด์žฌ
์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์•ˆ์— ๋‹ค์ˆ˜์˜ ํ•จ์ˆ˜
๊ทธ๋ž˜์„œ ๊ทธ ํ•จ์ˆ˜๋ณ„๋กœ ๋ฐฐ์—ด(Oridnal, ์„œ์ˆ˜)์ด ์กด์žฌ

typedef struct _IMAGE_EXPORT_DIRECTORY {
DWORD Characteristics
DWORD TimeDateStamp
WORD MajorVersion
WORD MinorVersion
DWORD Name -> kernel32.dll
DWORD Base
DWORD NumberOfFunctions -> kernel32.dll์˜ ํ•จ์ˆ˜ ๊ฐœ์ˆ˜
DWORD NumberOfNames -> kernel32.dll์˜ ์ด๋ฆ„์„ ๊ฐ€์ง„ ํ•จ์ˆ˜ ๊ฐœ์ˆ˜
DWORD AddressOfFunctions -> // ํ•จ์ˆ˜ ์ฃผ์†Œ ๋ฐฐ์—ด(EAT)
DWORD AddressOfNames -> //ํ•จ์ˆ˜๋ช… ๋ฐฐ์—ด
DWORD AddressOfNameOrdinals -> // ํ•จ์ˆ˜ ์„œ์ˆ˜ ๋ฐฐ์—ด
} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY


AddressOfFunctions ๋Š” ์‹ค์ œ ํ•จ์ˆ˜ ์‹œ์ž‘ ์ฃผ์†Œ๊นŒ์ง€์˜ offset ๋ฐฐ์—ด์„ ๊ฐ€๋ฆฌํ‚ด
AddressOfNames ๋Š” ํ•จ์ˆ˜ ์ด๋ฆ„์˜ ๋ฐฐ์—ด์„ ๊ฐ€๋ฆฌํ‚ด
AddressOfNameOrdinals ๋Š” ํ•จ์ˆ˜์˜ Ordinal ๋ฐฐ์—ด์„ ๊ฐ€๋ฆฌํ‚ด


DWORD NumberOfFunctions -> 03B9
DWORD NumberOfNames -> 03B9

DWORD AddressOfFunctions -> RVA 2654 -> RAW 1A54
DWORD AddressOfNames -> RVA 3538 -> 2938
DWORD AddressOfNameOrdinals -> RVA 441C -> 381C


1. AddressOfNames์œผ๋กœ kernel32.dllํŒŒ์ผ์˜ ํ•จ์ˆ˜ ๋ฐฐ์—ด๋กœ ์ด๋™
-> 3๋ฒˆ์งธ ๋ฐฐ์—ด์ธ index[2] 4BB3(3FB3)๋กœ ์ด๋™
-> 3FB3๋กœ ์ด๋™ํ•˜๋ฉด AddAtomW๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ๋‚˜์˜จ๋‹ค
  -> orinal 2๋ฒˆ์ธ ํ•จ์ˆ˜

2. AddressOfNameOrdinals ์œผ๋กœ orianl์„ ํ™•์ธํ•œ๋‹ค


3. AddressOfFunctions์œผ๋กœ ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋กœ๋”ฉ๋˜๋Š” ๊ฐ’์„ ๊ตฌํ•œ๋‹ค.
0003 26D9
7C80 0000

7C83 26D9



๊ณผ์ œ
Helloworld.exe ํŒŒ์ผ์˜ WindowsPE๋ถ„์„์„ ์‹ค์‹œํ•˜์‹œ์˜ค
1. Section์˜ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์œ„์น˜์™€ ๊ฐ’์„ ์ฐพ์œผ์‹œ์˜ค.
์œ„์น˜ : 000000EE ๊ฐœ์ˆ˜ : 4๊ฐœ
2. Optional Header์˜ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์œ„์น˜์™€ ๊ฐ’์„ ์ฐพ์œผ์‹œ์˜ค.
์œ„์น˜ : 000000FC  ๊ฐ’ : E0
3. Address of EntryPiont์˜ ์—ญํ•  ๋ฐ ์œ„์น˜์™€ ๊ฐ’์„ ์ฐพ์œผ์‹œ์˜ค.
์—ญํ•  : ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ๊ฐˆ ๋•Œ ์‹œ์ž‘์  ๊ฐ’ : 11A0
4. Image Base ์—ญํ•  ๋ฐ ์œ„์น˜์™€ ๊ฐ’์„ ์ฐพ์œผ์‹œ์˜ค.
์—ญํ•  : ๊ฐ„์ ‘์ฃผ์†Œ๋ฐฉ์‹์—์„œ ๊ธฐ์ค€์  ๊ฐ’ 00400000
5. Section Alignment์™€ File Alignment์˜ ์œ„์น˜์™€ ๊ฐ’์„ ์ฐพ์œผ์‹œ์˜ค
Section : 1000 , File : 200
6. ๊ฐ ์„น์…˜์˜ offset ๋ฐ address ์‹œ์ž‘ ์œ„์น˜์™€ ํฌ๊ธฐ๋ฅผ ์ฐพ์œผ์‹œ์˜ค.
--text Section
์‹œ์ž‘์œ„์น˜ : 1000 ์‹œ์ž‘์œ„์น˜ : 400
์ด ํฌ๊ธฐ : 60A4 ์ด ํฌ๊ธฐ : 6200

--rdata Section
์‹œ์ž‘์œ„์น˜ : 8000 ์‹œ์ž‘์œ„์น˜ : 6600
์ด ํฌ๊ธฐ : 1BB0 ์ด ํฌ๊ธฐ : 1C00

--data Section
์‹œ์ž‘์œ„์น˜ : A000 ์‹œ์ž‘์œ„์น˜ : 8200
์ด ํฌ๊ธฐ : 18DC ์ด ํฌ๊ธฐ : E00

7. user32.dll์˜ INT์™€ IAT์˜ ์œ„์น˜๋ฅผ ์ฐพ์œผ์‹œ์˜ค
Import์˜ ์‹œ์ž‘ ์œ„์น˜(RVA) : 965C[7C5C]
Import์˜ ์ด ํฌ๊ธฐ : 3C

INT : 977C[7D7C] -> 0000 9784 -> 00409784
NAME : 9792[7D92] -> USER32.DLL
IAT : 80E4 -> 004080E4 MessageBoxW



11B0

๋ฐ˜์‘ํ˜•

'๐Ÿ“  Secure' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

SQL Injection  (0) 2022.06.29
2022-06-27  (0) 2022.06.28
2022-06-22  (0) 2022.06.28
2022-06-21  (0) 2022.06.28
2022-06-20  (0) 2022.06.28
Contents

ํฌ์ŠคํŒ… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.