求解一道内存溢出的作业题

wy2898 2008-12-05 04:32:15
加精

要求:在执行主函数中直接跳过“printf("x is 1”);”这句,也就是说要让最后的输出结果显示为x is 0

要求方法一:修改func函数中的指针变量ret来达到最终结果。
要求方法二:假设没有修改代码权限,只通过修改主程序中func函数的参数argv[1]的值来达到目的。

void func(char *str) {
char buffer[24];
int *ret;
strcpy(buffer,str);
}

int main(int argc, char **argv) {
int x;
x = 0;
func(argv[1]);
x = 1;
printf("x is 1”);
printf("x is 0”);
}


感谢大家对小弟帮助
...全文
2431 87 打赏 收藏 转发到动态 举报
写回复
用AI写文章
87 条回复
切换为时间正序
请发表友善的回复…
发表回复
jdtxse 2010-05-16
  • 打赏
  • 举报
回复
学习了
wjlsmail 2009-10-13
  • 打赏
  • 举报
回复
[Quote=引用 62 楼 wjlsmail 的回复:]
C/C++ code
函数调用时,栈数据的构成:

argv[0]
.
.
.
argv[n-1]
ret address
ebp --> esp

修改调用参数,使ret address成为想要的调用地址。
[/Quote]
「已注销」 2009-08-21
  • 打赏
  • 举报
回复
mark
wy3650054 2008-12-11
  • 打赏
  • 举报
回复
源码都没有,看个屁啊
qianlinsong 2008-12-10
  • 打赏
  • 举报
回复
方法一不用多说,访问到返回地址并修改,这个比较简单。

方法二有意思一些,这是我的解决办法:
http://www.51asm.com/UserFiles/Image/good%20game.rar

这题难在写通用的溢出代码,不同的编译器,不同的编译选项都会导致地址变化。

good game
riseforest 2008-12-09
  • 打赏
  • 举报
回复
*ret+=20;
这个20是看了汇编代码以后算出来的吗?
aaaa9813 2008-12-09
  • 打赏
  • 举报
回复
好,记录一下
shenzi 2008-12-09
  • 打赏
  • 举报
回复
太牛了、、

boxxer 2008-12-09
  • 打赏
  • 举报
回复
强大,mark
piaomiaoju 2008-12-09
  • 打赏
  • 举报
回复
mark
xpsjppc 2008-12-09
  • 打赏
  • 举报
回复
[Quote=引用 78 楼 riseforest 的回复:]
*ret+=20;
这个20是看了汇编代码以后算出来的吗?
[/Quote]
我这里得出的值是33,我直接通过ebp+4改写的返回地址,运行成功,但是有异常。

void func(char *str)
{
char buffer[24];
__asm
{
mov eax, dword ptr [ebp + 4];
add eax, 33;
mov dword ptr [ebp + 4], eax;
}
strcpy(buffer,str);
}
red_berries 2008-12-08
  • 打赏
  • 举报
回复
第二种方法在有堆栈检测的编绎器上是行不通的,第一种还可以
zounf 2008-12-08
  • 打赏
  • 举报
回复
学习一下
guishuanglin 2008-12-08
  • 打赏
  • 举报
回复
看到楼主说:跪求
就没兴趣了,恶心的词,请教就请教,还跪求,实在不敢看下去。
Johnson1029 2008-12-08
  • 打赏
  • 举报
回复
没赶上!
fanster28_ 2008-12-08
  • 打赏
  • 举报
回复
mark
czyboy123 2008-12-08
  • 打赏
  • 举报
回复
为什么+20??
baoxin052138 2008-12-08
  • 打赏
  • 举报
回复
顶一下,呵呵
nwu_chenrui 2008-12-08
  • 打赏
  • 举报
回复
该老师没有好好教呀,是-1呀
weiym 2008-12-08
  • 打赏
  • 举报
回复
总结下,
方法1是修改Call时Push入堆栈的下一条指令来达到目的,
但是这里要求printf("x is 1")和void func(char *str)的函数原型要一致,
不然会因为堆栈不符合而返回出错,代码如下
void func(char *str/*, int a = 0*/)
{
char buffer[24];
int *ret;
ret = (int*)&str;
ret--;
*ret += 20;
strcpy(buffer,str);
}

int main(int argc, char **argv) {
int x;
x = 0;
func(argv[1]);
x = 1;
printf("x is 1");
printf("x is 0");

}


方法二是通过缓冲区溢出攻击,根据堆栈布局,本质上和上面的修改是类似的,代码根据不同的Exe而异

方法三是强制写入JMP指令,优点是函数原型可以不一致
#include <windows.h>
void func(char *str, int a = 0)
{
char buffer[24];
int *ret;

ret = (int*)&str;
ret--;
unsigned char* pNextCode = (unsigned char*)*ret;
pNextCode += 3;
unsigned char code[] = {0xEB, 0x12};

DWORD nWritten;
WriteProcessMemory(GetCurrentProcess(), pNextCode, code, 2, &nWritten);//将下一条指令强制改写成printf("x is 0");的地址

strcpy(buffer,str);
}

int main(int argc, char **argv) {
int x;
x = 0;
func(argv[1]);
x = 1;
printf("x is 1");
printf("x is 0");

}
加载更多回复(67)
软件设计师考试真题 附带2010年的考试大纲 考试科目1:计算机与软件工程知识  1.计算机科学基础   1.1 数制及其转换      • 二进制、十进制和十六进制等常用制数制及其相互转换   1.2 数据的表示      • 数的表示(原码、反码、补码、移码表示,整数和实数的机内表示,精度和溢出)      • 非数值表示(字符和汉字表示、声音表示、图像表示)      • 校验方法和校验码(奇偶校验码、海明校验码、循环冗余校验码)   1.3 算术运算和逻辑运算      • 逻辑代数的基本运算和逻辑表达式的化简   1.4 数学基础知识      • 命题逻辑、谓词逻辑、形式逻辑的基础知识      • 常用数值计算(误差、矩阵和行列式、近似求解方程、插值、数值积分)      • 排列组合、概率论应用、应用统计(数据的统计分析)      • 运算基本方法(预测与决策、线性规划、网络图、模拟)   1.5 常用数据结构      • 数组(静态数组、动态数组)、线性表、链表(单向链表、双向链表、循环链表)、队列、栈、树(二叉树、查找树、平衡树、线索树、线索树、堆)、图等的定义、存储和操作      • Hash(存储地址计算,冲突处理)   1.6 常用算法      • 排序算法、查找算法、数值计算方法、字符串处理方法、数据压缩算法、递归算法、图的相关算法      • 算法与数据结构的关系、算法效率、算法设计、算法描述(流程图、伪代码、决策表)、算法的复杂性  2.计算机系统知识   2.1 硬件知识    2.1.1 计算机系统的组成、体系结构分类及特性      • CPU和存储器的组成、性能和基本工作原理      • 常用I/O设备、通信设备的性能,以及基本工作原理      • I/O接口的功能、类型和特性      • I/O控制方式(中断系统、DMA、I/O处理机方式)      • CISC/RISC,流水线操作,多处理机,并行处理   2.1.2 存储系统      • 主存-Cache存储系统的工作原理      • 虚拟存储器基本工作原理,多级存储体系的性能价格      • RAID类型和特性   2.1.3 安全性、可靠性与系统性能评测基础知识      • 诊断与容错      • 系统可靠性分析评价      • 计算机系统性能评测方式   2.2 软件知识    2.2.1 操作系统知识      • 操作系统的内核(中断控制)、进程、线程概念      • 处理机管理(状态转换、共享与互斥、分时轮转、抢占、死锁)      • 存储管理(主存保护、动态连接分配、分段、分页、虚存)      • 设备管理(I/O控制、假脱机)      • 文件管理(文件目录、文件组织、存取方法、存取控制、恢复处理)      • 作业管理(作业调度、作业控制语言(JCL)、多道程序设计)      • 汉字处理,多媒体处理,人机界面      • 网络操作系统和嵌入式操作系统基础知识      • 操作系统的配置    2.2.2 程序设计语言和语言处理程序的知识      • 汇编、编译、解释系统的基础知识和基本工作原理      • 程序设计语言的基本成分:数据、运算、控制和传输,过程(函数)调用      • 各类程序设计语言主要特点和适用情况   2.3 计算机网络知识      • 网络体系结构(网络拓扑、OSI/RM、基本的网络协议)      • 传输介质、传输技术、传输方法、传输控制      • 常用网络设备和各类通信设备      • Client/Server结构、Browser/Server结构      • LAN拓扑,存取控制,LAN的组网,LAN间连接,LAN-WAN连接      • 因特网基础知识以及应用      • 网络软件      • 网络管理      • 网络性能分析   2.4 数据库知识      • 数据库管理系统的功能和特征      • 数据库模型(概念模式、外模式、内模式)      • 数据模型,ER图,第一范式、第二范式、第三范式      • 数据操作(集合运算和关系运算)      • 数据库语言(SQL)      • 数据库的控制功能(并发控制、恢复、安全性、完整性)      • 数据仓库和分布式数据库基础知识   2.5 多媒体知识      • 多媒体系统基础知识,多媒体设备的性能特性,常用多媒体文件格式      • 简单图形的绘制,图像文件的处理方法      • 音频和视频信息的应用      • 多媒体应用开发过程   2.6 系统性能知识      • 性能指标(响应时间、吞吐量、周转时间)和性能设计     

33,006

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