반응형
#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 |