【问题标题】:How to change the value of variable with gdb如何使用 gdb 更改变量的值
【发布时间】:2021-07-09 10:27:48
【问题描述】:

我有一个名为exploit.c的文件,其中:

#include <stdbool.h>
#include <stdio.h>

const char y1 = 'a';
const char y2 = 'b';
const char y3 = 'x';
const char y4 = 'y';
const char y5 = 'i';
const char y6 = 'j';

char x1 = 'f' ^ 'a';
char x2 = 'l' ^ 'b';
char x3 = 'a' ^ 'x';
char x4 = 'g' ^ 'y';
char x5 = 'y' ^ 'i';
char x6 = '-' ^ 'j';

int main() {
  bool c = false;
  if(c) { printf("The flag is: %c%c%c%c%c%c%c%c%c%c%c\n", x1 ^ y1, x2 ^ y2, x3 ^ y3, x4 ^
  y4, x4 ^ y4, x5 ^ y5, x6 ^ y6, x1 ^ y1, x2 ^ y2, x3 ^ y3, x4 ^ y4); }
  return 0;
}

我知道我可以通过改变 c 的值来打印出标志。但我想通过组装/执行来做到这一点。如何在不更改布尔值但使用 gcc 和 gdb 的情况下打印标志?

【问题讨论】:

  • 使用一堆打印命令,例如p/c x1 ^ y1(假设编译器没有优化这些命令)。您还可以覆盖程序计数器,以便执行到printf
  • @Jester 是的,我想覆盖 bool c 但问题是我不知道该怎么做
  • 从教程“如何使用 GDB”开始... -- GDB 有内置帮助,使用命令“help”。

标签: c debugging assembly gcc gdb


【解决方案1】:

您可以通过gdb 进行操作。首先你要知道c 是一个局部变量,这意味着它将在未优化的构建中放置在堆栈上,不会完全优化它并删除死代码。

此时您有两个选择:您可以修改变量所在的内存位置(因此在堆栈中的某个位置),或者您可以使用gdb assignment

要设置内存,您可以使用set *((char *) address_of_c) = 1 之类的东西。 (boolchar 在大多数架构上具有相同的大小,并且 bool 使用 0 或非 0 作为 false/true。)您可能只使用 bool*

通过 gdb 分配,相同的内存区域将被修改,但这取决于 GDB 是否能够使用调试符号(由gcc -g 创建)在此函数的堆栈帧中查找局部变量的名称和位置。如果它可用,那就太好了:您不必手动查找变量的地址。

【讨论】:

    【解决方案2】:

    这很容易,所以我可以自己做:) 我们有exploit.c 文件,我需要在其中对其进行调试以获取带有'gcc' 的标志。我运行程序:

    gcc -g exploit.c -o exploit 得到了“exploit”,它是可执行的exploit.c 文件。

    然后:gdb exploit

    我们在第 21 行有bool c = false;,所以在上面加上换行符:

    break 21
    

    然后:我通过这个命令改变了 c 的值:set variable c = “true” 然而,当我通过“next”进入下一行时,它又变成了假。 所以我再次重置值:set variable c = “true”,然后是下一步按钮: 是的,它打印出了旗帜:

    (gdb) next
    
    The flag is: flaggy-flag
    23    return 0;
    

    【讨论】:

    • 当您在一行上设置断点时,它会要求调试器在该行执行之前停止程序。
    • 小修复:set variable c = "true" 只是巧合;它将字符串"true" 的(可能被截断的)地址放入c,并且您编译的程序可能会将c 的任何非零值视为真。最好是set variable c = true
    • 你不是说without changing the value of boolean吗?但是在这里你改变布尔值。
    猜你喜欢
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-18
    • 1970-01-01
    相关资源
    最近更新 更多