XCC

内存保护机制及绕过方案——通过覆盖虚函数表绕过/GS机制

邮差的信 提交于 2021-02-02 15:35:18
1 GS内存保护机制 1.1 GS工作原理 栈中的守护天使--GS,亦称作Stack Canary / Cookie,从VS2003起开始启用(也就说,GS机制是由编译器决定的,跟操作系统无关)。 GS机制分三个步骤:计算随机种子 --> canary写入栈帧 --> GS校验。 [1]程序启动时,读取 .data 的第一个 DWORD 作为基数,然后和各种元素(时间戳,进程ID,线程ID,计数器等等)进行XOR加密 [2]然后将加密后的种子再次写入 .data 的第一个 DWORD [3]函数在执行前,把加密后的种子取出,与当前 esp 进行异或计算,结果存入EBP的前面 [4]函数主体正常执行。 [5]函数返回前(retn前一点),把cookie取出与esp异或计算后,调用security_check_cookie函数进行检查,与.data节里的种子进行比较,如果校验通过,则返回原函数继续执行;如果校验失败,则程序终止。 图解: 1.2 变量重排技术 如图1.1所示,在缓冲区域cookie之间还有一些空隙,这是因为在旧版本(VS2005之前)的编译器里,局部变量是随机摆放的(指针,int,字符串位置随机) 所以这里就还存在一丝安全隐患->_->那就是Buff可能在不压过Cookie的情况下覆盖一些局部变量,所以,后期的编译器就推出了-- 变量重排技术。 如图1-2所示 图 1

FUD101(连载): 一、shellcode免杀

