Я рассматриваю базовую сборку OpenSSL алгоритма AES.Теоретически я знаю, AES использует 10 раундов, когда длина ключа = 128 бит.Мне нужно проверить программно.Поэтому я увеличивал значение глобальной переменной (т.е. round_var) на 1 каждый раз, когда завершается один раунд AES.Таким образом, в конце операции AES на 1 блоке (16 байт) значение переменной будет равно 10, а в конце операции AES на 2 блоке (2x16 байт) значение переменной будет равно 20.
Вот чтоЯ сделал (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, совместно используемый --prefix = / usr
make
sudo make install
Этот сценарий bash, с помощью которого я выполняю расшифровку 2000 x 1000 раз, просто чтобы убедиться, что программа запущена, а не завершена, чтобы отразить правильное значение 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
Это программа на C, где я печатаю значение round_var.
//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 должны быть отражены в программе на Си.Кстати, в режиме отладки GDB Я проверяю перекрестно, значение round_var увеличивается на 1 после каждого раунда aes, что означает, что логика увеличения round_var верна.
Где я делаю ошибки?Это связано с видимостью?
Заранее спасибо.