首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用GDB在寄存器上执行算术操作?

如何使用GDB在寄存器上执行算术操作?
EN

Unix & Linux用户
提问于 2020-07-02 18:28:29
回答 1查看 1.2K关注 0票数 1

我想在运行中的程序中注入一点翻转错误。为此,我使用gdb在目标程序中插入一个断点,然后在随机选择的寄存器中翻转一个比特。在Ubuntu中在gdb下执行此指令时,在试图操作$eip时会出现以下错误:

代码语言:javascript
运行
复制
(gdb) info r
...
eip        0x804af59        0x804af59 
...

(gdb) p/a $eip
$4 = 0x804af59 

(gdb) set $eip = $eip ^ 0x800
argument to arithmetic operation not a number or boolean

(gdb) set $eax = $eax ^ 0x1
(gdb)

我不知道这是GDB的错误吗?或者语法错误。

只有当我试图更改以下寄存器时才会发生错误:%eip%esp%ebp。正如我们从清单中看到的,当我更改eax寄存器的内容时,不会出现任何问题。

More信息……

在恶劣环境下工作的安全关键系统中,系统更容易受到软错误的影响,例如单错误翻转(SEU)。在此背景下,研究人员开发了几种技术来检测这类错误并保持系统的可靠性,即容错技术。为了评价这些技术,最有力的方法是故障注入。您应该在运行时将故障注入架构的最关键部分,然后监视硬化的系统,以评估采用的容错技术的故障覆盖率。一般情况下,应采用故障注入来模拟软误差。我非常了解eip注册员,它的工作是什么,以及它对程序的控制流程有多敏感。

使用的GDB版本如下:

代码语言:javascript
运行
复制
gdb --version
GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.5) 7.11.1
Copyright (C) 2016 Free Software Foundation, Inc.

gdb会议的一些产出:

代码语言:javascript
运行
复制
(gdb) p $eip
$1 = (void (*)()) 0x804af34 

(gdb) ptype $eip
type = void (*)()
(gdb) 此外,当我将void转换为int时,它没有任何错误,D12的结果听起来不像,因为我只尝试通过使用0x1 !!(gdb) set $eip=*(int *) $eip ^ 0x1
(gdb) p $eip
$2 = (void (*)()) 0x4244c8ceip的值是0x804af34。因此,如果我们使用0x1执行位操作,则结果应该等于0x804AF35而不是0x4244c8c ?!(gdb) p $eip
$8 = (void (*)()) 0x804af34 
(gdb) p *(int *) ($eip)
$9 = 69487757
(gdb) p *(int *) $eip ^0x1
$10 = 69487756
(gdb) p/a *(int *) $eip ^0x1
$11 = 0x4244c8c
(gdb) 
EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2020-07-03 09:44:26

您应该使用(int)来强制指针指向int。在以后的测试中,您应该使用而不是使用*来取消引用指针;您正在获取$eip指向的内存。

代码语言:javascript
运行
复制
(gdb) p/x (int)$eip  
$4 = 0xf7eb9810
(gdb) p/x (int)$eip^1
$5 = 0xf7eb9811
(gdb) set $eip = (int)$eip^1
(gdb) p/x (int)$eip
$6 = 0xf7eb9811
(gdb) set $eip = (int)$eip^0x800
(gdb) p/x (int)$eip
$7 = 0xf7eb9011
票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/596371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档