목록Security/System Hacking (15)
농소
쉘코드 ( Shellcode ) - 공격자가 실행하길 원하는 코드를 미리 작성 - 해당 공격코드를 타겟 프로세스의 메모리에 강제로 업로드 - 타겟 프로세스 메모리에 실행하고자 하는 명령들을 올려놓고 실행 우선 메모리에 올리려면 반드시 알아두어야 하는 것이 있다. 1. 기계어로 작성되어 있어야 한다.2. 데이터 세그먼트 사용 불가능. 왜 기계어로 사용해야하고 세그먼트를 사용하지 못하는건가? 이유는? 1) C로 작성 -> 기계어 추출 하는 경우 - ELF파일 전체가 메모리에 있어야만 명령어를 실행할 수 있다. - 여기선 기계어 코드만 메모리에 존재하기 때문에 실행될 수 없다. 해결책 - 세그먼트 없이 실행 가능하도록 스택형식으로 만들어야함. - 위와 같이 라이브러리 함수의 주소가 다른 프로세스에서의 라이브러..
취약점 - 에러의 한 종류 - 모든 취약점은 에러다. - 하지만 모든 에러는 취약점이라고 할 순 없고, 여러 에러중에 취약점이 발생 메모리 변조 버퍼(스택) 오버 플로우 - 1995년도에 처음 발표 - smashing the stack for fun and profit // phrack 사이트에서 이런 문서가 나옴, 첫 시작 - by Aleph One (바이너리 분석에서 유명한 분) 이러한 버퍼 오버플로우가 생기는 이유는 바로 취약한 함수를 사용하기에 발생. 취약한 함수 : scanf, gets, strcpy, . . . 그중 strcpy를 예를 들자면 우선 두번째 인자값을 buffer2에 복사하는 c코드를 작성하였다.이제 실행파일을 만들고 여러 테스트를 해보면 1. 20바이트를 넘지않는 정상적인 값을 ..
리버싱을 통해 해당 실행파일의 패스워드를 찾기위한 연습을 진행한다. 실행을 해 보았더니 패스워드를 입력하라는 input이 호출되고 아무번호나 입력했더니 wrong password라는 false를 반환한다.true값을 반환받기 위해 이 파일을 분석해 보겠다. 우선 gdb로 바이너리를 asm로 변환시킨 모습이다. 자 이제부터 처음부터 차근차근 분석 해 보겠다. 1 우선 프롤로그를 설정해 주었고, printf를 calll하고 있는걸 봐선 앞에 push값은 주소값을 보아 segment영역 일 것이고 전역변수인 것을 알 수 있다. 확인해 보았더니 Input password: 라는 문자열이 나왔다. 이 과정을 c로 변환해 보면 int main(){ printf("Input password: "); return 0;..
1. 디버거 사용법: GDB (콘솔상에서 사용하는 디버거) - bug : 프로그램에 존재하는 잠재적인 오류 - de-bugging : 버그를 찾는 행위 - de-bugger : 버그를 찾는데 도와주는 도구 일반 사용자 shell(user)가 메모리에 접근할 수 없고, 커널은 메모리에 접근권한을 가지고있다.우리가 프로세스에 접근하기 위해선 디버거를 이용하여 메모리에 접근 할 수 있다. 유명한 디버거 IDA, OLLY.. GDB 사용법 - 실행 : run - 종료 : quit 1). #>gdb 2). #>gdb (gdb) file 2. 자주 사용하는 GDB 명령어, 기능 - 명령어 축약 : (r)un - r만 입력해서 run으로 인식 - 명령어 완성 : r - r로 시작하는 명령어를 보거나 완성 할 수 있다..
시스템 프로그래밍 게임 프로그래밍 - 게임 관련 라이브러리 사용 네트워크 프로그래밍 - 소켓을 이용한 네트워크 라이브러리 사용 시스템 프로그래밍 - 윈도우즈 : win API (Advanced Programing Interface) - 리눅스 : system call 시스템 호출(System call)은 운영 체제의 커널이 제공하는 서비스에 대해, 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스이다. os를 크게 나누면 2가지로 나눌 수 있다 1). shell(user) - 사용자 영역 (목적 - h/w제어)2). H/W(Device) - shell에서 하드웨어에 바로접근하게되면 문제가발생 한다. - 그래서 중간에 커널이 존재한다. 또, 장치를 출력하고싶으면 interface를 이용 - in..
asm 지역변수 배열활용 이번에 asm에서 배열을 지역변수로 나타내려면 어떻게 표현해야 하는지 알아보자 스택이 쌓일 수록 메모리주소값은 작아지는데 배열도 마찬가지로첫주소가 다음주소보다 높다는 생각을 할 수도 있다.하지만 배열같은경우 c에서 처럼 낮은 주소부터 높은 주소로 표현된다. 즉, 배열의 시작주소는 지정된 크기중 가장 낮은 주소에 위치한다. 우선 이전에 했던 입력한 문자열을 반대로 출력하는 코드를 지역변수로 변환해서 asm으로 작성해보겠다. C 언어 int main(){ char buffer[1024] = {0,}; int len =0; printf("input: "); gets( buffer ); while(buffer[len] !=0) {len++ } len--; while( len >= 0) ..
프로세스 메모리 구조 우선 메모리 구조를 확인하기 위해서 sleep이라는 함수를 이용해서 현재 동작중인 프로세스 메모리구조를 확인해 보겠다. 현재 sleep을 이용한 a.out실행파일이 동작중임을 알 수 있고 pid가 802인것을 확인 할 수 있다. 메모리 구조를 확인하기 위해서 proc 임시 디렉토리 -> pid 디렉토리 -> maps를 보면 확인할 수 있다. 자세히 살펴보도록 하자. 메모리 구조를 보았을때 0x00000000 - 0x08047999 범위까지는 사용을 하지않고 0x08048000부터 사용을 하는것을 알 수 있다 08048000-08049000 r-xp 000000..
반복문을 이용하여 정수 5개를 입력하고,입력한 정수들의 합을 구하는 코드를 작성하라. extern printfextern scanf segment .datainput db '%d', 00output db '%d', 10, 00 segment .bssbuffer resd 5len resd 1result resd 1 segment .textglobal main main: mov eax, 0 ; eax레지스터 초기화 mov dword [result], eax ; result값 0으로 초기화 mov dword [len], eax ; len값 0으로 초기화 while1: mov eax, dword [len] ; while문 buffer[0] ~ [4] 까지 cmp eax, 5 je while1_en..
while, for 반복문 연습 문자열을 입력받아서 거꾸로 출력하는 어셈블리 프로그램을 작성 c언어 asm tip. 배열의 주소표현buffer[1024] buffer + 0 buffer + 1 buffer +2 .... buffer + 1023[ ] [ ] [ ] ... [ ] 유의사항 push 출력을 할 때 4바이트 이상인 m/r만 가능
형변환 1). 큰 -> 작은 저장소 ( 큰 문제는 없다. ) int a = 10 short b =a ex) eax -> ax -> al 별다른 명령어가 필요하지않고 해당 레지스터 크기를 줄여서 사용하지만 줄이는과정에 상위비트의 값의 손실이 발생할 수 있음. 2). 작은 -> 큰 short a =10 int b = a 예를들어 8비트 크기의 레지스터인 dl 값을 16비트인 ax로 옮길려고 할시 컴파일 에러가 발생한다. 바로 8비트를 채우고 나머지 8비트를 무엇으로 채워야 할지 모르기 때문이다.그것을 해결하기 위해선 [ movzx ( zero extend - 나머지를 0으로 채우겠다.) ] [ movsx ( sign extend - 부호가 있는경우 음수일 때 나머지 빈공간을 1로 채우겠다. ] 이 두 명령어..