본문 바로가기
반응형

프로그래밍/SYSTEM HACKING14

[SYSTEM HACKING] 시스템 취약점 - 버퍼 오버플로우( Buffer Overflow ) / 인자에 대한 취약점 및 표준입력에서 취약점 시스템 취약점 - 버퍼 오버플로우( Buffer Overflow ) / 인자에 대한 취약점 및 표준입력에서 취약점에 대해서 정리한다. 취약점 - "Smashing the stack for fun and profit" - 1995년 by Aleph One - 최초의 스택 오버플로우 문서 ! 시스템 취약점 거의 대부분이 오버플로우 취약점 - 임의의 코드를 실행할 수 있는 취약점 - 악성코드 배포 ... 1. 취약점의 원인 - 취약한 함수를 사용 - scanf, gets, strcpy, recv, ... 2. 취약한 프로그램의 작성 - buffer overflow - stack overflow - 오버플로우 취약점이 존재하는 경우 메모리의 값을 변조할 수 있다. - 모든 경우에 있어서 항상 모든 메모리의 값을.. 2017. 11. 16.
[SYSTEM HACKING] GDB를 이용한 바이너리 분석 실습 GDB를 이용한 바이너리 분석 실습에 대해서 정리한다. - 바이너리 분석 실습( 패스워드 찾기 ) 1). 예제 프로그램 #> wget http://192.168.4.200/password1 2). 패스워드 찾기 - 기계어를 -> C 코드로 변환 [ 어셈블리 코드 ] - 분석을 할때는 언제 얼만큼의 메모리를 할당해서 사용하는지를 정확하게 파악해야 한다. - 어셈블리 상태에서는 해당 분기문이 if 같은 그냥 조건문인지 아니면 while이나 for 같은 반복문인지를 한줄만 보고는 판단할 수 없기 때문에 섣부르게 판단하지 않도록 한다!! [ c언어 코드 ] #include char password[] = "th3p4ssw0rd"; int main() { // 1036 byte char buffer[1024]; .. 2017. 11. 13.
[SYSTEM HACKING] 디버거(DeBugger) 사용법( GDB ) / 바이트 오더( byte order ) 디버거(DeBugger) 사용법( GDB ) / 바이트 오더( byte order )에 대해서 정리한다. ! 디버거 사용법 - De + Bugger - Bug: 벌레( 그레이스 호퍼 ) - 프로그램에 오류를 일으킬수 있는 존재( Bug ) - De Bug -> Debugging -> DeBugger - linux에는 GDB가 있다. !! gcc 컴파일시에 -g 옵션을 이용하면 디버깅 모드로 컴파일이 된다. ( 컴파일시 디버깅에 대한 정보를 담는다 ) ! 디버거를 통한 프로그램의 실행 #> ./myshell -> execve -> 프로세스 - 그냥 실행할 시에는 실행되는 프로세스에 접근 불가 #> ./myshell -> 디버거 -> execve -> 프로세스 - 디버거를 통해 프로세스를 직접 제어(접근) .. 2017. 11. 13.
[SYSTEM HACKING] 시스템 콜 실습 ( mymkdir, mycat, myshell ) 시스템 콜 실습 ( mymkdir, mycat, myshell )에 대해서 정리한다. [실습] 1. mymkdir ( mkdir 명령 ) - 프로그램 실행 결과 #> ./mymkdir path: mydir success mkdir #> ./mymkdir path: mydir fail mkdir - system call: read, write, mkdir * 프로그램 작성시 고려해야 하는 부분 ! read 시스템 콜은 뉴라인까지 입력을 받는다. ! read 시스템 콜은 읽어들인 문자열의 길이를 반환한다. ! 메모리는 지역변수만 사용 ! 다른 C 표준 함수는 사용하지 않는다. [ C언어 코드 ] int main() { char path[1024]; int len = 0; int ret = 0; write( .. 2017. 11. 2.
[SYSTEM HACKING] main 함수의 인자 / 시스템 프로그래밍( 시스템 콜 ) main 함수의 인자 / 시스템 프로그래밍( 시스템 콜 )에 대해서 정리한다. 1. main 함수의 인자 #> ./a.out hello hello * 위 내용은 hello라는 인자를 받아서 그 인자의 내용인 hello를 출력하는 프로그램이다. - 포인터 배열 사용 - 포인터 배열: 배열인데 주소를 원소로 하는 - 배열 포인터: 포인터인데 배열을 나타내는 c 표준에 정의되어있는 main 함수 원형 2가지int main( int argc, char *argv[] );int maint(); * main 함수를 사용할때 인자를 생략할 수 있지만 생략해도 int argc, char *argv[] 인자는 존재한다. ( 다만 인자를 사용하려면 명시해줘야 한다 ) #> ./a.out hello 프로그램 코드 hello.. 2017. 11. 1.
[SYSTEM HACKING] 어셈블리 call & jmp 명령의 차이 / 스택 메모리를 이용한 인자 전달 / reverse.asm 지역변수 사용해서 표현하는 실습 어셈블리 call & jmp 명령의 차이 / 스택 메모리를 이용한 인자 전달 / reverse.asm 지역변수 사용해서 표현하는 실습에 대해서 정리한다. 1. call & jmp 명령의 차이 - 해당 주소의 명령을 실행 - 해당 주소를 eip 레지스터에 저장 ( call 명령의 경우 ) 차이점: - jmp 명령어는 해당 주소를 바로 이동 - call 명령어는 스택에 데이터를 저장하고 이동( 복귀할 주소를 push 해서 스택에 저장 ) * eip 레지스터에는 다음에 실행할 명령어의 주소가 들어있다. 2. 스택 메모리를 이용한 인자 전달 - 함수는 프롤로그와 에필로그로 구분하기 때문에 main도 함수이므로 적용해줘야 한다. [ 어셈블리 코드 - func.asm ] extern printf section .d.. 2017. 11. 1.
[SYSTEM HACKING] 실행중인 프로세스의 전체 메모리 구조 / 스택에서 사용되는 레지스터 / 어셈블리에서 함수 실행중인 프로세스의 전체 메모리 구조 / 스택에서 사용되는 레지스터 / 어셈블리에서 함수에 대해서 정리한다. 스택 메모리 - 함수 - 지역변수 1. 실행중인 프로세스의 전체 메모리 구조 - /proc/pid/maps ( 실행했던 프로세스 id에 메모리 구조를 나타내는 파일 ) * 리눅스에서 .so 확장자는 동적 라이브러리를 나타내고 .a는 정적 라이브러리를 나타낸다. ( 리눅스 메모리 구조가 그림으로 표현된 것이다..env, etc, argc, argv도 스택의 일부분이다... ) 메모리 구조( maps ) 08048000-08049000 r-xp 00000000 03:01 425344/root/a.out08049000-0804a000 rw-p 00000000 03:01 425344/root/a.out4.. 2017. 10. 26.
[SYSTEM HACKING] 어셈블리 반복문( jmp ) 어셈블리 반복문( jmp )에 대해서 정리한다. 반복문 : for, while, do-while - 어셈블리에서 분기문과 반복문의 차이는 jmp를 이용해서 코드를 반복 시켜주느냐 마느냐의 차이이다. // for문int i; for(i = 0; i 2017. 10. 24.