当前位置: 首页 > news >正文

百度网网站建设的目标建网站哪个平台好

百度网网站建设的目标,建网站哪个平台好,网站搬家怎么做,怎样更新wordpress文章目录 背景介绍问题举例技巧&解决步骤思考参考资料 背景介绍 GDB不仅可以用来调试程序,还可以直接修改被调试程序的二进制文件。这种方式相比于改源码重新编译、gdb attach有什么优势呢?考虑以下企业生产环境中的几个调试场景: 需要…

文章目录

      • 背景介绍
      • 问题举例
      • 技巧&解决步骤
      • 思考
      • 参考资料

背景介绍

GDB不仅可以用来调试程序,还可以直接修改被调试程序的二进制文件。这种方式相比于改源码重新编译、gdb attach有什么优势呢?考虑以下企业生产环境中的几个调试场景:

  • 需要修改的二进制文件是其他领域的,你没有源码和编译工程,让相关领域出调试对接件比较费时,但你只想临时改一行别人的代码,几分钟内完成验证。
  • 调试环境上,使用gdb attach进程方式有困难
    • 被调试的服务(进程)没有启动断点(可定位性很差),或者gdb手动拉起的方法非常复杂,等服务正常启动后再attach已经赶不上打断点的时机。
    • 长时间gdb挂住业务进程导致触发丢心跳复位。
    • 你不确定修改的二进制文件同时被几个进程加载,但你诉求很明确,就是直接改文件,对所有进程生效。

以下举一个简单的例子,介绍GDB修改程序二进制文件的技巧:

问题举例

有一个需修改的二进制文件,C码如下:

int main() {int grade = 65;if (grade <= 60) {			// 这里写错了,需要修改成 >= 60及格printf("pass\n");} else {printf("fail\n");}return 0;
}

程序执行结果如下:

# gcc main.c -o main && ./main
fail

【问题】这里需要将grade <= 60 要改成 grade > 60。只通过GDB修改二进制文件的方式怎么实现?

技巧&解决步骤

1、缺省情况下,gdb是以只读方式加载程序的。需要先通过命令行指定加载方式为可写,再通过file命令加载二进制文件:

(gdb) set write on
(gdb) show write
Writing into executable and core files is on.
(gdb) file main
Reading symbols from main...(no debugging symbols found)...done.

2、结合C码和汇编代码,定位出需修改的汇编指令:

(gdb) disassemble /mr main
Dump of assembler code for function main:0x0000000000001135 <+0>:     55                      push   %rbp0x0000000000001136 <+1>:     48 89 e5                mov    %rsp,%rbp0x0000000000001139 <+4>:     48 83 ec 10             sub    $0x10,%rsp0x000000000000113d <+8>:     c7 45 fc 41 00 00 00    movl   $0x41,-0x4(%rbp)0x0000000000001144 <+15>:    83 7d fc 3c             cmpl   $0x3c,-0x4(%rbp)        # 0x3c = 60, 对应C码:grade <= 600x0000000000001148 <+19>:    7f 0e                   jg     0x1158 <main+35>0x000000000000114a <+21>:    48 8d 3d b3 0e 00 00    lea    0xeb3(%rip),%rdi        # 0x20040x0000000000001151 <+28>:    e8 da fe ff ff          callq  0x1030 <puts@plt>0x0000000000001156 <+33>:    eb 0c                   jmp 0x1164 <main+47>0x0000000000001158 <+35>:    48 8d 3d aa 0e 00 00    lea    0xeaa(%rip),%rdi        # 0x20090x000000000000115f <+42>:    e8 cc fe ff ff          callq  0x1030 <puts@plt>0x0000000000001164 <+47>:    b8 00 00 00 00          mov    $0x0,%eax0x0000000000001169 <+52>:    c9                      leaveq0x000000000000116a <+53>:    c3                      retq

不难发现, if (grade <= 60) 对应的指令为:0x1148 <+19>: 7f 0e jg 0x1158 <main+35>, 这里只需要将jg指令改jle指令即可。

3、jg, jle指令格式参考指令集手册,如下:
在这里插入图片描述
所以只需要将 7f 0e 改成7e 0e即可。

4、修改二进制代码(注意大小端和指令长度),用gdbset命令修改地址处的内容,方法如下:

(gdb) disassemble /mr main
Dump of assembler code for function main:...0x0000000000001148 <+19>:    7f 0e   jg     0x1158 <main+35>...
(gdb) set *(short *)0x1148 = 0xe7e  (指令长度为2个字节,这里是小端序)
(gdb) disassemble /mr main
Dump of assembler code for function main:...0x0000000000001148 <+19>:    7e 0e   jle    0x1158 <main+35>...
End of assembler dump.

退出gdb, 执行main程序输出pass,说明修改生效:

# ./main
pass

思考

如果改成70分以上及格,如何修改?如果是aarch64格式的二进制呢?

注意:涉及到立即数的修改,x86_64和aarch64差异很大。aarch64中不同的汇编指令,对立即数的存储方式和表示范围都不同,具体操作时需查询对应的指令集手册。

参考资料

【1】《100个gdb小技巧》

【2】《ARM Architecture Reference Manual, for ARMv8-A architecture profile》

【3】《64-ia-32-architectures-software-developer-vol-2a-manual》

http://www.shuangfujiaoyu.com/news/49735.html

相关文章:

  • 微信网站建设报价单seo哪家好
  • 离石做网站的网络公司seo怎么快速提高排名
  • dw怎么做别人可以看的网站百度账号怎么改名字
  • 济宁亿蜂网站建设国家免费培训网站
  • dplayer wordpress汕头seo排名公司
  • 玉溪网络推广 网站建设微信小程序免费制作平台
  • 做企业网站的公司有哪些seo关键词排名优化软件怎么选
  • 昆明网站建设猫咪百度优化点击软件
  • 学校的网站怎么做当阳seo外包
  • 男女之间做那个事情很污的网站深圳百度推广seo公司
  • 福州定制网站开发营销推广平台
  • 可以上传图片的网站怎么做最佳磁力搜索引擎
  • 写出网站版面布局设计步骤网络技术培训
  • 城乡建设网站证件查询自助建站免费建站平台
  • 中国石化工程建设公司网站流量购买网站
  • 雅虎网站优化怎么做平台外宣推广技巧
  • 教人做美食的网站百度网盘搜索引擎
  • 云南 网站模版徐州网站设计
  • 只做一页的网站多少钱网络优化app
  • 南京市企业展厅设计公司飞猪关键词排名优化
  • wordpress恶意验证码武威网站seo
  • 怎么做网站赚钱吗最有效的推广学校的方式
  • 嘉兴做网站优化价格全国各城市感染高峰进度查询
  • 网站设置默认主页seo百科大全
  • 小型手机网站建设多少钱拼多多标题关键词优化方法
  • 北京网站制作飞沐b2b电子商务平台有哪些
  • 河源哪有做网站什么软件可以免费引流
  • 珠海企业网站建设公司推广宣传文案
  • 企业年金有什么好处路由器优化大师
  • 做草坪绿化网站软文广告图片