共享库中汇编全局变量的更改未在Linux中的C程序中从外部反映

时间:2018-05-20 10:03:35

标签: c linux assembly openssl shared-libraries

我正在通过OpenSSL的AES算法的基本程序集实现。从理论上讲,当密钥长度= 128位时,AES会使用10轮。 我需要以编程方式验证。因此,每当完成一轮AES时,我将全局变量(即round_var)值增加1。 因此,在1个块(16字节)的AES操作结束时,变量的值将为10,并且在2个块(2x16字节)的AES操作结束时,变量的值将为20。 / p>

这是我所做的(aes-586.s),

添加了全球数据声明

.data
.global          round_var
round_var:
.long 0


_x86_AES_decrypt_compact:

; this is the AES round, where I increment global round_var by 1

.L004loop:
    .
    .
    .

;increase round_var by 1 

movl round_var, %eax
addl $1,%eax
movl %eax, round_var

.
.
.
jmp .L004loop

之后我成功构建了Openssl,

./ config -g 386 shared --prefix = / usr

sudo make install

这是我执行解密2000 x 1000次的bash脚本,只是为了确保程序正在运行,没有完成执行以反映round_var的正确值。

cat run.sh


for i in `seq 1 1000`
do
/usr/bin/openssl enc -d -aes-128-ecb -in dummy_200.bin.enc -out dec-dummy_200.bin  -K A10BA778CBC2F2BDE3FB2C66F7F14FB6
done

这是我正在打印round_var值的C程序。

//gcc dlsym_example.c -ldl

#include <dlfcn.h>
#include <stdio.h>

int main()
{
  void* lib=dlopen("/usr/lib/libcrypto.so",RTLD_NOW);

    long * func_addr =NULL;
    func_addr=(long *)dlsym(lib, "round_var");


    while(1)
    {
        if(func_addr !=NULL)
        { 
            printf("round_var %ld\n",*func_addr);

        }
    }    
return 0;
}    

令人惊讶的是我得到了

round_var 0
round_var 0
round_var 0

我期待round_var的变化应该反映在C程序中。 顺便说一下,在gdb调试模式中我交叉检查round_var的值在每次aes循环后递增1表示递增round_var的逻辑是正确的。

我在哪里犯错误?它与可见性有关吗?

提前致谢。

0 个答案:

没有答案