目录
前言:
1 准备程序
PS:翻车现场:
2 分析程序执行流程(栈溢出原理)
2.1 看代码中忘记的知识补充一下:
2.1.1 主函数中涉及的寄存器相关知识:
2.1.2 涉及到的指令
地址传送指令LEA
PTR
REP STOS
int 3中断
段超越指令前缀
2.2 main函数中的初始化部分
2.3 scanf()函数部分
2.4 函数verify_password
2.5 回到主函数
2.6 回顾过程
3 思考利用方式
栈的存储结构
字符数组的定义和使用
构造利用栈溢出
4 我的想法有:
4.1 修改字符串
4.2 接着向下溢出
4.2.1 首先我们要找到输出success的地址
4.2.2 准备十六进制编辑工具
4.2.3 检验结果
4.3 插入shellcode,也是覆盖EIP
4.3.1 编写shellcode
4.3.2 MessageBox函数
MessageBox函数的调用方式
MessageBox函数的位置
完成整个调用汇编代码的编写
确定修改之后的程序的栈空间走向和EIP位置(即如何覆盖)
☆出现错误:地址不可读
☆问题排查
☆错误解决
☆总结:
学习帖子:
大致流程是跟着这篇帖子走下去的,还是比较适合萌新(自己)的。
过程中有些地方看不懂需要延伸的和自己的理解,写在了下面。因为自己真的是个小白,好多不明白的东西,╮(╯▽╰)╭ 。
首先打开VC6.0或者其他编辑器codeblocks等,将如下代码编译成exe文件
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define PASSWORD "1234567" //写入静态密码int verify_password(char *password)//确认密码是否输入正确
{int authenticated;char buffer[8];authenticated=strcmp(password,PASSWORD);strcpy(buffer,password); //存在栈溢出的函数return authenticated;
}int main()
{int valid_flag=0;char password[1024];scanf("%s",password); //输入密码valid_flag=verify_password(password);if(valid_flag) //返回0代表正确,返回1代表错误{printf("incorrect password!n");}else{printf("successn");}//getchar();//暂停一下return 0;
}
一开始我选择使用的是codeblocks,运行程序结果如图:
通过观察代码可以知道,输入的数据是和定义的宏“1234567”对比的,显然当输入1234566时如下图,返回不正确的提示。
那么,当输入1234567时,可以看到程序返回了正确提示:
文章里讲到使用Debug编译器,大概指用debug模式下生成exe文件吧。
用OllyDbg打开刚刚编译好的exe程序如图:
接下来就是寻找主函数的入口了 ,也许是初次接触,我还是觉得这像是一门玄学。
F8(我的F8需要和Fn一起使用,比较麻烦,网上看到有教程,在开机时进入BIOS模式然后进行修改云云,我还是老老实实先点击界面的按钮吧)
==================================
在我使用了codeblocks编译生成的exe后,od打开程序,代码顺序流程和在VC6.0即博客中的完全不一样,找不到主函数了,
o(╥﹏╥)o,这是什么原因,
逼得我只按F7。
按了好几个轮回,都卡在直接输入了,还没看到main函数的影子然后就提示输入了,完了输入后 直接就返回结果结束了???什么情况,是我没有注意到main函数跳过去了吗?
==================================
本文发布于:2024-02-01 11:19:26,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170675756836234.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |