c - 如何调试使用 GDB 执行 bash shell 脚本的 C 程序?

标签 c linux gdb

我使用 -g 386 shared --prefix=/usr 选项构建 OpenSSL-1.0.2n(以使用基本汇编版本)以生成共享库 libcrypto.so.1.0.0。

在 crypto/aes 文件夹中,生成了 aes-x86_64.s。

为了执行 AES 加密和解密,我在 linux 终端中使用了以下命令。

/usr/bin/openssl enc -aes-128-cbc -in secrets.txt -out cipher.bin
/usr/bin/openssl enc -d -aes-128-cbc  -in cipher.bin -out decrypt_cip2.txt 

使用GDB,我可以如下调试上述命令的执行

gdb openssl

gdb> set args enc -d -aes-128-cbc  -in cipher.bin -out decrypt_cip2.txt 
gdb> b AES_cbc_encrypt
gdb> run
Breakpoint 1, AES_cbc_encrypt () at aes-x86_64.s:1300
1300        cmpq    $0,%rdx

从上面gdb调试的输出可以看出,调用了aes-x86_64.s文件AES_cbc_encrypt函数。

我需要验证一下,如果我使用系统调用执行bash脚本的C程序来进行AES解密,AES_cbc_encrypt函数会不会aes-x86_64.s 文件 仍称为?

//test.c
    #include <stdio.h>
    #include <stdlib.h> 

    int main()
    {
    char cmd[500];
    sprintf(cmd, "/usr/bin/openssl enc -d -aes-128-cbc  -in cipher.bin -out decrypt_cip2.txt ");
    system(cmd);
    return 0;
      }
    gcc test.c -o test
    ./test

我是不是说错了,如果我说我执行这个C程序时,它间接调用openssl库(libcrypto.so)并进行解密。所以它必须调用aes-x86_64的AES_cbc_encrypt函数。 o 文件。

但是,当我使用 GDB 调试该程序时,它没有显示对 aes-x86_64.o 文件的 AES_cbc_encrypt 函数的任何调用。它只是对/sysdeps/posix/system 进行了一些调用。 c、/sysdeps/unix/sysv/linux/x86_64/sigaction.c等

gdb test

gdb> b AES_cbc_encrypt
Function "AES_cbc_encrypt" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 1 (AES_cbc_encrypt) pending.

所以,这是我的问题

  1. 如何使用 gdb 调试上述 C 代码,使其在已安装的 OpenSSL 的断点 AES_cbc_encrypt 处停止?

  2. 我是否应该在 C 程序中使用系统调用以外的方式来运行那些 bash 命令,以确保间接调用 aes-x86_64.s 文件AES_cbc_encrypt 函数?

解决此问题的任何帮助或链接将不胜感激。

我正在使用 Ubuntu 16.04,gcc-7.0,在 OpenSSL version-1.0.2n 中打开调试符号。

最佳答案

However, when I use GDB to debug this program it is not showing any call to AES_cbc_encrypt function of aes-x86_64.o file. It simply make some calls to /sysdeps/posix/system.c

默认情况下,GDB 只会调试一个进程(test 程序)并且该进程不会调用 AES_cbc_encrypt——而是创建一个新进程——$SHELL,这又会创建另一个进程 -- /usr/bin/openssl,并且只有那个孙进程调用 AES_cbc_encrypt

由于您正在调试 openssl 的祖 parent ,因此完全预期 GDB 不会观察到 AES_cbc_encrypt 被链接到您的进程中 < em>正在 调试,AES_cbc_encrypt 上的断点从未建立,也从未“触发”。

how to debug the above C code using gdb so that it will stop at breakpoint AES_cbc_encrypt of installed OpenSSL?

有几种方式:

  1. 一种方法是修改 test,使其调用 gdb 而不是调用 openssl:

    sprintf(cmd, "gdb --args/usr/bin/openssl enc -d -aes-128-cbc -in cipher.bin -out decrypt_cip2.txt"); 系统(cmd);

  2. 如果您不能或不想修改测试程序,您可以将/usr/bin/openssh重命名为/usr/bin/openssl.exe 并将 shell 包装器放入 /usr/bin/openssl:

    #!/bin/sh exec gdb --args/usr/bin/openssl.exe "$@"

  3. 如果您不想执行上述任一操作,您可以使用 GDB 的多重劣质支持。文档 herehere .

更新:

I am little bit wondering how it will execute ..exe file

UNIX 系统不关心文件扩展名(它们查看文件内部,即查看文件内容,以确定如何运行它)。

因此您可以将可执行文件重命名为您想要的任何:openssl.fooopenssl.baropenssl.exe openssl.orig 等,它仍然会正确运行。

关于c - 如何调试使用 GDB 执行 bash shell 脚本的 C 程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47961855/

相关文章:

捕获分段违规并继续生活

docker arm32 gdb ptrace : Could not trace the inferior process

c - 纯C如何统计字数、字符数、行数

c - 无限循环在 pthread 中终止

linux - 加载/etc/profile/时发现错误

linux - 如何使用shell脚本创建多个目录

c++ - 使用 CMake 和 AUTORCC 的 Qt 资源文件

gdb - 使用 gdb 列出加载的模块

objective-c - 以编程方式确定在另一个进程中加载​​了哪些模块? (OS X)

为 Mips 架构编译 C