rosieblue
article thumbnail
Published 2023. 9. 2. 13:24
[Reversing] __ctype_b_loc Reversing/Tech
728x90

워게임 문제에 아래와 같은 줄이 나왔는데 뭔 소리인지 모르겠어서 공부해보았다.

 

About __ctype_b_loc

__ctype_b_loc은 <ctype.h>에 들어있는 internal function이다.

<ctype.h>에는 우리가 많이 봤던 isnum(int c), isalpha(int c)... 이런 함수들이 들어있는 헤더파일이다.

이때 isalnum(char), isupper(char), isblank(char)이 호출될 때 __isctype(c,type)이라는 함수가 호출되는데, 걍 'c'가 이 'type'이 맞니?를 체크해주는 함수다. 

그런데 __isctype에서 __ctype_b_loc을 호출하게 된다.

# define __isctype(c, type) \
  ((*__ctype_b_loc ())[(int) (c)] & (unsigned short int) type)

 

__ctype_b_loc의 원형

extern const unsigned short int **__ctype_b_loc (void)
     __THROW __attribute__ ((__const__));

__ctype_b_loc은 위와 같이 구성되는데 unsigned short int** 자료형이다.

즉 __ctype_b_loc는  unsigned short int들로 구성된 테이블의 포인터를 반환한다. (아니면 지적해주세요)

 

이 테이블은 384개의 원소로 이루어져있다.

  • any unsigned char value [0,255]
  • EOF (-1)
  • any signed char value [-128,-1)

이런식으로 ! (256+1+128=384)

__ctype_b_loc 가 호출되면 아래와 같이 각 숫자별로 설정된 비트값을 가지는 배열을 생성하고 해당 배열의 시작 주소가 들어있는 주소값을 돌려준다.

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=dmbs335&logNo=220024158102

각 원소(비트값)들은 2 byte로 이루어져있다. 각 원소들은 각 char의 속성을 나타낸다.

 

그러면 저 숫자별로 설정된 비트값, 즉 원소들(0x0002,0x2003등....)은 무엇을 의미하냐?

 

각 비트들은 cytpe.h에 정의된 아래 enum를 참고한다.

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(bit) will return an int where the only 1 in the binary representation is at location "bit". For instance _ISbit(3) = 0b01000, and _ISbit(0) = 0b0001.

 

예를 들어 __cytpe_b_loc() 테이블에서 0x30('0')의 비트로는 뭐가 나오냐면 0x08d8이 나올 것이다.

0x08d8=0000 1000 1101 1000 (Alphanumeric, Graphical, Printing, Hexadecimal, Numeric)

 

 

따라서 얘를 다시 해석해보자

0x800을 이진수로 나타내면 0000 1000 0000 0000 이다. 

따라서 얘가 hexadecimal numreric이어야 한다는 뜻이다. 즉 위 조건문은 isxdigit(a1)과 같은 역할을 하게 되는 것이다

 

 

References

https://stackoverflow.com/questions/53446974/ctype-b-table-and-its-usage

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=dmbs335&logNo=220024158102 

https://braincoke.fr/blog/2018/05/what-is-ctype-b-loc/#about-__ctype_b_loc

profile

rosieblue

@Rosieblue

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!