修改栈返回地址-改变程序执行流程.docx

修改栈返回地址-改变程序执行流程.docx

ID:52523385

大小:23.21 KB

页数:12页

时间:2020-03-28

修改栈返回地址-改变程序执行流程.docx_第1页
修改栈返回地址-改变程序执行流程.docx_第2页
修改栈返回地址-改变程序执行流程.docx_第3页
修改栈返回地址-改变程序执行流程.docx_第4页
修改栈返回地址-改变程序执行流程.docx_第5页
资源描述:

《修改栈返回地址-改变程序执行流程.docx》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、修改栈中函数调用返回地址,改变程序执行流程任务:修改栈中函数调用返回地址,改变程序执行流程在本例中,通过修改函数function调用返回地址,使程序跳过执行x=1的赋值语句,从而使输出结果为0为了实现这个目标,需要1.找到函数调用返回地址在栈中的位置由于c程序中无法直接取得返回地址,本例中以buffer1地址为基址,通过计算其与返回地址在栈中地址的差值,得到返回地址(在栈中)的地址对应程序中的7、8句7ret=buffer1+12;8(*ret)+=5;buffer1和返回地址通过gdb调试得到2.计算所跳

2、过指令与下一条指令的差值,这通过反汇编代码可以直接计算得出源程序1i#include2voidfunction(inta,intb,intc)3{4charbuffer1[5];5charbuffer2[10];6int*ret;7ret=buffer1+12;8(*ret)+=5;910}11voidmain()12{13intx;14x=0;15function(1,2,3);16x=1;17printf("%d",x);18}编译:gcc-oe-ge.c调试:gdbe反汇编dis

3、assemblemain0xe<+0>:push%ebp0xf<+1>:mov%esp,%ebp0x<+3>:and$0xfffffff0,%esp0x<+6>:sub$0x20,%esp要跳过指令地址0x<+9>:movl$0x0,0x1c(%esp)0xf<+17>:movl$0x3,0x8(%esp)0x<+25>:movl$0x2,0x4(%esp)0xf<+33>:movl$0x1,(%esp)0x<+40>:call0x0xb<+45>:movl$0x1,0x1c(%esp)

4、0x<+53>:mov$0x,%eax0x<+58>:mov0x1c(%esp),%edx0xc<+62>:mov%edx,0x4(%esp)0x<+66>:mov%eax,(%esp)0x<+69>:call0x0x<+74>:leave0x<+75>:retdisassemblefunction:0x<+0>:push%ebpBuffer1地址!0x<+1>:mov%esp,%ebp0x<+3>:sub$0x28,%esp0xa<+6>:mov%gs:0x14,%eax0x<+1

5、2>:mov%eax,-0xc(%ebp)0x<+15>:xor%eax,%eax0x<+17>:lea-0x21(%ebp),%eax0x<+20>:add$0xc,%eax0xb<+23>:mov%eax,-0x1c(%ebp)0xe<+26>:mov-0x1c(%ebp),%eax0x<+29>:mov(%eax),%eax0x<+31>:lea0x5(%eax),%edx0x<+34>:mov-0x1c(%ebp),%eax0x<+37>:mov%edx,(%eax)0xb<+39>:mov-0xc

6、(%ebp),%eax0xe<+42>:xor%gs:0x14,%eax0x<+49>:je0xc0x<+51>:call0x<__stack_chk_fail@plt>0xc<+56>:leave0xd<+57>:ret下面通过设置断点和单步调试的方法找到所需地址在x=0处设置断点break14运行run寄存器情况:(gdb)inforegisterseax0xbffff3e4-ecx0x133a3a60edx0x11ebx0x287ff4esp0xbffff3100xbffff

7、310ebp0xbffff3380xbffff338esi0x00edi0x00eip0x0xeflags0x282[SFIF]cs0x73115ss0x7b123ebpds0x7b123es0x7b123fs0x00gs0x3351栈的情况:0xbffff310:0x0x00287ff40xb00xbffff3380xbffff320:0x0015e9850x0011eb800xbb0x00287ff40xbffff330:0xb00x下一条指令(gdb)display/i$pc=>0x<

8、main+9>:movl$0x0,0x1c(%esp)继续执行(gdb)si15function(1,2,3);1:x/i$pc=>0xf:movl$0x3,0x8(%esp)看寄存器(gdb)inforegisterseax0xbffff3e4-ecx0x133a3a60edx0x11ebx0x287ff4esp0xbffff3100xbffff310ebp0xbffff3380xbffff3

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。