- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在阅读关于在 Windows XP 和 Windows Server 2003 上针对 GDI+ 的旧漏洞利用。我正在做的一个项目被称为死亡 JPEG。
漏洞利用在以下链接中有很好的解释:
http://www.infosecwriters.com/text_resources/pdf/JPEG.pdf
基本上,JPEG 文件包含一个名为 COM 的部分,其中包含一个(可能为空的)注释字段,以及一个包含 COM 大小的两字节值。如果没有注释,则大小为2。阅读器(GDI+)读取大小,减去2,并分配一个适当大小的缓冲区来复制堆中的注释。
攻击涉及放置一个值 0
在该领域。 GDI+ 减去 2
,导致值 -2 (0xFFFe)
它被转换为无符号整数 0XFFFFFFFE
来自 memcpy
.
示例代码:
unsigned int size;
size = len - 2;
char *comment = (char *)malloc(size + 1);
memcpy(comment, src, size);
malloc(0)
第三行应该返回一个指向堆上未分配内存的指针。怎么写
0XFFFFFFFE
字节 (
4GB
!!!!) 可能不会使程序崩溃?这是否超出堆区域并写入其他程序和操作系统的空间?那会发生什么?
memcpy
,它只是复制
n
从目标到源的字符。在这种情况下,源应该在堆栈上,目标应该在堆上,而
n
是
4GB
.
最佳答案
这个漏洞绝对是heap overflow .
How can writing 0XFFFFFFFE bytes (4 GB!!!!) possibly not crash the program?
Does this write beyond the heap area and into the space of other programs and the OS?
File 1x1_pixel.JPG
Address Hex dump ASCII
00000000 FF D8 FF E0|00 10 4A 46|49 46 00 01|01 01 00 60| ÿØÿà JFIF `
00000010 00 60 00 00|FF E1 00 16|45 78 69 66|00 00 49 49| ` ÿá Exif II
00000020 2A 00 08 00|00 00 00 00|00 00 00 00|FF DB 00 43| * ÿÛ C
[...]
FF D8
是 SOI(图像开始)标记,而
FF E0
例如,是一个应用程序标记。
FFFE
),因为标记没有严格的顺序。
File 1x1_pixel_comment_mod1.JPG
Address Hex dump ASCII
00000000 FF D8 FF FE|00 00 30 30|30 30 30 30|30 31 30 30| ÿØÿþ 0000000100
00000010 30 32 30 30|30 33 30 30|30 34 30 30|30 35 30 30| 0200030004000500
00000020 30 36 30 30|30 37 30 30|30 38 30 30|30 39 30 30| 0600070008000900
00000030 30 61 30 30|30 62 30 30|30 63 30 30|30 64 30 30| 0a000b000c000d00
[...]
00 00
来触发漏洞。我还在 COM 标记后立即注入(inject)了 0xFFFC 字节,其中包含一个循环模式,一个 4 字节的十六进制数字,这在“利用”漏洞时会变得很方便。
gdiplus.dll
中的某处。 , 在名为
GpJpegDecoder::read_jpeg_marker()
的函数中.
.text:70E199D5 mov ebx, [ebp+arg_0] ; ebx = *this (GpJpegDecoder instance)
.text:70E199D8 push esi
.text:70E199D9 mov esi, [ebx+18h]
.text:70E199DC mov eax, [esi] ; eax = pointer to segment size
.text:70E199DE push edi
.text:70E199DF mov edi, [esi+4] ; edi = bytes left to process in the image
eax
register 指向段大小和
edi
是图像中剩余的字节数。
.text:70E199F7 xor ecx, ecx ; segment_size = 0
.text:70E199F9 mov ch, [eax] ; get most significant byte from size --> CH == 00
.text:70E199FB dec edi ; bytes_to_process --
.text:70E199FC inc eax ; pointer++
.text:70E199FD test edi, edi
.text:70E199FF mov [ebp+arg_0], ecx ; save segment_size
.text:70E19A15 movzx cx, byte ptr [eax] ; get least significant byte from size --> CX == 0
.text:70E19A19 add [ebp+arg_0], ecx ; save segment_size
.text:70E19A1C mov ecx, [ebp+lpMem]
.text:70E19A1F inc eax ; pointer ++
.text:70E19A20 mov [esi], eax
.text:70E19A22 mov eax, [ebp+arg_0] ; eax = segment_size
.text:70E19A29 movzx esi, word ptr [ebp+arg_0] ; esi = segment size (cast from 16-bit to 32-bit)
.text:70E19A2D add eax, 2
.text:70E19A30 mov [ecx], ax
.text:70E19A33 lea eax, [esi+2] ; alloc_size = segment_size + 2
.text:70E19A36 push eax ; dwBytes
.text:70E19A37 call _GpMalloc@4 ; GpMalloc(x)
.text:70E19A37 call _GpMalloc@4 ; GpMalloc(x)
.text:70E19A3C test eax, eax
.text:70E19A3E mov [ebp+lpMem], eax ; save pointer to allocation
.text:70E19A41 jz loc_70E19AF1
.text:70E19A47 mov cx, [ebp+arg_4] ; low marker byte (0xFE)
.text:70E19A4B mov [eax], cx ; save in alloc (offset 0)
;[...]
.text:70E19A52 lea edx, [esi-2] ; edx = segment_size - 2 = 0 - 2 = 0xFFFFFFFE!!!
;[...]
.text:70E19A61 mov [ebp+arg_0], edx
.text:70E19A69 mov ecx, [eax+4] ; ecx = bytes left to parse (0x133)
.text:70E19A6C cmp ecx, edx ; edx = 0xFFFFFFFE
.text:70E19A6E jg short loc_70E19AB4 ; take jump to copy
;[...]
.text:70E19AB4 mov eax, [ebx+18h]
.text:70E19AB7 mov esi, [eax] ; esi = source = points to segment content ("0000000100020003...")
.text:70E19AB9 mov edi, dword ptr [ebp+arg_4] ; edi = destination buffer
.text:70E19ABC mov ecx, edx ; ecx = copy size = segment content size = 0xFFFFFFFE
.text:70E19ABE mov eax, ecx
.text:70E19AC0 shr ecx, 2 ; size / 4
.text:70E19AC3 rep movsd ; copy segment content by 32-bit chunks
GpJpegDecoder::read_jpeg_marker()
使用新段以及当代码分配新缓冲区时:
.text:70E19A33 lea eax, [esi+2] ; alloc_size = semgent_size + 2
.text:70E19A36 push eax ; dwBytes
.text:70E19A37 call _GpMalloc@4 ; GpMalloc(x)
CPU Disasm
Address Command Comments
77F52CBF MOV ECX,DWORD PTR DS:[EAX] ; eax points to '0003' ; ecx = 0x33303030
77F52CC1 MOV DWORD PTR SS:[EBP-0B0],ECX ; save ecx
77F52CC7 MOV EAX,DWORD PTR DS:[EAX+4] ; [eax+4] points to '0004' ; eax = 0x34303030
77F52CCA MOV DWORD PTR SS:[EBP-0B4],EAX
77F52CD0 MOV DWORD PTR DS:[EAX],ECX ; write 0x33303030 to 0x34303030!!!
关于c++ - JPEG of Death 漏洞如何运作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28369097/
我正在尝试设置 RabbitMQ 以根据死亡原因通过死信交换路由消息(“x-death.reason”或“x-first-death-reason”都可以)。 我的理解是,当消息被发送到 DLX 时,
我一直在阅读关于在 Windows XP 和 Windows Server 2003 上针对 GDI+ 的旧漏洞利用。我正在做的一个项目被称为死亡 JPEG。 漏洞利用在以下链接中有很好的解释: ht
所以我是 C++ 的新手,我目前正在为一项任务开发一个“死亡之战”游戏,但我被卡住了。 基本上,作为玩家,您可以使用每种武器一定次数:Canon 3 次,Grenade 4 次。步枪是无限的。 当我使
我从 logcat 得到以下语句,就在一些成功的日志语句表明我的应用程序运行正常(统计输出等)之后: I/WindowState( 425): WIN DEATH: Window{4244e028
可能每个人在开发过程中都至少遇到过一次这个问题: while(/*some condition here that somehow never will be false*/) { ...
我很确定自己不仅是注意到PHP上的简单解析错误(如果存在于非常嵌套的场景中)的人(例如,引用另一个对象实例的对象实例引用了另一个解析错误很小的对象实例) ,它们全部被自动加载)可以使PHP永久挂起,而
我正在尝试使用批量加载器功能将大小适中的 csv 文件上传到 Google 应用引擎,但它似乎在中途死亡,结果如下: [INFO ] Logging to bulkloader-log-2011
我想将“死刑方法”与遗传算法文献中提出的其他惩罚方法进行比较。 我用的是R软件,所以需要写这些惩罚方法的代码。我发现了很多困难,因为我不了解关于死刑函数的一件事:我必须如何处理不可行的后代,因为人口规
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 11 年前。 Improve thi
我正在寻找最合适的类作为从我的 Activity 调用的 AsyncTasks 的调度程序。 我认为它可能是其中之一: 应用程序的子类; 服务的子类; 我自己的静态 东西。 至于我 - 实现第三个选择
Epic游戏《《死神来了(Death Coming)》是一款呆萌像素风格的非线性解谜游戏 目前在Epic商城上限时免费 大家想玩的可以点击下方链接 添加游戏进入账号内然后下载玩耍 下载地址:
我正在尝试找到一种方法来模拟set -e在函数中的行为,但仅在该函数的范围内。 基本上,我想要一个函数,如果有任何简单的命令将触发set -e,它将返回1的上一级。目的是将有风险的工作集隔离为功能,以
我在 Android 1.5 模拟器(在 OS X 下运行)上遇到随机崩溃(尽管它们总是同时发生)。代码是针对 1.5 API 构建的,在其他版本上运行良好。应用程序在 HTC Hero 上执行相同操
我用cocos2d-x开发了一个游戏。我试着在android下编译它。前三个场景很好 - 但当我添加最后一个功能时,应用程序开始在随机时间和随机场景中关闭。 相关日志如下: 04-18 15:30:5
我正在查看 https://developer.android.com/topic/libraries/architecture/saving-states .它提到“系统启动的进程死亡”。它到底是什
我有一个启动服务的 Activity 。 在我的 Activity 中: startService(new Intent(this, MyService.class)); 在我的服务中,onStart
我知道这听起来是个懒惰的问题..但我真的不知道这种情况是如何发生的,我在谷歌上也找不到太多相关信息。 背景: 这是一个带有 IPC 的应用程序:我有一个在单独进程中运行的服务。有时,服务被杀死了……但
有时,我的应用程序被卡住,然后崩溃。 我阅读了系统日志,并在系统日志的最后几行中看到我的 Activity 出现一些“WIN DEATH”错误。 谁能告诉我原因并告诉我解决方法? 非常感谢! 这是系统
我有一个运行 Yii 应用程序的暂存服务器,现在显示“白屏死机”。我看不到任何东西被输出到屏幕上(甚至在“查看源代码”时看不到源代码),相同的代码在本地运行没有任何问题。 谁能推荐一个在 Yii 应用
据说 "static methods are death to testability" 。如果是这样,下面的可行替代模式是什么? class User { private $phone,
我是一名优秀的程序员,十分优秀!