




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
修改栈中函数调用返回地址 改变程序执行流程 任务 修改栈中函数调用返回地址 改变程序执行流程 在本例中 通过修改函数 function 调用返回地址 使程序跳过执行 x 1 的赋值语句 从而使输出结果为 0 为了实现这个目标 需要 1 找到函数调用返回地址在栈中的位置 由于 c 程序中无法直接取得返回地址 本例中以 buffer1 地 址为基址 通过计算其与返回地址在栈中地址的差值 得到返 回地址 在栈中 的地址 对应程序中的 7 8 句 7 ret buffer1 12 8 ret 5 buffer1 和返回地址通过 gdb 调试得到 2 计算所跳过指令与下一条指令的差值 这通过反汇编代码可 以直接计算得出 源程序 1 i include 2 void function int a int b int c 3 4 char buffer1 5 5 char buffer2 10 6 int ret 7 ret buffer1 12 8 ret 5 9 10 11 void main 12 13 int x 14 x 0 15 function 1 2 3 16 x 1 17 printf d n x 18 编译 gcc o e g e c 调试 gdb e 反汇编 disassemble main 0 xe push ebp 0 xf mov esp ebp 0 x and 0 xfffffff0 esp 0 x sub 0 x20 esp 0 x movl 0 x0 0 x1c esp 0 xf movl 0 x3 0 x8 esp 0 x movl 0 x2 0 x4 esp 0 xf movl 0 x1 esp 0 x call 0 x 0 xb movl 0 x1 0 x1c esp 0 x mov 0 x eax 0 x mov 0 x1c esp edx 0 xc mov edx 0 x4 esp 0 x mov eax esp 0 x call 0 x 0 x leave 0 x ret disassemble function 0 x push ebp 0 x mov esp ebp 0 x sub 0 x28 esp 0 xa mov gs 0 x14 eax 0 x mov eax 0 xc ebp 0 x xor eax eax 0 x lea 0 x21 ebp eax 0 x add 0 xc eax 0 xb mov eax 0 x1c ebp 0 xe mov 0 x1c ebp eax 0 x mov eax eax 0 x lea 0 x5 eax edx 0 x mov 0 x1c ebp eax 0 x mov edx eax 0 xb mov 0 xc ebp eax 0 xe xor gs 0 x14 eax 0 x je 0 xc 0 x call 0 x 0 xc leave Buffer1Buffer1 地址地址 要跳过要跳过 指令地指令地 址址 0 xd ret 下面通过设置断点和单步调试的方法找到所需地址 在 x 0 处设置断点 break 14 运行 run 寄存器情况 gdb info registers eax 0 xbffff3e4 ecx 0 x133a3a60 edx 0 x11 ebx 0 x287ff4 esp 0 xbffff310 0 xbffff310 ebp 0 xbffff338 0 xbffff338 esi 0 x00 edi 0 x00 eip 0 x0 x eflags 0 x282 SF IF cs 0 x73 115 ss 0 x7b 123 ds 0 x7b 123 es 0 x7b 123 fs 0 x00 gs 0 x33 51 栈的情况 0 xbffff310 0 x0 x00287ff40 xb00 xbffff338 0 xbffff320 0 x0015e9850 x0011eb800 xbb0 x00287ff4 0 xbffff330 0 xb00 x 下一条指令 gdb display i pc 0 x movl 0 x0 0 x1c esp 继续执行 gdb si 15function 1 2 3 1 x i pc 0 xf movl 0 x3 0 x8 esp 看寄存器 gdb info registers eax 0 xbffff3e4 ecx 0 x133a3a60 edx 0 x11 ebx 0 x287ff4 esp 0 xbffff310 0 xbffff310 ebpebp ebp 0 xbffff338 0 xbffff338 esi 0 x00 edi 0 x00 eip 0 xf0 xf eflags 0 x282 SF IF cs 0 x73 115 ss 0 x7b 123 ds 0 x7b 123 es 0 x7b 123 fs 0 x00 gs 0 x33 51 栈 gdb x 10 x esp 0 xbffff310 0 x0 x00287ff40 xb00 xbffff338 0 xbffff320 0 x0015e9850 x0011eb800 xbb0 x 0 xbffff330 0 xb00 x 继续执行下一条指令 gdb si 0 x15function 1 2 3 1 x i pc 0 x movl 0 x2 0 x4 esp 寄存器 gdb info registers eax 0 xbffff3e4 ecx 0 x133a3a60 edx 0 x11 ebx 0 x287ff4 esp 0 xbffff310 0 xbffff310 ebp 0 xbffff338 0 xbffff338 esi 0 x00 edi 0 x00 eip 0 x0 x eflags 0 x282 SF IF cs 0 x73 115 ss 0 x7b 123 ds 0 x7b 123 es 0 x7b 123 fs 0 x00 gs 0 x33 51 栈 X X 地址在这地址在这 gdb x 10 x esp 0 xbffff310 0 x0 x00287ff40 x0 xbffff338 0 xbffff320 0 x0015e9850 x0011eb800 xbb0 x 0 xbffff330 0 xb00 x 继续下一条指令 gdb si 0 xf 15function 1 2 3 1 x i pc 0 xf movl 0 x1 esp 寄存器 gdb info registers eax 0 xbffff3e4 ecx 0 x133a3a60 edx 0 x11 ebx 0 x287ff4 esp 0 xbffff310 0 xbffff310 ebp 0 xbffff338 0 xbffff338 esi 0 x00 edi 0 x00 eip 0 xf0 xf eflags 0 x282 SF IF cs 0 x73 115 ss 0 x7b 123 ds 0 x7b 123 es 0 x7b 123 fs 0 x00 gs 0 x33 51 栈 gdb x 10 x esp 0 xbffff310 0 x0 x0 x0 xbffff338 0 xbffff320 0 x0015e9850 x0011eb800 xbb0 x 0 xbffff330 0 xb00 x 继续下一条指令 gdb si 0 x15function 1 2 3 1 x i pc 0 x call 0 x 寄存器 gdb info registers eax 0 xbffff3e4 ecx 0 x133a3a60 edx 0 x11 ebx 0 x287ff4 esp 0 xbffff310 0 xbffff310 ebp 0 xbffff338 0 xbffff338 esi 0 x00 edi 0 x00 eip 0 x0 x eflags 0 x282 SF IF cs 0 x73 115 ss 0 x7b 123 ds 0 x7b 123 es 0 x7b 123 fs 0 x00 gs 0 x33 51 栈 参数 1 被压入栈 gdb x 10 x esp 0 xbffff310 0 x0 x0 x0 xbffff338 0 xbffff320 0 x0015e9850 x0011eb800 xbb0 x 0 xbffff330 0 xb00 x 开始调用函数 function gdb si function a 1 b 2 c 3 at e c 3 3 1 x i pc 0 x push ebp 寄存器 esp 值减小了 4 gdb info registers eax 0 xbffff3e4 ecx 0 x133a3a60 edx 0 x11 ebx 0 x287ff4 esp 0 xbffff30c 0 xbffff30c ebp 0 xbffff338 0 xbffff338 esi 0 x00 edi 0 x00 eip 0 x0 x eflags 0 x282 SF IF cs 0 x73 115 ss 0 x7b 123 ds 0 x7b 123 es 0 x7b 123 fs 0 x00 gs 0 x33 51 栈 返回地址被压入栈 gdb x 10 x esp 0 xbffff30c 0 xb 0 x0 x0 x 0 xbffff31c 0 xbffff3380 x0015e9850 x0011eb800 xbb 0 xbffff32c 0 x0 xb0 通过查看栈中内容 我们发现 0 xb 原来是 call 返回后下一条指令 的地址 0 xb movl 0 x1 0 x1c esp 我们要修正的正是这个地址 其位于 0 xbffff30c 处 执行下一条指令 push ebp gdb si 0 x3 1 x i pc 0 x mov esp ebp 寄存器 gdb info registers eax 0 xbffff3e4 ecx 0 x133a3a60 edx 0 x11 ebx 0 x287ff4 esp 0 xbffff308 0 xbffff308 ebp 0 xbffff338 0 xbffff338 esi 0 x00 edi 0 x00 eip 0 x0 x eflags 0 x282 SF IF cs 0 x73 115 ss 0 x7b 123 ds 0 x7b 123 es 0 x7b 123 fs 0 x00 gs 0 x33 51 返回地址返回地址 栈 ebp 的值入栈 gdb x 10 x esp 0 xbffff308 0 xbffff3380 xb 0 x0 x 0 xbffff318 0 x0 xbffff3380 x0015e9850 x0011eb80 0 xbffff328 0 xbb0 x 执行下一条指令 mov esp ebp gdb si 0 x3 1 x i pc 0 x sub 0 x28 esp 寄存器 ebp 被 esp 赋值 gdb info registers eax 0 xbffff3e4 ecx 0 x133a3a60 edx 0 x11 ebx 0 x287ff4 esp 0 xbffff308 0 xbffff308 ebp 0 xbffff308 0 xbffff308 esi 0 x00 edi 0 x00 eip 0 x0 x eflags 0 x282 SF IF cs 0 x73 115 ss 0 x7b 123 ds 0 x7b 123 es 0 x7b 123 fs 0 x00 gs 0 x33 51 栈 0 xbffff308 0 xbffff3380 xb 0 x0 x 0 xbffff318 0 x0 xbffff3380 x0015e9850 x0011eb80 0 xbffff328 0 xbb0 x 执行下一条指令 sub 0 x28 esp gdb si 3 1 x i pc 0 xa mov gs 0 x14 eax 寄存器 gdb info registers eax 0 xbffff3e4 ecx 0 x133a3a60 edx 0 x11 ebx 0 x287ff4 esp 0 xbffff2e0 0 xbffff2e0 ebp 0 xbffff308 0 xbffff308 esi 0 x00 edi 0 x00 eip 0 xa0 xa eflags 0 x282 SF IF cs 0 x73 115 ss 0 x7b 123 ds 0 x7b 123 es 0 x7b 123 fs 0 x00 gs 0 x33 51 栈 gdb x 10 x esp 0 xbffff2e0 0 x00237e490 x0015e7850 xbffff2f8 0 x00145ae5 0 xbffff2f0 0 x0 x08049ff40 xbffff3080 x 0 xbffff300 0 x0011eb800 x08049ff4 执行下一条指令 mov gs 0 x14 eax gdb si 0 x3 1 x i pc 0 x mov eax 0 xc ebp 寄存器 gdb info registers eax 0 x3f8efa00 ecx 0 x133a3a60 edx 0 x11 ebx 0 x287ff4 esp 0 xbffff2e0 0 xbffff2e0 ebp 0 xbffff308 0 xbffff308 esi 0 x00 edi 0 x00 eip 0 x0 x eflags 0 x282 SF IF cs 0 x73 115 ss 0 x7b 123 ds 0 x7b 123 es 0 x7b 123 fs 0 x00 gs 0 x33 51 执行下一条指令 mov eax 0 xc ebp gdb si 0 x3 1 x i pc 0 x xor eax eax 寄存器 gdb info registers eax 0 x3f8efa00 ecx 0 x133a3a60 edx 0 x11 ebx 0 x287ff4 esp 0 xbffff2e0 0 xbffff2e0 ebp 0 xbffff308 0 xbffff308 esi 0 x00 edi 0 x00 eip 0 x0 x eflags 0 x282 SF IF cs 0 x73 115 ss 0 x7b 123 ds 0 x7b 123 es 0 x7b 123 fs 0 x00 gs 0 x33 51 栈 gdb x 10 x esp 0 xbffff2e0 0 x00237e490 x0015e7850 xbffff2f8 0 x00145ae5 0 xbffff2f0 0 x0 x08049ff40 xbffff3080 x3f8efa00 0 xbffff300 0 x0011eb800 x08049ff4 执行 xor eax eax gdb si 7ret buffer1 12 1 x i pc 0 x lea 0 x21 ebp eax 寄存器 gdb info registers eax 0 x00 ecx 0 x4a6d85dc edx 0 x11 ebx 0 x287ff4 esp 0 xbffff2e0 0 xbffff2e0 ebp 0 xbffff308 0 xbffff308 esi 0 x00 edi 0 x00 eip 0 x0 x eflags 0 x246 PF ZF IF cs 0 x73 115 ss 0 x7b 123 ds 0 x7b 123 es 0 x7b 123 fs 0 x00 gs 0 x33 51 栈 gdb x 10 x esp 0 xbffff2e0 0 x00237e490 x0015e7850 xbffff2f8 0 x00145ae5 0 xbffff2f0 0 x0 x
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025届安徽省芜湖县一中高二物理第二学期期末监测试题含解析
- 创新教育模式下的领导力挑战与机遇
- 商业视角下的教育产业变革游戏化学习的融资前景
- 实验教学中学生情感教育的教育心理学方法
- 教育资源的优化配置与科技力量的运用
- 学习动力激发的教育心理学方法论
- 政府推动的教育政策在社区的落地情况
- 2025届陕西省渭南市合阳县高一物理第二学期期末监测试题含解析
- 全面基础护士考试题库及答案
- 未来办公模式的探索沉浸式学习与自适应平台的结合
- DBJ51T 118-2019 四川省城镇供水厂运行管理标准
- 全国统一市政工程预算定额
- 中波发射台供配电系统
- 沧州小升初分班数学试卷
- 河道防洪治理工程的成本控制方案
- 《声光影的内心感动:电影视听语言》期末考试
- 夏天来了安全饮食
- 高考作文-“新八段文”精讲
- 解读-刑法修正案十一
- 抚养权变更协议模板2024年
- 《赞美技巧》课件
评论
0/150
提交评论