기본 콘텐츠로 건너뛰기

switch-case-default-2

switch-case-default-2

조건이 많은 switch 문

source

#include <stdio.h>

void f (int a)
{
    switch (a)
    {
        case 0: printf("zero\n"); break;
        case 1: printf("one\n"); break;
        case 2: printf("two\n"); break;
        case 3: printf("three\n"); break;
        case 4: printf("four\n"); break;
        default: printf("something unknown\n"); break;
    }
}

int main()
{
    f(2);
}

x86 MSVC

$SG5332 DB        'zero', 0aH, 00H
$SG5334 DB        'one', 0aH, 00H
$SG5336 DB        'two', 0aH, 00H
$SG5338 DB        'three', 0aH, 00H
$SG5340 DB        'four', 0aH, 00H
$SG5342 DB        'something unknown', 0aH, 00H
EXTRN   ___acrt_iob_func:PROC
EXTRN   ___stdio_common_vfprintf:PROC
_main   PROC
        push     OFFSET $SG5336
        call     _printf
        add      esp, 4
        xor      eax, eax
        ret      0
_main   ENDP
_a$ = 8                                       ; size = 4
f PROC
        mov      eax, DWORD PTR _a$[esp-4]
        cmp      eax, 4
        ja       SHORT $LN9@f
        jmp      DWORD PTR $LN13@f[eax*4]
$LN4@f:
        mov      DWORD PTR _a$[esp-4], OFFSET $SG5332
        jmp      _printf
$LN5@f:
        mov      DWORD PTR _a$[esp-4], OFFSET $SG5334
        jmp      _printf
$LN6@f:
        mov      DWORD PTR _a$[esp-4], OFFSET $SG5336
        jmp      _printf
$LN7@f:
        mov      DWORD PTR _a$[esp-4], OFFSET $SG5338
        jmp      _printf
$LN8@f:
        mov      DWORD PTR _a$[esp-4], OFFSET $SG5340
        jmp      _printf
$LN9@f:
        mov      DWORD PTR _a$[esp-4], OFFSET $SG5342
        jmp      _printf
        npad     2
$LN13@f:
        DD       $LN4@f
        DD       $LN5@f
        DD       $LN6@f
        DD       $LN7@f
        DD       $LN8@f
f ENDP

함수 도입부를 보면 a가 4보다 큰 경우 제어 흐름을 라벨 LN9@f으로 넘긴다. 이 라벨에서는 something unknwon\n을 인자로 하는 printf()를 호출한다. a가 4보다 작거나 같으면 4를 곱한 후, $LN13@f 테이블 주소에 더한다. 이게 바로 테이블 내에서 a 값에 따라 필요한 항목의 주소를 계산하는 과정이다. 이런 테이블을 분기 테이블 또는 점프 테이블이라고 한다. npad는 다음 라벨을 정렬하는 어셈블리어 매크로로, 라벨이 4 바이트(또는 16바이트) 경계로 배열된 주소에 저장되게 해준다.

이 블로그의 인기 게시물

데일 카네기 인간관계론 정리

Remove-Server-Header

응답 메시지 내 서버 버전 정보 제거 1. Apache 1) 조치 방법 “/etc/htpd/conf/httpd.conf” 파일 안에서 1. ServerTokens OS → ServerTokens Prod 2. ServerSignature On → ServerSignature Off 로 변경한 후 아파치를 재시작하면 헤더 값의 아파치 버전 정보 및 OS 정보를 제거할 수 있다. 2) 참고 URL http://zetawiki.com/wiki/CentOS_ 아파치_보안권장설정_ServerTokens_Prod,_ServerSignature_Off 2. IIS 1) 조치 방법 IIS 6.0 urlscan_setup 실행. 설치. \windows\system32\inetsrv\urlscan\urlscan.ini 파일을 열어 다음 수정(RemoveServerHeader=0 을 RemoveServerHeader=1 로 변경) 서비스에서 IIS Admin Service 재시작. IIS 7.0 IIS 관리자를 열고 관리하려는 수준으로 이동합니다. 기능 보기에서 HTTP 응답 헤더를 두 번 클릭합니다. HTTP 응답 헤더 페이지에서 제거할 헤더를 선택합니다. 작업 창에서 제거를 클릭하고 예를 클릭합니다. 2) 참고 URL IIS 6.0 : http://gonnie.tistory.com/entry/iis6- 응답헤더-감추기 IIS 7.0 : https://technet.microsoft.com/ko-kr/library/cc733102(v=ws.10).aspx 3. jetty 1) 조치 방법 “jetty.xml” 파일에서 jetty.send.server.version=false 설정 2) 참고 URL http://attenuated-perspicacity.blogspot.kr/2009/09/jetty-61x-hardening.html 4. Nginx ...

CVE-2017-11352

CVE-2017-11352 ImageMagick 에서 발생했던 CVE-2017-9144 취약점의 미흡한 조치로 인하여 동일한 취약점이 다시 발생되었다. 재 발생된 취약점 CVE-2017-11352은 coders/rle.c 에서 RLE 이미지에 대한 부적절한 EOF 처리가 원인이었다. EOF 란? 파일의 끝(End of File, EOF)으로 데이터 소스로부터 더 이상 읽을 수 있는 데이터가 없음을 나타낸다. ImageMagick Github Page 에 들어가보면 해당 이슈를 상세히 확인할 수 있다. 부적절한 EOF 처리 원인은 소스 코드 수정 시 유사한 코드를 복사 붙여넣기 하는 과정에서 검증해야할 변수 명을 고치지 않고 그대로 적용해서 발생했다. operand=ReadBlobByte(image); if (opcode == EOF) ThrowRLEException(CorruptImageError, "UnexpectedEndOfFile" ); 이로 인해서 조치 완료된 줄 알았던 CVE-2017-9144 취약점은 CVE-2017-11352이라는 새로운 취약점 명으로 다시 조치 되었다. case SkipLinesOp: { operand=ReadBlobByte(image); - if (opcode == EOF) + if (operand == EOF) ThrowRLEException(CorruptImageError, "UnexpectedEndOfFile" ); if (opcode & 0x40 ) { operand=ReadBlobLSBSignedShort(image); - if (opcode == EOF) + if (operand == EO...