set_thread_area в strace

#c #linux #binary #strace

#c #linux #двоичный #strace

Вопрос:

Использование strace в программе: strace выводит тот же результат извлечения в Debian и CentOS, за исключением set_thread_area. (Версия программы абсолютно одинакова на обоих Linux.)

Почему они отличаются? Есть ли какой — нибудь способ, чтобы выходные данные были одинаковыми на обоих линуксах ? Может ли это различие быть запрограммировано на C ? Отсутствует ли какой-либо пакет в Debian / CentOS?

set_thread_area({entry_number: -1 -> 6, base_addr: 0xb7fb16c0, ограничение: 1048575, seg_32bit: 1, содержимое: 0, read_exec_only: 0, limit_in_pages: 1, seg_not_present:0, useable: 1}) = 0 
открыть("/dev/urandom", O_RDONLY) = 3 
читать(3, "242177)", 3) = 3
set_thread_area(0xff9db33c) = 0

Редактировать
Первый: CentOS i686
Второй: Debian x64, но скомпилированный с -m32

Комментарии:

1. сравните версии strace.

2. и предоставьте более подробную информацию о двух системах, например, тип процессора..

Ответ №1:

Вы спрашиваете о причине, по которой адреса разные, или почему strace выходные данные форматируются по-разному? Если это последнее, я подозреваю, что вы просто имеете дело с двумя разными версиями strace , одна из которых, возможно, устарела. Однако в этом также есть что-то странное:

 set_thread_area(0xff9db33c)             = 0
  

Адрес 0xff9db33c определенно не является допустимым адресом пользовательского пространства на i386. Возможно ли, что одной из ваших систем является x86_64? Это также объяснило бы другой формат, поскольку set_thread_area в i386 принимает указатель на a struct ldt_desc , в то время как в x86_64 он просто принимает фактическое значение указателя для загрузки в регистр потока.

Комментарии:

1. Я спрашиваю о формате вывода. Почему в CentOS есть urandom, а в Debian нет?

2. Хм, urandom не является частью set_thread_area . Это отдельная вещь. В какой момент трассировки это появляется? Я подозреваю, что это настройка случайной canary для защиты от разрушения стека.