macOS IOKit
Tip
AWS ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:HackTricks Training GCP Red Team Expert (GRTE)
Azure ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks μ§μνκΈ°
- ꡬλ κ³ν νμΈνκΈ°!
- **π¬ λμ€μ½λ κ·Έλ£Ή λλ ν λ κ·Έλ¨ κ·Έλ£Ήμ μ°Έμ¬νκ±°λ νΈμν° π¦ @hacktricks_liveλ₯Ό νλ‘μ°νμΈμ.
- HackTricks λ° HackTricks Cloud κΉνλΈ λ¦¬ν¬μ§ν 리μ PRμ μ μΆνμ¬ ν΄νΉ νΈλ¦μ 곡μ νμΈμ.
Basic Information
I/O Kitμ XNU 컀λμμ λμ λ‘λλ μ₯μΉ λλΌμ΄λ²λ₯Ό μ²λ¦¬νλ μ€ν μμ€, κ°μ²΄ μ§ν₯ μ₯μΉ λλΌμ΄λ² νλ μμν¬μ λλ€. μ΄λ λ€μν νλμ¨μ΄λ₯Ό μ§μνλ©°, 컀λμ λͺ¨λμ μ½λλ₯Ό μ¦μ μΆκ°ν μ μκ² ν΄μ€λλ€.
IOKit λλΌμ΄λ²λ κΈ°λ³Έμ μΌλ‘ 컀λμμ ν¨μλ₯Ό λ΄λ³΄λ λλ€. μ΄ ν¨μ λ§€κ°λ³μ μ νμ 미리 μ μλμ΄ μμΌλ©° κ²μ¦λ©λλ€. λν, XPCμ μ μ¬νκ², IOKitμ Mach λ©μμ§ μμ λ λ€λ₯Έ λ μ΄μ΄μ λλ€.
IOKit XNU 컀λ μ½λλ Appleμ μν΄ https://github.com/apple-oss-distributions/xnu/tree/main/iokitμμ μ€ν μμ€λ‘ μ 곡λ©λλ€. λν, μ¬μ©μ κ³΅κ° IOKit κ΅¬μ± μμλ μ€ν μμ€μ λλ€ https://github.com/opensource-apple/IOKitUser.
κ·Έλ¬λ IOKit λλΌμ΄λ²λ μ€ν μμ€κ° μλλλ€. μ΄μ¨λ , λλλ‘ λλΌμ΄λ²μ 릴리μ€κ° λλ²κΉ μ μ½κ² ν΄μ£Όλ κΈ°νΈμ ν¨κ» μ 곡λ μ μμ΅λλ€. νμ¨μ΄μμ λλΌμ΄λ² νμ₯μ μ»λ λ°©λ²μ μ¬κΈ°μμ νμΈνμΈμ.
C++λ‘ μμ±λμμ΅λλ€. λ€μμ μ¬μ©νμ¬ λλ§κΈλ C++ κΈ°νΈλ₯Ό μ»μ μ μμ΅λλ€:
# Get demangled symbols
nm -C com.apple.driver.AppleJPEGDriver
# Demangled symbols from stdin
c++filt
__ZN16IOUserClient202222dispatchExternalMethodEjP31IOExternalMethodArgumentsOpaquePK28IOExternalMethodDispatch2022mP8OSObjectPv
IOUserClient2022::dispatchExternalMethod(unsigned int, IOExternalMethodArgumentsOpaque*, IOExternalMethodDispatch2022 const*, unsigned long, OSObject*, void*)
Caution
IOKit λ ΈμΆλ ν¨μλ ν΄λΌμ΄μΈνΈκ° ν¨μλ₯Ό νΈμΆνλ €κ³ ν λ μΆκ° 보μ κ²μ¬λ₯Ό μνν μ μμ§λ§, μ±μ μΌλ°μ μΌλ‘ IOKit ν¨μμ μνΈμμ©ν μ μλ μλλ°μ€μ μν΄ μ νλ©λλ€.
λλΌμ΄λ²
macOSμμλ λ€μ μμΉμ μμ΅λλ€:
/System/Library/Extensions- OS X μ΄μ 체μ μ λ΄μ₯λ KEXT νμΌ.
/Library/Extensions- 3rd νν° μννΈμ¨μ΄μ μν΄ μ€μΉλ KEXT νμΌ
iOSμμλ λ€μ μμΉμ μμ΅λλ€:
/System/Library/Extensions
#Use kextstat to print the loaded drivers
kextstat
Executing: /usr/bin/kmutil showloaded
No variant specified, falling back to release
Index Refs Address Size Wired Name (Version) UUID <Linked Against>
1 142 0 0 0 com.apple.kpi.bsd (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
2 11 0 0 0 com.apple.kpi.dsep (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
3 170 0 0 0 com.apple.kpi.iokit (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
4 0 0 0 0 com.apple.kpi.kasan (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
5 175 0 0 0 com.apple.kpi.libkern (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
6 154 0 0 0 com.apple.kpi.mach (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
7 88 0 0 0 com.apple.kpi.private (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
8 106 0 0 0 com.apple.kpi.unsupported (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
9 2 0xffffff8003317000 0xe000 0xe000 com.apple.kec.Libm (1) 6C1342CC-1D74-3D0F-BC43-97D5AD38200A <5>
10 12 0xffffff8003544000 0x92000 0x92000 com.apple.kec.corecrypto (11.1) F5F1255F-6552-3CF4-A9DB-D60EFDEB4A9A <8 7 6 5 3 1>
9κΉμ§ λμ΄λ λλΌμ΄λ²λ μ£Όμ 0μ λ‘λλ©λλ€. μ΄λ μ΄λ€μ΄ μ€μ λλΌμ΄λ²κ° μλλΌ μ»€λμ μΌλΆμ΄λ©° μΈλ‘λν μ μμμ μλ―Έν©λλ€.
νΉμ νμ₯μ μ°ΎκΈ° μν΄ λ€μμ μ¬μ©ν μ μμ΅λλ€:
kextfind -bundle-id com.apple.iokit.IOReportFamily #Search by full bundle-id
kextfind -bundle-id -substring IOR #Search by substring in bundle-id
컀λ νμ₯μ λ‘λνκ³ μΈλ‘λνλ €λ©΄ λ€μμ μννμμμ€:
kextload com.apple.iokit.IOReportFamily
kextunload com.apple.iokit.IOReportFamily
IORegistry
IORegistryλ macOS λ° iOSμ IOKit νλ μμν¬μμ μμ€ν μ νλμ¨μ΄ κ΅¬μ± λ° μνλ₯Ό λνλ΄λ λ°μ΄ν°λ² μ΄μ€μ μ€μν λΆλΆμ λλ€. μ΄λ μμ€ν μ λ‘λλ λͺ¨λ νλμ¨μ΄ λ° λλΌμ΄λ²λ₯Ό λνλ΄λ κ°μ²΄μ κ³μΈ΅μ 컬λ μ μ΄λ©°, μ΄λ€ κ°μ κ΄κ³λ₯Ό λνλ λλ€.
μ½μμμ IORegistryλ₯Ό κ²μ¬νκΈ° μν΄ cli **ioreg**λ₯Ό μ¬μ©νμ¬ μ»μ μ μμ΅λλ€(νΉν iOSμ μ μ©ν©λλ€).
ioreg -l #List all
ioreg -w 0 #Not cut lines
ioreg -p <plane> #Check other plane
**IORegistryExplorer**λ https://developer.apple.com/download/all/μ Xcode Additional Toolsμμ λ€μ΄λ‘λν μ μμΌλ©°, κ·Έλν½ μΈν°νμ΄μ€λ₯Ό ν΅ν΄ macOS IORegistryλ₯Ό κ²μ¬ν μ μμ΅λλ€.
.png)
IORegistryExplorerμμ βplanesβλ IORegistryμ λ€μν κ°μ²΄ κ°μ κ΄κ³λ₯Ό μ‘°μ§νκ³ νμνλ λ° μ¬μ©λ©λλ€. κ° planeμ νΉμ μ νμ κ΄κ³ λλ μμ€ν μ νλμ¨μ΄ λ° λλΌμ΄λ² ꡬμ±μ λν νΉμ λ·°λ₯Ό λνλ λλ€. IORegistryExplorerμμ λ§μ£ΌμΉ μ μλ μΌλ°μ μΈ planesλ λ€μκ³Ό κ°μ΅λλ€:
- IOService Plane: λλΌμ΄λ²μ nubs(λλΌμ΄λ² κ°μ ν΅μ μ±λ)λ₯Ό λνλ΄λ μλΉμ€ κ°μ²΄λ₯Ό νμνλ κ°μ₯ μΌλ°μ μΈ planeμ λλ€. μ΄ κ°μ²΄λ€ κ°μ μ 곡μ-ν΄λΌμ΄μΈνΈ κ΄κ³λ₯Ό 보μ¬μ€λλ€.
- IODeviceTree Plane: μμ€ν μ μ°κ²°λ μ₯μΉ κ°μ 물리μ μ°κ²°μ λνλ΄λ planeμ λλ€. USB λλ PCIμ κ°μ λ²μ€λ₯Ό ν΅ν΄ μ°κ²°λ μ₯μΉμ κ³μΈ΅ ꡬ쑰λ₯Ό μκ°ννλ λ° μμ£Ό μ¬μ©λ©λλ€.
- IOPower Plane: μ μ κ΄λ¦¬ μΈ‘λ©΄μμ κ°μ²΄μ κ·Έ κ΄κ³λ₯Ό νμν©λλ€. λ€λ₯Έ κ°μ²΄μ μ μ μνμ μν₯μ λ―ΈμΉλ κ°μ²΄λ₯Ό 보μ¬μ€ μ μμ΄ μ μ κ΄λ ¨ λ¬Έμ λ₯Ό λλ²κΉ νλ λ° μ μ©ν©λλ€.
- IOUSB Plane: USB μ₯μΉμ κ·Έ κ΄κ³μ νΉλ³ν μ΄μ μ λ§μΆμ΄ USB νλΈμ μ°κ²°λ μ₯μΉμ κ³μΈ΅ ꡬ쑰λ₯Ό 보μ¬μ€λλ€.
- IOAudio Plane: μμ€ν λ΄μμ μ€λμ€ μ₯μΉμ κ·Έ κ΄κ³λ₯Ό λνλ΄λ planeμ λλ€.
- β¦
Driver Comm Code Example
λ€μ μ½λλ IOKit μλΉμ€ "YourServiceNameHere"μ μ°κ²°νκ³ μ νμ 0 λ΄μ ν¨μλ₯Ό νΈμΆν©λλ€. μ΄λ₯Ό μν΄:
- λ¨Όμ
IOServiceMatchingλ° **IOServiceGetMatchingServices**λ₯Ό νΈμΆνμ¬ μλΉμ€λ₯Ό κ°μ Έμ΅λλ€. - κ·Έλ° λ€μ **
IOServiceOpen**μ νΈμΆνμ¬ μ°κ²°μ μ€μ ν©λλ€. - λ§μ§λ§μΌλ‘ μ νμ 0(μ νμλ νΈμΆνλ €λ ν¨μμ ν λΉλ λ²νΈ)λ‘ **
IOConnectCallScalarMethod**λ₯Ό μ¬μ©νμ¬ ν¨μλ₯Ό νΈμΆν©λλ€.
#import <Foundation/Foundation.h>
#import <IOKit/IOKitLib.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// Get a reference to the service using its name
CFMutableDictionaryRef matchingDict = IOServiceMatching("YourServiceNameHere");
if (matchingDict == NULL) {
NSLog(@"Failed to create matching dictionary");
return -1;
}
// Obtain an iterator over all matching services
io_iterator_t iter;
kern_return_t kr = IOServiceGetMatchingServices(kIOMasterPortDefault, matchingDict, &iter);
if (kr != KERN_SUCCESS) {
NSLog(@"Failed to get matching services");
return -1;
}
// Get a reference to the first service (assuming it exists)
io_service_t service = IOIteratorNext(iter);
if (!service) {
NSLog(@"No matching service found");
IOObjectRelease(iter);
return -1;
}
// Open a connection to the service
io_connect_t connect;
kr = IOServiceOpen(service, mach_task_self(), 0, &connect);
if (kr != KERN_SUCCESS) {
NSLog(@"Failed to open service");
IOObjectRelease(service);
IOObjectRelease(iter);
return -1;
}
// Call a method on the service
// Assume the method has a selector of 0, and takes no arguments
kr = IOConnectCallScalarMethod(connect, 0, NULL, 0, NULL, NULL);
if (kr != KERN_SUCCESS) {
NSLog(@"Failed to call method");
}
// Cleanup
IOServiceClose(connect);
IOObjectRelease(service);
IOObjectRelease(iter);
}
return 0;
}
λ€λ₯Έ ν¨μλ€μ΄ IOConnectCallScalarMethod μΈμλ IOConnectCallMethod, **IOConnectCallStructMethod**μ κ°μ IOKit ν¨μλ₯Ό νΈμΆνλ λ° μ¬μ©λ μ μμ΅λλ€β¦
λλΌμ΄λ² μ§μ μ 리λ²μ±
μλ₯Ό λ€μ΄ νμ¨μ΄ μ΄λ―Έμ§(ipsw)μμ μ΄λ₯Ό μ»μ μ μμ΅λλ€. κ·Έλ° λ€μ μ’μνλ λμ»΄νμΌλ¬μ λ‘λνμΈμ.
externalMethod ν¨μλ₯Ό λμ»΄νμΌνκΈ° μμν μ μμ΅λλ€. μ΄ ν¨μλ νΈμΆμ λ°κ³ μ¬λ°λ₯Έ ν¨μλ₯Ό νΈμΆνλ λλΌμ΄λ² ν¨μμ
λλ€:
.png)
.png)
κ·Έ λμ°ν νΈμΆμ λλ§₯κΈλ μλ―Έλ:
IOUserClient2022::dispatchExternalMethod(unsigned int, IOExternalMethodArgumentsOpaque*, IOExternalMethodDispatch2022 const*, unsigned long, OSObject*, void*)
μ΄μ μ μμμ self λ§€κ°λ³μκ° λλ½λ μ μ μ μνμΈμ. μ¬λ°λ₯Έ μ μλ λ€μκ³Ό κ°μ΅λλ€:
IOUserClient2022::dispatchExternalMethod(self, unsigned int, IOExternalMethodArgumentsOpaque*, IOExternalMethodDispatch2022 const*, unsigned long, OSObject*, void*)
μ€μ μ μλ https://github.com/apple-oss-distributions/xnu/blob/1031c584a5e37aff177559b9f69dbd3c8c3fd30a/iokit/Kernel/IOUserClient.cpp#L6388μμ μ°Ύμ μ μμ΅λλ€:
IOUserClient2022::dispatchExternalMethod(uint32_t selector, IOExternalMethodArgumentsOpaque *arguments,
const IOExternalMethodDispatch2022 dispatchArray[], size_t dispatchArrayCount,
OSObject * target, void * reference)
μ΄ μ 보λ₯Ό ν΅ν΄ Ctrl+Right -> Edit function signatureλ₯Ό λ€μ μμ±νκ³ μλ €μ§ μ νμ μ€μ ν μ μμ΅λλ€:
.png)
μλ‘ λμ»΄νμΌλ μ½λλ λ€μκ³Ό κ°μ΄ λ³΄μΌ κ²μ λλ€:
.png)
λ€μ λ¨κ³μμλ IOExternalMethodDispatch2022 ꡬ쑰체λ₯Ό μ μν΄μΌ ν©λλ€. μ΄λ https://github.com/apple-oss-distributions/xnu/blob/1031c584a5e37aff177559b9f69dbd3c8c3fd30a/iokit/IOKit/IOUserClient.h#L168-L176μμ μ€νμμ€λ‘ μ 곡λλ©°, μ΄λ₯Ό μ μν μ μμ΅λλ€:
.png)
μ΄μ (IOExternalMethodDispatch2022 *)&sIOExternalMethodArrayλ₯Ό λ°λΌ λ§μ λ°μ΄ν°λ₯Ό λ³Ό μ μμ΅λλ€:
.png)
λ°μ΄ν° μ νμ **IOExternalMethodDispatch2022:**λ‘ λ³κ²½ν©λλ€:
.png)
λ³κ²½ ν:
.png)
μ΄μ μ¬κΈ°μμ 7κ°μ μμλ‘ κ΅¬μ±λ λ°°μ΄μ΄ μλ€λ κ²μ μ μ μμ΅λλ€(μ΅μ’ λμ»΄νμΌλ μ½λλ₯Ό νμΈνμΈμ). 7κ°μ μμλ‘ κ΅¬μ±λ λ°°μ΄μ μμ±νλ €λ©΄ ν΄λ¦ν©λλ€:
.png)
λ°°μ΄μ΄ μμ±λ νμλ λͺ¨λ λ΄λ³΄λΈ ν¨μλ₯Ό λ³Ό μ μμ΅λλ€:
.png)
Tip
κΈ°μ΅νμ λ€λ©΄, μ¬μ©μ 곡κ°μμ λ΄λ³΄λΈ ν¨μλ₯Ό νΈμΆνλ €λ©΄ ν¨μμ μ΄λ¦μ νΈμΆν νμκ° μκ³ , μ νμ λ²νΈλ₯Ό νΈμΆν΄μΌ ν©λλ€. μ¬κΈ°μμ μ νμ 0μ ν¨μ
initializeDecoder, μ νμ 1μstartDecoder, μ νμ 2λ **initializeEncoder**μ λλ€β¦
Tip
AWS ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:HackTricks Training GCP Red Team Expert (GRTE)
Azure ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks μ§μνκΈ°
- ꡬλ κ³ν νμΈνκΈ°!
- **π¬ λμ€μ½λ κ·Έλ£Ή λλ ν λ κ·Έλ¨ κ·Έλ£Ήμ μ°Έμ¬νκ±°λ νΈμν° π¦ @hacktricks_liveλ₯Ό νλ‘μ°νμΈμ.
- HackTricks λ° HackTricks Cloud κΉνλΈ λ¦¬ν¬μ§ν 리μ PRμ μ μΆνμ¬ ν΄νΉ νΈλ¦μ 곡μ νμΈμ.


