使用 gdb 更改参数值

逆向工程 拆卸 部件 调试 数据库 海湾合作委员会
2021-06-27 04:38:45

我有一个名为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;
}

如何在不更改布尔值但使用 gcc 和 gdb 的情况下打印出标志?

2个回答

if 语句很可能被编译为条件跳转,因此您只需要单步执行直到比较并更改结果。例如,如果跳转是jejne,则需要更改零标志(ZF)以强制向相反方向跳转。

有关更改 GDB 中的标志,请参阅

https://stackoverflow.com/a/31339372

另一种选择是将指令指针($rip 或 $eip)更改为与 if 主体对应的位置。

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

gcc -g exploit.c -o exploit并得到了可执行exploit.c文件“exploit”

然后: gdb exploit

我们bool c = false;在第 21 行,因此在其上放置中断线:

break 21

然后:我通过以下命令更改了 c 的值:set variable c = true However, when I went to the next line by “next” it become false again. So I reset the value again: set variable c = “true”` 然后下一个按钮: 是的,它打印出标志:

(gdb) next

The flag is: flaggy-flag
23    return 0;