如何调试用GDB执行bash shell脚本的C程序?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何调试用GDB执行bash shell脚本的C程序?相关的知识,希望对你有一定的参考价值。
我使用-g 386共享--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函数。
我需要验证,如果我使用C程序,其中使用系统调用来执行bash脚本来执行AES解密,那么aes-x86_64.s文件的AES_cbc_encrypt函数是否仍会被调用?
//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.o文件的AES_cbc_encrypt函数。
但是,当我使用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.
所以,这是我的问题
- 如何使用gdb调试上面的C代码,以便在安装的OpenSSL的断点AES_cbc_encrypt处停止?
- 我应该在C程序中使用非系统调用来运行那些将确保间接调用aes-x86_64.s文件的AES_cbc_encrypt函数的bash命令吗?
任何帮助或链接来解决这个问题都会非常明显。
我在OpenSSL版本1.0.2n中使用Ubuntu 16.04,gcc-7.0和调试符号。
但是,当我使用GDB调试此程序时,它没有显示对aes-x86_64.o文件的AES_cbc_encrypt函数的任何调用。它只是调用/sysdeps/posix/system.c
默认情况下,GDB只调试一个进程(test
程序)并且该进程不调用AES_cbc_encrypt
- 而是创建一个新进程 - $SHELL
,它反过来创建另一个进程 - /usr/bin/openssl
,并且只有那个孙进程调用AES_cbc_encrypt
。
因为你正在调试openssl
的祖父母,所以完全可以预期GDB不会观察AES_cbc_encrypt
被链接到你正在调试的进程,并且AES_cbc_encrypt
上的断点永远不会建立,也不会“触发”。
如何使用gdb调试上面的C代码,以便在安装的OpenSSL的断点AES_cbc_encrypt处停止?
有几种方法:
- 一种方法是修改
test
,使其调用gdb
而不是调用openssl
:sprintf(cmd, "gdb --args /usr/bin/openssl enc -d -aes-128-cbc -in cipher.bin -out decrypt_cip2.txt"); system(cmd);
- 如果您不能或不想修改
test
程序,可以将/usr/bin/openssh
重命名为/usr/bin/openssl.exe
并将shell包装器放入/usr/bin/openssl
:#!/bin/sh exec gdb --args /usr/bin/openssl.exe "$@"
- 如果你不想做上述任何一种,你可以使用GDB多次低级支持。文档here和here。
更新:
我有点想知道它将如何执行..exe文件
UNIX系统不关心文件扩展名(它们查看文件内部,即文件内容,以找出如何运行它)。
因此,您可以将可执行文件重命名为您想要的任何内容:openssl.foo
,openssl.bar
,openssl.exe
,openssl.orig
等,它仍然可以正常运行。
以上是关于如何调试用GDB执行bash shell脚本的C程序?的主要内容,如果未能解决你的问题,请参考以下文章
GDB怎么调试使用.sh(shell脚本)启动的程序?(未完成,待测试)