Widthness bugs

공부/보안 2021. 6. 2. 15:41
반응형
#include <stdio.h>

int main(){
	int l;
    short s;
    char c;
    
    l = 0xdeadbeef;
    s=l; //short에 int
    c=l; //char에 int
    
    
    printf("l=0x%x (%d bits)\n", l, sizeof(l) * 8);
    printf("l=0x%x (%d bits)\n", s, sizeof(s) * 8);
    printf("l=0x%x (%d bits)\n", c, sizeof(c) * 8);
    
    
    return 0;
}
    

short : 16bit = 2byte이고, b -> 최상위비트가 1이므로 0xffffbeef가 된다.

char : 8bit = 1byte이고, e -> 최상위비트가 1이므로 0xffffffef가 된다.

 

signed int n;

+65535 = 0x0000ffff

+65536 = 0x00010000

 

unsigned short s = +65536 (?)

 

 

./ex2 65536 hello

#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]){
	unsigned short s;
    int i; 
    char buf[80];
    
    if(argc < 3) return -1;
    
    i = atoi(argv[1]); //65536
    s=i; //65536 => 오버플로우로 0이됨
    
    //s는 0이므로 if 통과
    if(s>=80){
    	printf("oh no you don't!\n");
        return -1;
        }
        
    printf("s=%d\n", s);
    memcpy(buf, argv[2], i); //memcpy에선 i가 unsigned int형으로 변환됨
    //buf의 크기는 80인데 65536만큼 복사하려함 (dest, source, size)
    buf[i] = \0';
    printf("%s\n", buf);
    return 0;
}

 

 

65535 = 0x0000ffff

65536 = 0x00010000

 

부동소수점 정밀도 문제 => 실수는 무한히 많은데 이 실수를 유한 개의 비트로 표현하기 위해서는 근삿값으로 표현해야 하기 때문이다. =>부동소수점 반올림 오차

(컴퓨터가 실수를 저장할때 가수부와 지수부로 나누어 저장을 한다.)

(int형으로의 캐스팅은 반올림하지 않고 소수점이하를 잘라버린다.)

 

728x90
반응형

'공부 > 보안' 카테고리의 다른 글

Android 앱 난독화 실험 및 분석  (0) 2021.06.24
cwe119 버퍼 오버플로우 방어  (0) 2021.06.02
암호화 기본 - 2  (0) 2021.06.02
암호화 기본 - 1  (0) 2021.06.01
apk 난독화  (0) 2021.05.17
블로그 이미지

아상관없어

,