본문 바로가기

System_Security12

12. 후킹 후킹 키로거와 비슷한 맥락이라고 생각하면 되는 기술이다. 키로거는 어떤 특수한 키를 눌를때 다른 명령어가 실행되는 것을 키로거라고 한다. 이와 비슷하게 함수를 실행시키는 척 다른작업을 실행시키는 방법을 후킹 이라고한다. 예를 들면 리눅스에도 훅포인트가 존재하는대 iptables 가 대표적인 훅포인트라고 한다. 이유는 iptables 명령어를 실행시키면 네트워킹 스택으로 함수를 후킹하는데 사용 되기 떄문이다.( 정확한 과정은... 잘모르겠다) 어쨋거나 이런식으로 후킹포인트가 존재 한다 . 개발자들을 위한 훅역시 존재하는대 이를 글로벌 후킹이라고한다. getuid() 역시 함수 명령어이다. 이 함수를 변형해서 내가 원하는 작업을 하도록 해보자. 일단 ltrace 명령어로 id 를 해보면 getuid() = .. 2017. 8. 18.
11. Buffer Overflow 드디어 시스템 해킹의 꽃 버퍼 오버플로우 를 공부해보자. 일단 메모리의 구조와, 프로세스가 동작하는 원리를 알게되면 자연스럽게 어떤식으로 프로세스가 메모리에 올라가서 실행이되는지알 수 있게 된다. 그럼 취약점에 대해서도 간단하게 알수있는대.. 일단 메모리의 구조를 이용한 취약점이 버퍼 오버플로우 이다. 현재 우리는 완벽한 코드는 없다, 어떤 코드든지 취약점이 존재하고 그취약점을 분석해서 공격, 방어를 하는것이 우리의 목표이다. 여기서 메모리의 구조를 어떤식으로 분석하고, 이용하는지 알아보자. 일단 Buffer Overflow 취약점은 - Stack overflow 라고 생각 하면된다. // 물론 현재 배운내용은 C에 한정되어 있지만 이해를 하게되면 쉽게 다른 언어역시 쉽게 이해된다. C 에서 char b.. 2017. 8. 8.
10. 기계어 -> C 복원 연습 0x8048460 : push %ebp 0x8048461 : mov %ebp,%esp 0x8048463 : sub %esp,0x40c // 1036바이트의 스택 메모리를 사용 0x8048469 : push 0x80485b0 0x804846e : call 0x8048398 0x8048473 : add %esp,4 // printf("~~~"); 0x8048476 : mov %eax,%ds:0x80496f0 0x804847b : push %eax 0x804847c : push 0x400 0x8048481 : lea %eax,[%ebp-1024] 0x8048487 : push %eax 0x8048488 : call 0x8048368 0x804848d : add %esp,12 // fgets(char *ad, .. 2017. 8. 3.
09. 디버거 시스템은 바이너리로 이루어져있다. 여기서 공학과 역공학의 개념이 필요하다. 공학은 바이너리를 만드는 과정이라고 한다. 즉 컴파일러 ( 소스 -> 바이너리 ) 로 만드는 과정 역공학은 바이너리를 다시 원래대로 돌리는 과정이다 . 즉 디컴파일러 ( 바이너리 -> 소스 ) 여기서 우리가 해야하는 것은 역공학이다. 하지만 역공학은 존재하지않는다. 정확히 말하면 바이너리를 소스로 만드는 것은 불가능하다. 가장 기본적으로 불가능한 이유중 하나가 어떤 변수를 사용하는지 알 수 없기 때문이다. 그럼 어떻게 해야하는가? 바이너리 -> 소스는 불가능하지만, 바이너리 -> 어셈블리 가 가능하기 때문에 우리는 기계어 수준에서 분석을 해야한다! 결국은 시스템 보안에서 가장 중요한것은 바이너리 분석을 얼마나 잘하느냐? 이다. 그.. 2017. 8. 3.
08. 시스템 콜 시스템 콜 ( system call ) 이란 리눅스에서 사용되는 용어로써 간단하게 설명하자면 ( 보 호 ) user ( Shell ) | kernel | H/W 핵심기술을 다룸 (파일, 장치, 프로세스 관리) 즉 사용자와 하드웨어를 연결 위와같은 형식으로 되어있을 경우 user 가 kernel 에 콜을 해주는 것을 시스템 콜이라고 한다. 그럼 kernel 은 하드웨어에 접근하여 해당 명령어를 실행시켜주게 된다. 즉 사용자와 , 하드웨어의 연결을 해주는 명령어를 시스템 콜이라고 한다. 위의 용어는 리눅스지만, widows 역시 시스템 콜과 같은 API 가 존재한다. API 은 윈도우용 시스템 콜이라고 생각하면 된다. 시스템 콜을 공부하기에 앞서 유용한 명령어 두가지를 알아보자. 1. ltrace : lib.. 2017. 8. 1.
07. 메인 함수 메모리의 구조에대해서 공부해 보았다. 그럼 우리가 C언어를 이용할때 사용되는 main 함수역시 함수인대 어떤식으로 인자들이 처리되는지 공부해보자. 일단 main 함수의 기본적인 정의는 int main( int argc, char *argv[]){ } 물론 우리는 간편하게 int main(){ } 이런식으로 생략형을 쓰긴 하지만 원래는 위의 표현이 정확한 표현이다. 여기서 두가지 인자에 대해서 알아보자. argc : 메인함수의 인자 카운트 즉, 인자의 갯수를 넘겨준다. *argv[] : 인자의 갯수만큼의 주소값을 넘겨준다. 어떤식으로 사용되는지 정확히 알기위해서는 간단한 실습예제를 통해서 알아보자. // 과제 추가내용 printf 역시 메모리 정리를 해주어야한다. 메모리 누수를 없에야됨 1. 메인 함수의 .. 2017. 8. 1.
06. 프로세스 메모리 구조 메모리의 구조스택구조를 파악하기 앞서 기본적인 세그먼트 부터 알아야한다. 일단 우리가 어셈블러에서 사용했던 세그먼트를 살펴보자, 세그먼트란 메모리의 공간을 나눠놓은 단위라고 생각하면된다. 즉 우리가 어셈블러에서 data,text로 사용하고 있었는대 사실 여기에는 stack 세그먼트 역시 존재한다. 코드상에서는 보이지 않지만 우리가 사용하고 있었는대, 차근차근 하나씩 알아보자. 일단 정리를 해보자면, .text - 실행할 명령어, 코드, ... - 실행 권한이 필요한 것들, 따라서 쓰기 권한이 없다. 읽기전용 -> 이유 취약점 .data ( .bss, heap, ... ) - 전역변수 ( 초기화, 비초기화 ) - heap 메모리 ( 동적 메모리 / malloc, .... ) .stack ( 정적 메모리 ).. 2017. 7. 26.
05. 분기문,반복문 분기문어셈블리에서는 분기문, 반복문이 차이가 없다. 일단 분기문을 살펴보자. 분기문에는 대표적으로 if, switch 문이 존재한다. 우리는 IF 문만 알면 자연스럽게 switch 문도 알게된다. 일단 분기문을 사용하기 위해서는 비교문을 알아야하는대 어셈블리어에서 비교문을 나타내는 명령어는 cmp 가 있다. 이것을 이용해서 if문을 표현할수가 있는대. 여기서 한가지 더 알아야하는 표현이 eflags 이다. flag는 cmp에서 나온 결과값을 저장해주는 역할을 하는대 결과 자체를 저장하는 것이아니라, 연산이 완료 되었을때 플레그의 값이 바뀌는 것을 이용하는 것이다. 1. 음수 : 2번째 인자가 더 크다. SF = 1 ZF = 0 2. 양수 : 1번째 인자가 더 크다. SF = 0 ZF = 0 3. 0 : .. 2017. 7. 24.