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

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

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

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 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
活跃值: (439)
能力值: ( 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
活跃值: (439)
能力值: ( 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上找到的数据结构过时了?请大家多多指教。谢谢。

f8cK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3#2K6k6r3&6Q4x3X3g2E0K9h3y4J5L8%4y4G2k6Y4c8Q4x3X3g2U0L8$3#2Q4x3V1k6W2L8W2)9J5k6s2g2K6i4K6u0r3L8r3W2T1M7X3q4J5P5g2)9J5c8Y4N6A6L8X3c8G2N6%4y4Q4x3V1k6V1k6i4y4C8N6r3!0H3i4K6u0r3j5h3p5^5x3e0x3%4x3o6S2Q4x3U0S2$3i4K6y4p5N6Y4y4Q4x3X3f1^5y4g2)9J5z5g2)9J5k6h3q4K6M7s2R3`.

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上看到这个比较详细的解释ba0K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3u0D9L8$3N6Q4x3X3g2U0M7$3c8F1i4K6u0W2L8X3g2@1i4K6u0r3j5X3g2@1j5h3u0A6L8W2)9J5c8X3q4J5N6r3W2U0L8r3g2Q4x3V1k6V1k6i4c8S2K9h3I4K6i4K6u0r3y4K6b7^5x3e0V1@1z5g2!0q4x3#2)9^5x3q4)9^5x3W2!0q4y4W2)9&6y4g2!0n7x3q4!0q4y4W2)9^5c8q4!0m8c8g2!0q4y4#2!0n7b7W2)9&6x3#2!0q4y4W2)9&6c8g2)9^5y4q4!0q4y4#2!0n7x3g2!0n7b7W2!0q4y4g2)9&6c8g2)9^5b7W2!0q4y4g2)9^5c8q4)9^5x3g2!0q4y4g2)9^5z5q4)9^5y4W2!0q4y4W2!0n7z5q4)9^5y4g2!0q4y4W2)9&6z5g2!0n7x3q4!0q4x3#2)9^5x3q4)9^5x3W2!0q4y4W2)9^5z5q4)9&6x3g2!0q4y4#2)9^5c8g2!0n7x3q4!0q4y4g2)9&6b7#2!0m8z5q4!0q4z5q4!0n7c8W2)9&6z5q4!0q4y4W2)9^5x3#2!0n7x3#2!0q4y4q4!0n7z5q4)9^5c8q4!0q4y4W2)9&6z5q4)9^5c8g2!0q4y4#2)9&6z5g2!0n7c8r3#2K6k6r3&6Q4c8e0c8Q4b7U0S2Q4z5p5q4Q4c8e0N6Q4z5f1q4Q4z5o6c8Q4c8e0k6Q4z5e0g2Q4b7U0m8Q4c8e0k6Q4z5p5c8Q4b7f1g2Q4c8e0g2Q4b7e0y4Q4b7U0m8Q4c8e0k6Q4z5e0S2Q4z5p5g2Q4c8e0c8Q4b7U0S2Q4b7V1q4Q4c8e0c8Q4b7V1u0Q4z5o6m8Q4c8e0c8Q4b7U0W2Q4z5o6S2Q4c8e0c8Q4b7U0S2Q4z5p5c8Q4c8e0g2Q4b7f1k6Q4b7U0W2Q4c8e0y4Q4z5o6m8Q4z5o6t1`.

还有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
游客
登录 | 注册 方可回帖
返回