Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 네트워크보안
- reversing
- TCP
- Web
- webhacking
- 드림핵
- 웹
- 네트워크
- 소프트웨어
- network
- ftz
- 비박스
- 순서도
- dreamhack
- bee-box
- 리버싱
- WarGame
- 워게임
- hacking
- 해킹
- CodeEngn
- 모의해킹
- 시스템해킹
- XSS
- Webhaking
- 웹해킹
- System
- 소프트웨어보안
- 알고리즘
- 시스템
Archives
- Today
- Total
Without a Break
소프트웨어의 정적 분석과 동적 분석 본문
정적 분석 vs 동적 분석
정적 분석 | 동적 분석 |
소프트웨어의 소스코드가 있을 때 분석이 가능 - 코드의 내용 속에서 취약성을 찾아냄 - 구문 에러 및 논리적 에러를 찾지는 못함 |
소프트웨어를 실행하여 가능한 모든 경우를 실행하도록 하여 오류가 있는지 확인 - 소스코드를 갖고 있지 않은 경우가 많음 - 소프트웨어 개발자가 제시하지 않은 use case를 고려 할 때도 있음 - 블랙 박스 테스트 vs 화이트 박스 테스트 |
+ 참고)
- 동적 분석은 개발의 BUILD에서도 이뤄지지만 OPS의 OPERATE에서도 이루어짐
블랙 박스 테스트 vs 화이트 박스 테스트 (동적 분석)
블랙 박스 테스트
- (소스코드를 포함) 소프트웨어의 내부 구조를 전혀 알지 못함
- 소프트웨어를 다양한 각도로 실행하여 반응을 확인하는 형태로 소프트웨어를 테스트함
- Test 시나리오(입출력 set)를 공격자의 경험에 의존
화이트 박스 테스트
- 소스 코드, 기능 및 구조에 대해서 이해를 바탕으로 Test 진행
- 소프트웨어의 소스코드 및 내부 구조에 대한 이해를 바탕으로 Test 시나리오 (입출력 set) 작성
정적 분석 예제 실습
void foo(char* str){
char* buf = new char[8]; //8바이트 기억 장소 할당
strcpy(buf, str); //str 변수 값 buf에 복사
FILE* file = fopen("out.txt","w"); //out.txt 파일 쓰기모드로 열기
if(!file) //파일 안열릴 때 대비한 예외처리
return; //foo에 속한 buf가 사라짐(buf의 메모리 누수)
for(char* c = buf; *c; ++c)
fputc((int)*c, file);
delete buf;
}
- new(동적)로 기억장소를 할당한 8바이트는 heap에 저장된다. (buf는 stack에 들어있음)
- buf에 8바이트 이상 입력 시 overflow 발생
- delete buf; 로는 동적으로 할당된 게 사라지지 않으므로 "delete[] buf" 형태로 바꿔주어 할당된 heap 공간을 지워야한다. (후에 "fclose(file);"로 파일도 닫아줘야 함)
void f2(){
const char *p = NULL;
for(int i = 0; str[i] != '\0'; i++){
if (str[i] == ' '){
p = str + i; //str에 저장된 문자열에서 빈칸의 바로 다음 문자를 가리킴
break; //str 변수에 저장된 문자열에서 빈칸이 있을 시 빈칸 만나면 멈춤
}
}
return p[1]; //p가 null일 시 오류
}
- str변수에 "Hello world"라는 문자열이 저장되었다고 가정했을 때, p는 w를 가리킴
- 만약 str이 아무것도 가리키고 있지 않다면 p는 그대로 NULL 값을 가지고 있으므로 다음값이 없기 때문에 p[1] 리턴 시 오류
void f3(int a){
struct fred_t *p = NULL;
if (a == 1)
p = fred1;
//if a is not 1 then p is NULL
p->x = 0; //p가 가리키는 x에 0을 넣음. p가 NULL이면 오류
}
- p->x = 0; 윗줄에 p가 NULL인지 점검하는 코드가 필요
'Software > 소프트웨어보안' 카테고리의 다른 글
Stack buffer overflow 이론 (0) | 2022.11.04 |
---|---|
컴퓨터의 구조 및 소프트웨어 실행 원리, C언어와 어셈블리어, Stack (0) | 2022.10.21 |
CVE (0) | 2022.10.09 |
sscanf, Argc/Argv Programming (0) | 2022.10.03 |
DevOps와 Security Advisory (0) | 2022.10.01 |