二次信任 提交于 2021-01-23 04:57:11
No.1 声明 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测以及文章作者不为此承担任何责任。 雷神众测拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经雷神众测允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。 No.2 前言 针对本篇及后续文章中用到的部分技术,我已经写好了相关代码,用于快速生成免杀的可执行程序,源代码放在了(github)[https://github.com/1y0n/AV_Evasion_Tool]上,也可以直接下载编译好的(程序)[https://github.com/1y0n/AV_Evasion_Tool/releases] 工具界面如下: 效果如下: 目前,针对 shellcode 的免杀,在不讨论自己编写 shellcode,而是使用现成的 shellcode(msfvenom、cobaltstrike等)的情况下,主要有两种方式: 1、分离免杀 分离免杀主要是将 shellcode 和 loader 彻底分开,比如可以将 shellcode 藏在其他文件中、放在网络上等等。 2、加密混淆 加密混淆指将 shellcode 进行一定变形处理后,同 loader 放在一起,打包为一个完整独立的可执行文件。

(转)调试程序时设置断点的原理

落花浮王杯 提交于 2021-01-13 06:49:21
简单总结:有软件断点和硬件断点 软件断点:软件断点在X86系统中为中断指令INT 3,其二进制代码opcode是0xCC。当程序执行到INT 3指令时,会引发软件中断。操作系统的INT 3中断处理器会寻找注册在该进程上的调试处理程序。从而像Windbg和VS等等调试器就有了上下其手的机会。程序出错时常看到的”烫烫烫“、”锟斤拷“、”屯屯屯“等与这个终端指令有关 硬件断点:X86系统提供8个调试寄存器(DR0~DR7)和2个MSR用于硬件调试。 转自: https://zhuanlan.zhihu.com/p/34003929 以下为原文: 对于程序员来说,debug的时间往往比写程序的时间还要长。尤其对我这种专写bug为主的程序员来说,一个好的调试器意味着早点下班和休息。现在方便的调试器很多,有著名的Visual Studio(VS)等IDE,也有免费的Windbg和GDB等等。加个断点也很简单,就是按一下键而已。但你有没有想过,调试器Debugger并不能控制程序的执行顺序,为什么它可以让CPU在需要的地方停住呢? 今天我们就来揭开调试断点的神秘面纱,并通过一个实例来看看调试器实际都做了些什么。调试器能够随心所欲的停止程序的执行,主要通过软件断点和硬件断点两种方式。 软件断点 软件断点在X86系统中就是指令INT 3,它的二进制代码opcode是0xCC。当程序执行到INT

练手WPF(二)——2048游戏的简易实现(上)

夙愿已清 提交于 2021-01-03 21:29:12
原文: 练手WPF(二)——2048游戏的简易实现(上) 1、创建游戏界面 编辑MainWindow.xaml,修改代码如下: < Window.Resources > < Style TargetType ="Label" > < Setter Property ="Height" Value ="105" /> < Setter Property ="Width" Value ="105" /> < Setter Property ="HorizontalContentAlignment" Value ="Center" /> < Setter Property ="VerticalContentAlignment" Value ="Center" /> < Setter Property ="FontWeight" Value ="Bold" /> < Setter Property ="Opacity" Value ="0.7" /> </ Style > < Style TargetType ="Rectangle" > < Setter Property ="Width" Value ="105" /> < Setter Property ="Height" Value ="105" /> < Setter Property ="Fill" Value ="

DS18B20温度检测

大城市里の小女人 提交于 2020-12-01 09:03:48
STM32F407VET6 -- FreeRTOS -- DS18B20温度检测 1、DS18B20 单线数字温度传感器,即“一线器件”,其具有独特的优点:   a、采用单总线的接口方式 与微处理器连接时仅需要一根线即可实现微处理器与 DS18B20 的双向通讯。单总线具有经济性好,抗干扰能力强,适合于恶劣环境的现场温度测量。   b、测量温度范围宽,测量精度高 DS18B20 的测量范围为 -55 ℃ ~+ 125 ℃ ; 在 -10~+ 85°C范围内,精度为 ± 0.5°C 。   c、在使用中不需要任何外围元件。   d、支持多点组网功能,多个 DS18B20 可以并联在惟一的单线上,实现多点测温。   e、供电方式灵活 DS18B20 可以通过内部寄生电路从数据线上获取电源。因此,当数据线上的时序满足一定的要求时,可以不接外部电源,从而使系统结构更趋简单,可靠性更高。   f、测量参数可配置 DS18B20 的测量分辨率可通过程序设定 9~12 位。   g、负压特性电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。   h、掉电保护功能 DS18B20 内部含有 EEPROM ,在系统掉电以后,它仍可保存分辨率及报警温度的设定值。 2、DS18B20内部结构:    DS18B20内部主要包括,64位ROM、2字节温度输出寄存器、1字节上下警报寄存器(TH和TL

温度传感器-51单片机

空扰寡人 提交于 2020-11-21 06:16:58
C语言 #include <reg51.h> #define uchar unsigned char sbit DQ =P3^7; //18B20 数据线引脚 //数码管显示的段码表 uchar code table[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; // 0 1 2 3 4 5 6 7 8 9 uchar code table_d[]= {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; // 0 1 2 3 4 5 6 7 8 9 uchar dispbuf[4]; //显示缓冲区 uchar temper[2];//存放温度的数组 void seg_scan(); /*****************************延时函数**************************/ void delay (unsigned int us) { while(us--); } void reset(void) //复位 { uchar x=0; DQ = 1; delay(8); //稍做延时 DQ = 0; delay(80); //精确延时 大于 480us DQ = 1; //拉高总线 delay(14); x=DQ; delay(20)

攻防世界 csaw2013reversing2 CSAW CTF 2014

此生再无相见时 提交于 2020-11-21 04:29:24
运行程序 flag显示乱码 IDA打开查看程序逻辑 1 int __cdecl __noreturn main( int argc, const char **argv, const char ** envp) 2 { 3 int v3; // ecx 4 CHAR *lpMem; // [esp+8h] [ebp-Ch] 5 HANDLE hHeap; // [esp+10h] [ebp-4h] 6 7 hHeap = HeapCreate( 0x40000u , 0 , 0 ); 8 lpMem = (CHAR *)HeapAlloc(hHeap, 8u , unk_409B34 + 1 ); 9 memcpy_s(lpMem, unk_409B34, dword_409B10, unk_409B34); 10 if ( sub_40102A() || IsDebuggerPresent() ) 11 { 12 __debugbreak(); 13 sub_401000(v3 + 4 , lpMem); 14 1 unsigned int __fastcall sub_401000( int a1, char * a2) 2 { 3 int v2; // esi 4 char *v3; // eax 5 unsigned int v4; // ecx 6 unsigned

内存对齐

二次信任 提交于 2020-10-28 18:21:47
什么是内存对齐 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 为什么要内存对齐 平台原因: 某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。 性能原因: 为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。 总的来说,内存对齐就是拿空间换取时间的做法,目的是为了让CPU能一次获取到数据,从而提升性能。 #pragma pack() 该预处理指令用来改变对齐参数。在缺省情况下,C编译器为每一个变量或数据单元按其自然对界条件分配空间。一般地,可以通过下面的方法来改变缺省的对齐参数: · 使用伪指令#pragma pack (n),C编译器将按照n字节对齐。 · 使用伪指令#pragma pack (),取消自定义字节对齐方式。 也可以写成: #pragma pack(push,n) #pragma pack(pop) #pragma pack (n)表示每个成员的对齐单元不大于n(n为2的整数次幂)。这里规定的是上界,只影响对齐单元大于n的成员,对于对齐字节不大于n的成员没有影响。 内存对齐规则 每个特定平台上的编译器都有自己的默认

Proteus8.9 VSM Studio WINAVR编译器仿真ATmega16系列a25_Flash程序空间中数据访问

不问归期 提交于 2020-08-20 08:14:13
*本文及代码参阅彭伟《单片机C语言程序设计实训100例》 一,打开文件(可以随文下载放置在文档中打开)。(如下图1所示) 图1 二,调整原理图大小,适合可视,另存工程文件。(如下图2,3,4所示) 图2 图3 图4 三,点击Source Code标签。(如下图5所示) 图5 四,编辑main.c Proteus8.9 VSM Studio WINAVR编译器仿真ATmega16系列a25_Flash程序空间中数据访问 (如下图6所示) 图6 五,Main.c 代码: //----------------------------------------------------------------- // 名称: Flash程序空间的数据访问 //----------------------------------------------------------------- // 说明: 本例运行时,按下K1将读取并显示存放于Flash程序内存中的 // 320个字节数据及60个字数据. // //----------------------------------------------------------------- #include “myfunc01.h” //-----------------------------------------------------

程序以服务形式启动断言异常分析

隐身守侯 提交于 2020-08-18 04:40:49
前言 程序以服务的形式启动,遇到断言vector subscript out of range,会产生两种情况 1)在线程中遇到断言错误,该线程会停止,但是主线程不受影响 2)主线程遇到断言错误,程序直接退出,不会弹窗,提示断言错误,如果服务是以自动形式启动,将会自动重新启动。 测试代码 std::vector<int> vecTest; for (int i = 0; i <= vecTest.size(); i++) { std::cout << vecTest[3] << std::endl; } reference operator[](size_type _Pos) { // subscript mutable sequence #if _ITERATOR_DEBUG_LEVEL == 2 if (size() <= _Pos) { // report error _DEBUG_ERROR("vector subscript out of range"); _SCL_SECURE_OUT_OF_RANGE; } Debug 和 Release 的真正区别,在于一组编译选项。 Debug 版本 参数 含义 /MDd /MLd 或 /MTd 使用 Debug runtime library(调试版本的运行时刻函数库) /Od 关闭优化开关 /D "_DEBUG" 相当于