【发布时间】:2018-06-06 07:24:28
【问题描述】:
我使用 -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.
所以,这是我的问题
如何使用 gdb 调试上述 C 代码,使其在已安装 OpenSSL 的断点 AES_cbc_encrypt 处停止?
我是否应该使用 C 程序中的系统调用以外的方法来运行那些 bash 命令,以确保间接调用 aes-x86_64.s 文件的 AES_cbc_encrypt 函数?
任何解决此问题的帮助或链接都将不胜感激。
我在 OpenSSL version-1.0.2n 中使用带有调试符号的 Ubuntu 16.04、gcc-7.0。
【问题讨论】:
-
为什么你没有 fork/exec(v) 到 openssl?
-
好的。让我试试 exec 。在这种情况下,我将检查 gdb 是否在断点 AES_cbc_encrypt 处停止。
-
@克劳斯,谢谢。 exec 为我工作。