修改可执行文件,改变程序走向,把jne 改成je
2016-04-11 16:44
302 查看
1. 准备样本程序源代码
2. 编译生成a.out
3. 运行输出:
4. 反汇编
5. 查看法反汇编出来的代码,main函数部分
6. 注意
7. bvi打开文件,定位到 0x598周围数据如下
8. 把0x598处 0x75改成 0x74
9. 保存,并执行,查看输出
成功改变if判断走向。
说明:0x75 对应 汇编指令jne, 0x74 对应汇编指令 je
修改后的文件反汇编出来的代码main 部分如下
#include <stdio.h> #include <unistd.h> void main(){ char buf[1]={0}; while(1){ if(buf[0]==0){ printf("11111\n"); } else{ printf("22222\n"); } sleep(1); }; }
2. 编译生成a.out
$ gcc a.c
3. 运行输出:
$ ./a.out 11111 11111 11111
4. 反汇编
$objdump -d a.out >a.S
5. 查看法反汇编出来的代码,main函数部分
0000000000400586 <main>: 400586: 55 push %rbp 400587: 48 89 e5 mov %rsp,%rbp 40058a: 48 83 ec 10 sub $0x10,%rsp 40058e: c6 45 ff 00 movb $0x0,-0x1(%rbp) 400592: 0f b6 45 ff movzbl -0x1(%rbp),%eax 400596: 84 c0 test %al,%al 400598: 75 0c jne 4005a6 <main+0x20> 40059a: bf 50 06 40 00 mov $0x400650,%edi 40059f: e8 ac fe ff ff callq 400450 <puts@plt> 4005a4: eb 0a jmp 4005b0 <main+0x2a> 4005a6: bf 56 06 40 00 mov $0x400656,%edi 4005ab: e8 a0 fe ff ff callq 400450 <puts@plt> 4005b0: bf 01 00 00 00 mov $0x1,%edi 4005b5: e8 c6 fe ff ff callq 400480 <sleep@plt> 4005ba: eb d6 jmp 400592 <main+0xc> 4005bc: 0f 1f 40 00 nopl 0x0(%rax)
6. 注意
if(buf[0]==0){对应
400598: 75 0c jne 4005a6 <main+0x20>
7. bvi打开文件,定位到 0x598周围数据如下
$ bvi a.out
0000058C EC 10 C6 45 FF 00 0F B6 45 FF 84 C0 75 0C BF 50 06 40 00 E8 ...E....E...u..P.@.. 000005A0 AC FE FF FF EB 0A BF 56 06 40 00 E8 A0 FE FF FF BF 01 00 00 .......V.@..........
8. 把0x598处 0x75改成 0x74
0000058C EC 10 C6 45 FF 00 0F B6 45 FF 84 C0 74 0C BF 50 06 40 00 E8 ...E....E...u..P.@.. 000005A0 AC FE FF FF EB 0A BF 56 06 40 00 E8 A0 FE FF FF BF 01 00 00 .......V.@..........
9. 保存,并执行,查看输出
$ ./a.out 22222 22222
成功改变if判断走向。
说明:0x75 对应 汇编指令jne, 0x74 对应汇编指令 je
修改后的文件反汇编出来的代码main 部分如下
0000000000400586 <main>: 400586: 55 push %rbp 400587: 48 89 e5 mov %rsp,%rbp 40058a: 48 83 ec 10 sub $0x10,%rsp 40058e: c6 45 ff 00 movb $0x0,-0x1(%rbp) 400592: 0f b6 45 ff movzbl -0x1(%rbp),%eax 400596: 84 c0 test %al,%al 400598: 74 0c je 4005a6 <main+0x20> 40059a: bf 50 06 40 00 mov $0x400650,%edi 40059f: e8 ac fe ff ff callq 400450 <puts@plt> 4005a4: eb 0a jmp 4005b0 <main+0x2a> 4005a6: bf 56 06 40 00 mov $0x400656,%edi 4005ab: e8 a0 fe ff ff callq 400450 <puts@plt> 4005b0: bf 01 00 00 00 mov $0x1,%edi 4005b5: e8 c6 fe ff ff callq 400480 <sleep@plt> 4005ba: eb d6 jmp 400592 <main+0xc> 4005bc: 0f 1f 40 00 nopl 0x0(%rax)
相关文章推荐
- android 测试 Monkey 和 MonkeyRunner 的使用
- 【bzoj1877】【SDOI2009】【晨跑】【费用流】
- win10网络共享失败提示共享依赖服务无法启动的解决办法
- PHP PSR-2 代码风格规范 (中文版)
- hdoj1240 Asteroids!
- 4-8网易jAVA一面回顾.
- qwebpage中在新窗口打开连接失败
- iOS开发基础学习笔记——标签栏(UITabBar)
- mysql集群之MYSQL CLUSTER
- 微软bing搜索搜索源码,可以直接运行
- Win7 64位安装MySQL
- UILabel 添加下划线,改变字体颜色,NSMutableAttributedString实现富文本
- JNI学习积累之二 ---- 数据类型映射、域描述符说明
- 回溯法解决迷宫问题
- caffe Data layer prefetch queue empty重启
- Ubuntu下运行Faster-Rcnn
- 企业Linux系统管理员常用命令大全实例解析(2)
- iOS开发 滤镜效果
- spring-data-jpa Specification 拼接复杂查询
- 解决办法:Java使用Selenium JAR包没有帮助文档