python一线开发 [2021]从0开始的tensorflow2.0 (一) 开个新坑,最近打算写一些不专业的tensorflow2.0的入门。不专业是因为我对算法这块研究不是特别多,所以有些写错了请在评论区指出来 首先了下面这种方程 ![](https://key08.com/usr/uploads/2021/07/794512951.png) 假设x为变量、Y就是真实值, 所谓机器学习 就是用一些算法如种群算法、遗传算法等,求出这个方程的最接近Y = 0的值,那么这个Y就自然是跟 真实的值很接近了. 这就是机器学习的**不怎么正确**但是搭边的一个理解 ## 安装 请记住 tensorflow2.0是不支持比较新的python版本的! 不要直接装新版本的python 会跑不起来的!装**Python 3.7.9**就挺合适的 阅读全文 2021-07-04 huoji 0 条评论
系统安全C/C++一线开发 [2021]利用错误的异常处理来检测基于cuckoo的沙箱 在上一篇文章中 [[2021]检测hypervisor -国内各大安全沙箱测评](https://key08.com/index.php/2021/07/03/1222.html "[2021]检测hypervisor -国内各大安全沙箱测评") 我要指正一个错误 那就是freebuf的和微步在线的沙箱并不是不支持icebp指令,而是因为他们是基于cuckoo的沙箱,而这个cuckoo的沙箱存在一个很明显的bug -**不会分发异常** 在沙箱里面启动进程的时候, cuckoo沙箱会注入一个monitor到进程里面通过hook监视进程操作,其中一个异常处理的hook实现如下: 阅读全文 2021-07-04 huoji 0 条评论
二进制安全C/C++汇编 [2021]检测hypervisor -国内各大安全沙箱测评 本次测评分别测评如下性能: 1. icebp指令模拟 https://key08.com/index.php/2021/05/13/1086.html: > mov ss会产生一个异常,但是这个异常会在下一个指令执行的时候再抛出.因此 他首先mov ss了,这样下一个指令才会执行异常, 到icebp的时候, mov ss造成的异常就应该被抛出了。但是同时icebp也会造成一个异常,而且异常优先级哎比mov ss的高,你说巧不巧.这样CPU就会处理icebp的异常而不处理mov ss的异常,但是mov ss的异常是必须要求dr6的single_instruction bit位(也就叫做DR6.BS位)为1的,要不然就炸。很遗憾的是icebp的异常他不会设置这个bs位,导致直接炸虚拟机.很多时候虚拟机在2004跑起来了结果一阵子就虚拟机guest机异常了就是这个毛病 2. 时间延迟检测 > 由于经过虚拟化的vmexit阶段,沙箱的退出时间会比真实的早 阅读全文 2021-07-03 huoji 0 条评论
系统安全二进制安全C/C++一线开发 [2021]PatchGuard的 542875F90F9B47F497B64BA219CACF69 回调研究(一) 在研究/看别人研究PG的时候,我注意到了在KiFilterFiberContext函数里面的一个 ![](https://key08.com/usr/uploads/2021/06/652292203.png) 这个操作 在 [windows10 patchguard 分析研究(版本:1803)](https://key08.com/index.php/2021/01/09/880.html "windows10 patchguard 分析研究(版本:1803)") 中,他们说这个是注册了一个 "TV" 回调 实际上是错误的,这个 "TV"字符串只是用于填充 ObjectAttributes.ObjectName这个字段的unicode_string,真实名字应该叫做"542875F90F9B47F497B64BA219CACF69",仅此而已 如果你想跟进sub_140386010 你就错了,**这个函数是一个巨大的、不可名状的、超过1W+行代码**的PG检查函数(10990行代码),至于是什么我们会在下文说,先关心一下这个注册了什么回调: 阅读全文 2021-06-28 huoji 0 条评论
系统安全工具软件二进制安全C/C++一线开发 [2021]让InfinityHook再次伟大 make InfinityHook great again ## 前言 在我折腾InfinityHook的时候我发现2004下系统没啥作用,原因是在2004系统上 WMI_LOGGER_CONTEXT->GetCpuClock已经不是rdtsc()函数了而是一个叫做 EtwpGetLoggerTimeStamp的函数 ![](https://key08.com/usr/uploads/2021/06/239927485.png) EtwpGetLoggerTimeStamp函数按照WMI_LOGGER_CONTEXT->GetCpuClock的值有如下操作: 大于3抛异常 等于3用rdtsc 等于2用off_140C00A30 等于1用KeQueryPerformanceCounter 等于0用RtlGetSystemTimePrecise 3,1,0都好说,但是这个2的off_140C00A30是什么鬼? 阅读全文 2021-06-23 huoji 5 条评论
C/C++一线开发 [2021]微软ApiSetMap的MEME windows ApiSetMap机制是win7以后最奇怪的机制之一,老外在博客上评论是"but no one really know why its useful.".特征就是在你编译你的dll后你的一些导入表的api的dll本来是kernel32.dll的会变成api-min-xxxxx.dll 这会导致很多问题,**比如沙箱解析、和内存注入失败** ## 为什么会存在这个机制 微软目标是将“API”功能(堆分配、字符串操作等)与子系统实现(枚举进程、注册服务等)分离,因此使用ApiSetMap机制,准备分离这些api. 但是写到一半估计是不想继续写了,于是烂尾了.然后导致各种api-ms-xxxxx丢失 ## 解析 详细解析可以在先知社区查看: https://xz.aliyun.com/t/7019 对于沙箱,我用如下代码解析这个东西: ```cpp /* 解决掉api-ms-xxxxx */ typedef enum _WinVer { WINVER_7 = 0x0610, WINVER_7_SP1 = 0x0611, WINVER_8 = 0x0620, WINVER_81 = 0x0630, WINVER_10 = 0x0A00, WINVER_10_RS1 = 0x0A01, // Anniversary update WINVER_10_RS2 = 0x0A02, // Creators update WINVER_10_RS3 = 0x0A03, // Fall creators update WINVER_10_RS4 = 0x0A04, // Spring creators update WINVER_10_RS5 = 0x0A05, // October 2018 update WINVER_10_19H1 = 0x0A06, // May 2019 update 19H1 WINVER_10_19H2 = 0x0A07, // November 2019 update 19H2 WINVER_10_20H1 = 0x0A08, // April 2020 update 20H1 } WinVer; std::string get_dll_name_from_api_set_map(const std::string& api_set) { std::wstring wapi_set(api_set.begin(), api_set.end()); typedef LONG(__stdcall* fnRtlGetVersion)(PRTL_OSVERSIONINFOW lpVersionInformation); fnRtlGetVersion pRtlGetVersion = (fnRtlGetVersion)GetProcAddress(LoadLibraryA("ntdll.dll"), "RtlGetVersion"); RTL_OSVERSIONINFOEXW verInfo = { 0 }; verInfo.dwOSVersionInfoSize = sizeof(verInfo); pRtlGetVersion((PRTL_OSVERSIONINFOW)&verInfo); ULONG ver_short = (verInfo.dwMajorVersion << 8) | (verInfo.dwMinorVersion << 4) | verInfo.wServicePackMajor; if (ver_short >= WINVER_10) { auto apiSetMap = (API_SET_NAMESPACE_ARRAY_10*)((X64PEB*)__readgsqword(0x60))->ApiSetMap; auto apiSetMapAsNumber = reinterpret_cast(apiSetMap); auto nsEntry = reinterpret_cast((apiSetMap->Start + apiSetMapAsNumber)); for (ULONG i = 0; i < apiSetMap->Count; i++) { UNICODE_STRING nameString, valueString; nameString.MaximumLength = static_cast(nsEntry->NameLength); nameString.Length = static_cast(nsEntry->NameLength); nameString.Buffer = reinterpret_cast(apiSetMapAsNumber + nsEntry->NameOffset); std::wstring name = std::wstring(nameString.Buffer, nameString.Length / sizeof(WCHAR)) + L".dll"; if (_wcsicmp(wapi_set.c_str(), name.c_str()) == 0) { auto valueEntry = reinterpret_cast(apiSetMapAsNumber + nsEntry->ValueOffset); if (nsEntry->ValueCount == 0) return ""; valueString.Buffer = reinterpret_cast(apiSetMapAsNumber + valueEntry->ValueOffset); valueString.MaximumLength = static_cast(valueEntry->ValueLength); valueString.Length = static_cast(valueEntry->ValueLength); auto value = std::wstring(valueString.Buffer, valueString.Length / sizeof(WCHAR)); //note: there might be more than one value, but we will just return the first one.. return std::string(value.begin(), value.end()); } nsEntry++; } } else { __debugbreak(); } return ""; } ``` 阅读全文 2021-06-07 huoji 0 条评论