__ctype_b表及其用法

时间:2018-11-23 12:45:15

标签: reverse-engineering glibc

我有一段使用__ctype_b数组的asm代码,我试图了解它是什么,有人知道它在做什么吗?

ps:我知道__ctype_b_loc()是什么,这是不同的。

mov     eax, [rbp+counter]
cdqe
add     rax, [rbp+server_received_buffer]
movzx   eax, byte ptr [rax]
movsx   rax, al
add     rax, rax
mov     rdx, rax
mov     rax, cs:__ctype_b
lea     rax, [rdx+rax]
movzx   eax, word ptr [rax]
movzx   eax, ax
and     eax, 20h
test    eax, eax

1 个答案:

答案 0 :(得分:0)

我找到了答案。 __ctype_b是在“ __isctype_l”宏中使用的数组:

#  define __isctype_l(c, type, locale) \
  ((locale)->__ctype_b[(int) (c)] & (unsigned short int) type)

,它在这里使用:

#  define __isalnum_l(c,l)  __isctype_l((c), _ISalnum, (l))
#  define __isalpha_l(c,l)  __isctype_l((c), _ISalpha, (l))
#  define __iscntrl_l(c,l)  __isctype_l((c), _IScntrl, (l))
#  define __isdigit_l(c,l)  __isctype_l((c), _ISdigit, (l))
#  define __islower_l(c,l)  __isctype_l((c), _ISlower, (l))
#  define __isgraph_l(c,l)  __isctype_l((c), _ISgraph, (l))
#  define __isprint_l(c,l)  __isctype_l((c), _ISprint, (l))
#  define __ispunct_l(c,l)  __isctype_l((c), _ISpunct, (l))
#  define __isspace_l(c,l)  __isctype_l((c), _ISspace, (l))
#  define __isupper_l(c,l)  __isctype_l((c), _ISupper, (l))
#  define __isxdigit_l(c,l) __isctype_l((c), _ISxdigit, (l))
#  define __isblank_l(c,l)  __isctype_l((c), _ISblank, (l))

那么我们将到达这个枚举

enum
{
  _ISupper = _ISbit (0),    /* UPPERCASE.  */
  _ISlower = _ISbit (1),    /* lowercase.  */
  _ISalpha = _ISbit (2),    /* Alphabetic.  */
  _ISdigit = _ISbit (3),    /* Numeric.  */
  _ISxdigit = _ISbit (4),   /* Hexadecimal numeric.  */
  _ISspace = _ISbit (5),    /* Whitespace.  */
  _ISprint = _ISbit (6),    /* Printing.  */
  _ISgraph = _ISbit (7),    /* Graphical.  */
  _ISblank = _ISbit (8),    /* Blank (usually SPC and TAB).  */
  _IScntrl = _ISbit (9),    /* Control character.  */
  _ISpunct = _ISbit (10),   /* Punctuation.  */
  _ISalnum = _ISbit (11)    /* Alphanumeric.  */
};

现在我们需要从_ISbit定义中了解0x20代表什么

# if __BYTE_ORDER == __BIG_ENDIAN
#  define _ISbit(bit)   (1 << (bit))
# else /* __BYTE_ORDER == __LITTLE_ENDIAN */
#  define _ISbit(bit)   ((bit) < 8 ? ((1 << (bit)) << 8) : ((1 << (bit)) >> 8))
# endif

0x20:0010 0000

从asm代码中我知道这是大字节序。因此班次号应该是5,并且是空白。

结论:该asm代码从server_received_buffer中找到空白