0

我已经安装了 libgcrypt 共享库。生成 libgcrypt.so 文件。它有一些只读数据。

./configure   ( without -g option for debug symbol)
make install 


static const u32 encT[256] =
  {
    0xa56363c6, 0x847c7cf8, 0x997777ee, 0x8d7b7bf6,
    0x0df2f2ff, 0xbd6b6bd6, 0xb16f6fde, 0x54c5c591,
    0x50303060, 0x03010102, 0xa96767ce, 0x7d2b2b56,
...

}

static const struct
{
  u32 T[256];
  byte inv_sbox[256];
} dec_tables =
  {
    {
      0x50a7f451, 0x5365417e, 0xc3a4171a, 0x965e273a,
      0xcb6bab3b, 0xf1459d1f, 0xab58faac, 0x9303e34b,
      0x55fa3020, 0xf66d76ad, 0x9176cc88, 0x254c02f5,
      .....},

    {
      0x52,0x09,0x6a,0xd5,0x30,0x36,0xa5,0x38,
      0xbf,0x40,0xa3,0x9e,0x81,0xf3,0xd7,0xfb,
      0x7c,0xe3,0x39,0x82,0x9b,0x2f,0xff,0x87,
      .....
    }  
 }

使用 nm 命令我可以找到只读数据的偏移量。

nm /usr/lib/libgcrypt.so | grep encT
0008ffc0 r encT

nm /usr/lib/libgcrypt.so | grep dec_tables
0008fac0 r dec_tables

我想从 C/C++ 程序访问那些只读数据。

    //sample.c
    // gcc sample.c -lgcrypt 

    #include <gcrypt.h>

    int main()
    {

    // ADDRESS of encT[0] = ? + OFFSET  (0008ffc0)
    //print value of encT[0] as 0xa56363c6
    // ADDRESS of dec_tables.T[0] = ? + OFFSET (0008fac0)
    //print value of dec_tables.T[0] as 0x50a7f451
    //print value of dec_tables.inv_sbox[0] as 0x52

    }

我有以下问题

  1. 如何使用这些偏移量从 C 程序访问那些只读数据(encT、dec_tables.T、dec_tables.inv_sbox)?

    2. 还有其他方法可以找到encT, dec_tables.T,dec_tables.inv_sbox 的ADDRESS 吗?

EDIT-1:全局(外部)函数,gcry_cipher_decrypt() 用于执行解密,它调用使用 dec_tables.T,dec_tables.inv_sbox 的静态 do_decrypt --> static do_decrypt_fn()。所以可以找到 dec_tables.T,dec_tables.inv_sbox 的地址相对于 gcry_cipher_decrypt 的地址吗?

我正在使用 gcc-4.9,Ubuntu 16.04。

如果有人帮助我完成上述示例程序或任何链接以了解我如何做到这一点,那将是一个很大的帮助?提前致谢。

4

0 回答 0