我一直在阅读有关Windows XP和Windows Server 2003上针对GDI +的旧版漏洞,我正在研究一个名为JPEG of death的项目.
该漏洞利用在以下链接中得到了很好的解释:http: //www.infosecwriters.com/text_resources/pdf/JPEG.pdf
基本上,JPEG文件包含一个名为COM的部分,其中包含一个(可能为空)注释字段,以及一个包含COM大小的双字节值.如果没有注释,则大小为2.读取器(GDI +)读取大小,减去两个,并分配适当大小的缓冲区以复制堆中的注释.攻击涉及0在现场放置一个值.GDI +减去2,导致的一个值-2 (0xFFFe),其被转化成无符号整数0XFFFFFFFE的memcpy.
示例代码:
unsigned int size;
size = len - 2;
char *comment = (char *)malloc(size + 1);
memcpy(comment, src, size);
Run Code Online (Sandbox Code Playgroud)
注意malloc(0)在第三行应返回指向堆上未分配内存的指针.如何写入0XFFFFFFFE字节(4GB!!!!)可能不会使程序崩溃?这是否超出堆区域并进入其他程序和操作系统的空间?那么会发生什么?
据我所知memcpy,它只是简单地将n字符从目的地复制到源.在这种情况下,源应该在堆栈上,堆上的目标,并且n是4GB.
我是eclipse的TPTP分析工具的新手.我收到了TPTP跟踪,我需要帮助才能理解所提供的内容.包含函数调用条目的跟踪与条目函数调用的参数一起存在.它来自JHotDraw,一个Java程序.以下是跟踪示例:
输入:CH/ifa/draw/standard/ToolButton.paint --- [sun.java2d.SunGraphics2D [font = javax.swing.plaf.FontUIResource [family = Dialog,name = Dialog,style = bold,size = 12], color = sun.swing.PrintColorUIResource [r = 51,g = 51,b = 51]]]已退出:CH/ifa/draw/standard/ToolButton.paint --- [sun.java2d.SunGraphics2D [font = javax.swing] .plaf.FontUIResource [家族=对话框,名称=对话框,风格=粗体,大小= 12],颜色= sun.swing.PrintColorUIResource [R = 51,G = 51,b = 51]]]
输入:CH/ifa/draw/application/DrawApplication.paletteUserOver --- [CH.ifa.draw.standard.ToolButton [,304,1,24x24,disabled,alignmentX = 0.0,alignmentY = 0.5,border = javax.swing. border.CompoundBorder @ 1308786,旗帜= 296,MAXIMUMSIZE =,=的minimumSize,首选大小=,=的DefaultIcon @ javax.swing.ImageIcon中1f647e2,disabledIcon = sun.swing.ImageIconUIResource @ d253d9,disabledSelectedIcon =,余量= javax.swing.plaf中. InsetsUIResource [顶= 2,左= 14,底= 2,右= 14],的paintBorder =真,paintFocus =真,pressedIcon = javax.swing.ImageIcon中@ 924039,rolloverEnabled =真,rolloverIcon =,rolloverSelectedIcon =,selectedIcon =的javax …
当bad_alloc在构造函数中抛出异常时,在该构造函数中创建了多个对象,必须采取什么措施来清理内存.防爆.
class Object
{
private:
A * a;
B * b;
public:
Object()
{
a= new A();
b= new B(); //So if a bad_alloc is called here, how is a deleted???
}
}
Run Code Online (Sandbox Code Playgroud)
我的直觉是将每个调用new放在一个单独的try catch块中,并删除new之前调用过的所有对象,但这太冗长了(第一次尝试bloc不调用析构函数,第二次调用第一次调用,第三次调用前两个等).我的问题是:处理这个问题最常见的方法是什么?
另外,假设类对象包含一个不是用new创建的对象(因为它在栈中),它的析构函数是自动调用的吗?
c++ ×2
bad-alloc ×1
constructor ×1
eclipse ×1
eclipse-tptp ×1
exception ×1
malware ×1
memcpy ×1
profiling ×1
security ×1