首页
社区
课程
招聘
[旧帖] [求助]问个0day漏洞分析问题 0.00雪花
发表于: 2012-9-9 22:56 2612

[旧帖] [求助]问个0day漏洞分析问题 0.00雪花

2012-9-9 22:56
2612
0day 软件漏洞分析技术这本书里在第三章的开发shellcode艺术的代码 mov ecx [ecx]  ;ecx=second entry in list  怎么理解?还有那个hash算法里 digest=((digest<<25)|(digest)>>7) 这个循环是怎么理解的?跪求大牛解答~

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 23
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
我也是最近刚看过,先说后面问题,1@ digest<<25表示32位的digest向左移25位,这样低7位便补0;2@ digest>>7表示32位的digest整体向右移7位,这样高7位补0,1@和2@组合或运算,表示循环右移了7位。

mov ecx,[ecx],假如:运行词条语句之前,exc值为0xaabbccdd,则本条语句的意思是,地址为0xaabbccdd的位置存储的值,然后赋给ecx。
2012-9-9 23:50
0
雪    币: 7
活跃值: (389)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
;find base addr of kernel32.dll
mov ebx ,fs:[edx+0x3c] ;dkebx=address of peb
mov ecx [ebx+0x3c];ecx=point to loader data
mov ecx,[ecx+0x1c];exc=first entry in initialization order list
mov ecx,[ecx];ecx=second entry in list (kernel32.dll)
mov ebp,[ecx+0x08];ebp=base address of kerenel32.dll
整段代码是这样的 我是在mov ecx,[ecx];ecx=second entry in list (kernel32.dll)这里不理解  我知道mov 寄存器 [寄存器] 是把后面那个寄存器的值赋给前面那个寄存器的意思  非常感谢您的解答~
2012-9-10 13:43
0
雪    币: 23
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
mov 寄存器 【寄存器】的意思不是把后面寄存器的值赋给前面寄存器。而是将后面寄存器存的值作为指针,该指针指向的位置存储的值赋给前面寄存器。
前面几个赋值语句也是这个意思。对照书中那个图比较好看,当时我也看了半天。
2012-9-10 23:40
0
雪    币: 7
活跃值: (389)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
thank you ~
2012-9-12 13:01
0
雪    币: 9
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
;find base addr of kernel32.dll
mov ebx ,fs:[edx+0x30]; ebx=address of peb
mov ecx [ebx+0x0c]; ecx=point to loader data
mov ecx,[ecx+0x1c]; exc=first entry in initialization order list
mov ecx,[ecx]; ecx=second entry in list (kernel32.dll)
mov ebp,[ecx+0x08]; ebp=base address of kerenel32.dll

有两个地方我不理解。0x1c和0x08是怎么算出来的?
mov ecx [ebx+0x0c]; ecx=point to loader data 之后我们得到*PPEB_LDR_DATA
8 BYTE + 3 * PVOID = 20 BYTE = 0x14 BYTE
为什么是mov ecx,[ecx+0x1c]; exc=first entry in initialization order list
而不是mov ecx, [ecx+0x14]

还有就是mov ebp,[ecx+0x08]; ebp=base address of kerenel32.dll 之后,我们得到只想第二个_LDR_DATA_TABLE_ENTRY的InMemoryOrderLinks的指针。按理说还要加上LIST_ENTRY InMemoryOrderLinks 和  PVOID Reserved2[2]的长度才能得到后面PVOID DllBase。但是这里却只要加0x08。

我用ollydbg调试查了一下,上面的偏移值是对的。

想了半天没想明白。是不是哪个类型的大小我搞错了,还是数据类型我没有对上号?还是我在msdn上找到的数据结构过时了?请大家多多指教。谢谢。

http://msdn.microsoft.com/en-us/library/windows/desktop/aa813708(v=vs.85).aspx

typedef struct _PEB_LDR_DATA {
  BYTE       Reserved1[8];
  PVOID      Reserved2[3];
  LIST_ENTRY InMemoryOrderModuleList;
} PEB_LDR_DATA, *PPEB_LDR_DATA;

typedef struct _LIST_ENTRY {
   struct _LIST_ENTRY *Flink;
   struct _LIST_ENTRY *Blink;
} LIST_ENTRY, *PLIST_ENTRY, *RESTRICTED_POINTER PRLIST_ENTRY;

typedef struct _LDR_DATA_TABLE_ENTRY {
    PVOID Reserved1[2];
    LIST_ENTRY InMemoryOrderLinks;
    PVOID Reserved2[2];
    PVOID DllBase;
    PVOID EntryPoint;
    PVOID Reserved3;
    UNICODE_STRING FullDllName;
    BYTE Reserved4[8];
    PVOID Reserved5[3];
    union {
        ULONG CheckSum;
        PVOID Reserved6;
    };
    ULONG TimeDateStamp;
} LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;

后来继续google了一下,在csdn上看到这个比较详细的解释http://blog.csdn.net/betabin/article/details/7481949。数据结构类型十分清晰。我现在还想不明白msdn上的数据声明为什么不对。

还有csdn链接上的这些内容好像也是从看雪引用出去的。如果哪位弟兄碰巧还能找到原出处,劳烦别个原链接吧。方便后人查询。万分感激。

继续搜索了一下,找到看雪链接
http://bbs.pediy.com/showthread.php?t=52398

还有我用olldbg调试了一下,发现在我机器上windows 7,mov ecx,[ecx+0x1c]; exc=first entry in initialization order list后的第二个dll不是kernel32, 而是kernelba. 所以要两句
mov ecx,[ecx]; ecx=second entry in list (kernelba.dll)
mov ecx,[ecx]; ecx=second entry in list (kernel32.dll)

这样程序就可以正确运行了。这是我的case。希望我的遭遇能对大家有些启发。
2013-2-16 13:40
0
游客
登录 | 注册 方可回帖
返回
//