Archive for 一月, 2015

Windows 存储设备栈分析

作者:椒图实验室

转载请注明出处:http://blog.jowto.com

 

通常为了实现某些与存储防护相关的功能,需要得到诸如volume/partition/class/port/miniport等设备,在客户端由于环境相对固定,所以可以假定驱动名为volmgr.sys (ftdisk.sys)/partmgr.sys/disk.sys/atapi.sys或scsiport.sys,但由于RAID、MPIO等应用和第三方厂商的介入,这种假设并不适用于Windows服务器,如symmpi.sys或是 Windows 2003 Server 后基于storport.sys 的 lsi_sas.sys 等。为了在Windows 服务器上保持良好的兼容性,就需要找到一种不依赖“驱动名称”和“设备名称”,可动态识别和定位的方法,同时要能够定位在“存储栈”中任意位置的存储设备,也就是需要从文件系统开始,依次定位“卷设备->分区设备->类驱动设备->小端口设备”,这需要跨越多个存储设备栈,我们的方法是跟踪DEVICE_OBJECT中StackSize的变化,这个值得变化表明一个IRP在存储设备栈中的走向和整体流程,此值为1表明IRP消亡,即再往下层设备传递时,不再以IRP形式发送。

 

这里以Windows 2008 R2为测试环境进行调试。通过DeviceTree观察,发现从NTFS文件系统开始其DeviceObject->StackSize为8 (如果上面还有Upper Filter Driver 此值还会更大),再往下查看发现除了设备的AttachedDevice域可以确认有上层设备(Upper Filter Driver)之外无法查看到其低层设备(Lower Device)同时也无法完成全部的跟踪,中间的StackSize总有不连续的地方。也就是说DeviceTree提供的信息不够详尽,无法以此写出符合要求的代码。

 

在这种情况下我尝试翻阅WDK,看看能否找到些线索,终于让我找到了一个内核API: IoGetDiskDeviceObject(),从说明中可以看到此函数返回的磁盘设备对象是一个“卷设备”,那么它是如何通过文件系统设备对象获得的?这也正是DeviceTree没有给出的信息。

 

通过WINDBG对此函数进行逆向分析:

 

kd> uf IoGetDiskDeviceObject

nt!IoGetDiskDeviceObject:

fffff800`0178c810 48895c2410      mov     qword ptr [rsp+10h],rbx… 阅读全文

Posted on 一月 19, 2015 at 下午1:38 by admin · Permalink · Comments Closed
In: 未分类

AIX 系统调用拦截函数 kmod_util() 的实现原理与BUG

作者:椒图实验室

转载请注明出处:http://blog.jowto.com

 
环境:
bash-3.2# oslevel -r
6100-06

使用 kdb 调试器分析

bash-3.2# kdb
START              END <name>
0000000000001000 00000000040F0000 start+000FD8
F00000002FF47600 F00000002FFDF9C0 __ublock+000000
000000002FF22FF4 000000002FF22FF8 environ+000000
000000002FF22FF8 000000002FF22FFC errno+000000
F1000F0A00000000 F1000F0A10000000 pvproc+000000
F1000F0A10000000 F1000F0A18000000 pvthread+000000
read vscsi_scsi_ptrs OK, … 阅读全文

Posted on 一月 19, 2015 at 下午1:30 by admin · Permalink · Comments Closed
In: 未分类

AIX Hardware Storage Keys 调试

作者:椒图实验室

转载请注明出处:http://blog.jowto.com

为了通杀所有 POWER AIX 系统,我的代码都是在最低平台和版本上进行编译的,如 POWER5 的 AIX 5300-00,为了向后兼容使用了解析内核镜像文件,动态获得函数及结构的方法,但这也带来了一些问题。比如 POWER6 后提供的 Hardware Storage Keys,在此平台编译使用没有任何问题,但拿到 POWER7 上则出现了崩溃现象,但将代码在 POWER7 上编译则没有任何问题,我查了编译选项没有使用任何优化参数,最终当我定位问题后不得不再次感叹,对这种硬件,OS,编译器都是自己的大型封闭系统真是没的治。

KDB(0)> dis @r0 – 4 10

.aix_kernel_get_diskdev+0002C4 bl <.new_hkeyset> –>调用new_hkeyset崩掉的,这是我写的包装函数。

.aix_kernel_get_diskdev+0002C8 ori r0,r0,0

.aix_kernel_get_diskdev+0002CC ld r3,90(stkp)

.aix_kernel_get_diskdev+0002D0 bl <.kputpath>

.aix_kernel_get_diskdev+0002D4 lwa

阅读全文
Posted on 一月 19, 2015 at 下午1:24 by admin · Permalink · Comments Closed
In: 未分类

PHP获取X-Forwarded-For值的有趣现象

作者:椒图实验室

转载请注明出处:http://blog.jowto.com

 

今天发现了PHP一个有趣的现象,就是关于X-Forwarded-For这个值获取的方式。
关键字X-Forwarded-For是HTTP的一个扩展字段,有的Web程序就会使用这个字段获取用户的真实IP,类似下面的代码:
$ip = $_SERVER[‘HTTP_X_FORWARDED_FOR’];
而程序在后面如果不检查$ip这个变量的值而直接带入select进行数据库查询,就可能会造成SQL注入攻击点,如很老版本的discuz论坛就存在这种类型的注入。
PHP在接收HTTP_X_FORWARDED_FOR内容的时候很有意思,也可以说容错性非常高,客户端在发送的时候在X和FORWARDED和FOR之间的分隔字符可以是任意可显示的特殊字符,如下面HTTP请求:
GET /test.php HTTP/1.1
Host: 192.168.200.101:81
Proxy-Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8
X-Forwarded!For:8.8.8.8… 阅读全文

Posted on 一月 10, 2015 at 下午4:19 by admin · Permalink · Comments Closed
In: 未分类
友情链接