728x90

What is Unsupervised Learning?

 

우리말로 비지도 학습이라하며

 

label이 없는 데이터가 입력으로 들어오는 경우에 해당한다.

 

 

 

Clustering

 

                         <그림 1>

 

위 그림 1과 같은 데이터셋이 주어질때 비슷한 특징을 갖는 "무리"를 빨간색 원과 같이 모아주는 것이다.

 

Supervised Learning - Classification 과 비슷하다.

 

"분류"를 한다는 점에서는 닮았지만 데이터에 label이 없어 분류하는 방식이 다르다.

 

그러기에 비슷한 데이터들을 엮어주는 역할만 한다.

 

사용자가 본 영화와 비슷한 영화를 추천해주거나 비슷한 이슈의 뉴스를 묶어서 보여준다는 등이 있다.

728x90

'Machine Learning > coursera' 카테고리의 다른 글

Vectorization  (0) 2016.02.22
Gradient Descent  (1) 2016.02.08
Cost Function - Intuition  (2) 2016.02.08
Linear Regression with one variable - Cost Function  (0) 2016.01.25
Supervised Learning  (0) 2016.01.23
728x90

What is Supervised Learning?

 

우리말로 '지도 학습'이라 하며

 

학습 데이터의 'right answers'가 주어진다.

 

supervised learning에서

 

주어진 입력들을 연속적인 값으로 추정할때 regression (회귀 분석)을 사용하며

 

주어진 입력들을 discrete(별개의) 값으로 '분류'할때 Classification (분류)를 사용한다.

 

 

 

Regression

 

<그림1>

 

 

위 그림1에서 볼 수 있듯이 집 크기에 따른 가격의 예측이다.

 

집 가격의 요인에는 크기뿐만아니라 방 개수, 마당 유무, 주택이나 아파트나 등등 많은 요인이 있지만

 

여기서는 간단하게 크기(넓이)만 따졌다. 해서 입력 데이터는 Size이다.

 

이미 있는 실제 데이터(superviesed learning이니까)를 기반으로 보라색처럼 직선으로 추정하면

 

750 feet제곱일때 예상 가격은 15만 달러정도이며, 파란색과 같은 곡선 추정할때에 예상가격은 20만 달러정도이다.

 

이러한 과정을 Regression (회귀 분석)이라 한다.

 

 

Classification

 

          <그림2-1>

 

이번에는 분류를 보자. 분류의 경우 결과가 연속성이 없고 별개의 값으로 나뉜다.

 

Tumor(종양) Size가 입력으로 들어왔다. 그리고 Malignant(악성)인지 아닌지로 분류하였다.

 

근데 만약 내가 종양이 발견되었고 종양의 크기를 알때에 악성인지 악성이 아닌지

 

그래프에서 Tumor Size축의 중간쯤에 위치하면 판단하기 어렵다. 입력을 하나 더 늘려보자.

 

 

                                          <그림2-2>

 

나이축을 추가하여 그래프에 표시하면 이런 모양이 나올 것이다.

 

만약 나의 종양 크기가 그래프에서 축위 보라색 화살표이고 나이도 축위 보라색 화살표 일때

 

양성그룹에 속하므로 양성일 가능성이 커서 안심할 수 있다.

 

이렇듯 Classification은 주어진입력들을 별개의 값으로 분류 한다. 해서

 

그림2-2에서 최적화된 검은직선을 찾는 게 중요하다.

728x90

'Machine Learning > coursera' 카테고리의 다른 글

Vectorization  (0) 2016.02.22
Gradient Descent  (1) 2016.02.08
Cost Function - Intuition  (2) 2016.02.08
Linear Regression with one variable - Cost Function  (0) 2016.01.25
Unsupervised Learning  (0) 2016.01.25
728x90

아래와 같은 모양의 오일러 공식은 1748년 오일러가 무한급수의 좌우 극한값이


같음을 증면하면서 발표되었다. (위키백과)



e^{ix} \,=\, \cos x + i\sin x


(여기서, e는 자연로그의 밑인 상수이고, i는 제곱하여 -1이 되는 허수단위이다.)



위 식의 x 에 파이를 넣으면


e^{i \pi} + 1 = 0 라는


"오일러 등식"을 얻을 수 있다.


또한


오일러 공식에서 x 에 a+b를 넣으면



이 된다.


위 식은 이렇게도 표현 할 수 있다.



식을 정리하면



이 되므로 




으로 삼각함수의 덧셈정리를 증명할 수 있다.

728x90
728x90



시리얼 값이 5B134977135E7D13 일때 Name값을 찾아야 한다.

실행 ㄱㄱ



이름과 시리얼을 똑같이 입력하니 역시나 실패한다.

디버거 ㄱㄱ



main의 시작점이다. 이름을 입력 받는다.



핵심인 입력받은 Name값을 Serial로 변형시키는 코드이다. (0x00401077 ~ 0x00401004)


ESI 레지스터값을 3이랑 비교하며 3보다 크거나 같으면 0으로 초기화 한다. (0x00401077 ~ 0x0040107C)


ESI 레지스터값에 따라 xor하는 메모리 번지가 다르다. (0x0040107E)


기본적으로 Name에서 1Byte를 EDX로 읽어와서 ECX와 xor한 뒤 (0x00401088)


Easy_Key.00401150 함수의 인자로 push하여 가공한다. (0x00401094 ~ 0x0040109A)



                    ( 참고로 ESI레지스터를 이용하여 가리키는 스택 번지는 0x0012FE1C에 10,20,30값을 왔다갔다 한다. )



스택에서 10을 ECX로 읽고



Name의 첫 값인 41("A")을 읽어서 xor하면



0x51이 된다.



Easy_Key.00401150 함수호출 뒤 가공된 값이 이렇게 저장이 된다. ASCII 값으로 보면



51이 된다. 따라서 시리얼값을 추출하는 대략적 시나리오는


1. Name에서 1Byte를 읽어들인다.


2. 특정메모리번지값 (10, 20, 30)을 읽어들인다.


3. 두 값을 xor한다.


4. 결과값의 16진수를 ASCII값으로 치환하는 Hex값을 저장한다.



확인을 위해 두번째 루프로 돌입 ( 42("B") xor 20 )



0x36, 0x32가 추가되었다. (little endian 헷갈리지 말자)



62가 맞다.



시리얼 입력 후 비교하는 코드



위 내용을 토대로 시리얼을 입력하니 맞았다. 



해서 5B134977135E7D13시리얼 값을 위 내용을 반대로 하면 Name값을 얻을 수 있다. 

728x90

'ctf + wargame > reversing.kr' 카테고리의 다른 글

Easy Crack  (0) 2015.01.04
728x90

[lyrics]


Today I don't feel like doing anything

(오늘 난 뭔가 할 맘이 들지 않아.)


I just wanna lay in my bed

(걍 침대에 누워있을래.)


Don't feel like picking up my phone

(폰을 들 맘도 없어)


So leave a message at the tone

(메시지를 남겨)


'Cause today I swear I'm not doing anything

("맹세코 난 오늘 아무것도 안할거니까")


Uh I'm gonna kick my feet up and stare at the fan

(난 박차고 일어나서 선풍기를 빤히 볼거야)


Turn the t.v. on

(tv를 켜고)


Throw my hand in my pants

(한 손을 바지안에 넣고)


Nobody's gon' tell me I cant, no

(누구도 나한테 뭐라하지 않을 거야)


I'll be loungin' on the couch just chillin' in my snuggie

(난 의자에서 게을러질래, 스너기(담요)에서 쉴래)

(lounging : 게으른, chilling : 으스스한 ( 그러나 I'm just chilling = I'm doing nothing 라고도 쓰임)


Flip to MTV so they can teach me how to Dougie

(MTV채널을 누르면 그들이 내게 Dougie춤을 알려줄 수 있어)


'Cause in my castle I'm the freakin' man

(내 성에서 나는 짱짱이니까)

(freaking = fucking)


Oh

Yes I said it
I said it
I said it 'cause I can


Today I don't feel like doing anything
I just wanna lay in my bed
Don't feel like picking up my phone
So leave a message at the tone
'Cause today I swear I'm not doing anything


Nothing at all

(아무것도)


Ooh hoo ooh hoo
Hoo ooh ooh
Nothing at all
Ooh hoo ooh hoo
Hoo ooh ooh


Tomorrow I'll wake up do some p90x

(내일 일어나서 p90x(운동기구)좀 하고)


Meet a really nice girl have some really nice sex

(멋진 여자와 만나 nice sex를 할거야)


And she's gonna scream out 'this is great'

(그녀는 소리지르겠지 "쩌는데?")


I might mess around and get my college degree

(난 주위를 어지르며 학사 학위를 딸 수도 있지)

(mess : 엉망진창, 어지르다)


I bet my old man will be so proud of me

(그러면 우리 아빠는 날 자랑스러워 하실거라는데 내가 전재산을 건다.)


But sorry pops you'll just have to wait

(근데 미안해요 아빠 기다리셔야 될 것 같아요)


Oh

Yes I said it
I said it
I said it 'cause I can

Today I don't feel like doing anything
I just wanna lay in my bed
Don't feel like picking up my phone
So leave a message at the tone
'Cause today I swear I'm not doing anything


No I ain't gonna comb my hair

(난 머리도 안 빗을 꺼야)

(comb : 빗질)


'Cause I ain't goin' anywhere

(어디도 안가니까)


No no no no no no no no no oh
I'll just strut in my birthday suit

(태어날때 모습으로 뽐내며 걸을거야)

(strut : 뽐내며 걷다)


And let everything hang loose

(모든 것을 헐렁하게 걸거야)


Yeah yeah yeah yeah yeah yeah yeah yeah yeah yeah


Oh, today I don't feel like doing anything
I just wanna lay in my bed
Don't feel like picking up my phone
So leave a message at the tone
'Cause today I swear I'm not doing anything


Nothing at all
Ooh hoo ooh hoo
Hoo ooh ooh
Nothing at all
Ooh hoo ooh hoo
Hoo ooh ooh
Nothing at all


728x90
728x90


package main


import (

    "fmt"

    "math"

)


func enough(term float64) bool {

    if term < 0 { // absolute value

    term = -term   

    }

    

    if term < 0.000000000001 {

    return true // enough   

    } else {

    return false // not enough

    }

}


func Sqrt(x float64) (float64, int) {

    cnt := 0

    z := float64(1)

    

    for {

        if enough(z*z-x) {

            return z, cnt

        }

        cnt++

        z = z-(z*z-x)/(2*z)

    }

    

}


func main() {

    var x float64 = 2.0

    fmt.Println(Sqrt(x))

    fmt.Println("math.sqrt result is ", math.Sqrt(x))

}


결과



--------------------------------------------------------------------------------------------------------------------

참고 http://tech.tigiminsight.com/2015/07/23/algorithm-newton-method.html

728x90
728x90


fgets이 표준 입력으로부터 45byte를 읽어드리기 때문에 bufferoverflow가 일어난다.


check의 값을 0xdeadbeef와 맞추어야 한다.



gdb로 까 보면 buf는 ebp-56에 있고 check는 ebp-16에 있다.


다행히 둘의 차이가 45이하이다.



역시나 입력대기를 위해 cat을 붙여주어야 한다.

728x90

'ctf + wargame > 해커스쿨ftz' 카테고리의 다른 글

[ftz] level13  (0) 2015.09.20
[ftz] level12  (0) 2015.09.20
[ftz] level11  (0) 2015.09.20
[ftz] level10  (0) 2015.09.18
[ftz] level9  (0) 2015.09.18
728x90


조금, 아주 조금 더 디테일한 바이트 조작이 필요 하다. 일단 i의 값을 변조 시키면 안된다.



바로 gdb로 열어서 확인 해 보면 long i 는 ebp-12에 있고


buf는 ebp-1048에 있다. 그렇다면 현재 스택은


-----------  [  buf(1024)  ][  dummy(12)  ][  long i(4)  ][  dummy(8)  ][  ebp  ][  ret  ]   ----------


이렇게 있다.



위 내용을 참고로 i의 위치 전까지 아무 문자열로 채우고 i의 값을 그대로 넣어주고


ret 전까지 12바이트를 또 아무 문자열로 채우고 쉘코드의 위치를 넣으면 끝.

728x90

'ctf + wargame > 해커스쿨ftz' 카테고리의 다른 글

[ftz] level14  (0) 2015.09.20
[ftz] level12  (0) 2015.09.20
[ftz] level11  (0) 2015.09.20
[ftz] level10  (0) 2015.09.18
[ftz] level9  (0) 2015.09.18
728x90



소스를 보니 level11문제와 동일하다. 다만 11번은 프로그램인자로 str의 값을 입력받았다면


이번에는 stdin(표준 입력)으로 부터 값을 받고 출력을 해 준다.



똑같이 환경변수를 이용해서 쉘 코드를 등록한 뒤 공격코드를 넣었다.


##

cat을 붙이는 이유:

완전히 이해하지는 않았지만 cat을 붙이지 않을 경우 gets가 쉘 코드를 읽고 쉘 코드가 실행되어 쉘이 실행 될때

사용자의 입력을 대기해야하는데 바로 종료시키게 되어 원하는 명령을 할 수 없게 된다. 그래서 cat을 붙이게 되는데

괄호로 묶어주지 않을 경우 "python ....."실행 후 "cat | ./attackme"으로 실행되기때문에 괄호로 묶어서

위와 같이 쓰게 된다.

-- 참조 : http://cosyp.tistory.com/208

728x90

'ctf + wargame > 해커스쿨ftz' 카테고리의 다른 글

[ftz] level14  (0) 2015.09.20
[ftz] level13  (0) 2015.09.20
[ftz] level11  (0) 2015.09.20
[ftz] level10  (0) 2015.09.18
[ftz] level9  (0) 2015.09.18
728x90


이 문제에는 2가지 취약점이 있다. 하나는 strcpy에 의한 buffer overflow취약점과


printf문에 의한 format string취약점이 있다. 어차피 level20에 fms문제가 나오므로 buffer overflow로 풀었다.

(사실 fms로 하다가 잘 안풀려서 일단 keep.)



쉘 코드를 메모리에 올리는 방법중 "환경 변수"를 이용하는 방법이 있다.


환경변수는 프로그램 실행 시 메모리에 함께 올라가기 때문이다.


이를 이용하면 쉘 코드를 메모리에 올리고 환경변수의 메모리 주소값을 이용하여 쉘 코드를 실행 시킬 수 있다.


##

위 사진에 있는 쉘 코드는 http://kaspyx.kr/4 이 블로그를 참조, 아니 copy하였다.

제작법까지 상세하게 나와있다.


쉘 코드 :

\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80



컴파일이 가능한 환경이면 이런 코드를 이용해서 환경변수가 메모리에 위치하게 되는 주소를 알 수 있다.



여러번 실행을 시켜 보았는데 지속적으로 고정된 주소값이 나왔다.



gdb로 까 보면 알 수 있듯이 ret의 스택상 위치는


[  buf(256)  ][  dummy(8)  ][  ebp(sfp)  ][  ret(여기)  ]


에 있으므로 공격코드는


./attackme `python -c 'print "A"*268+"환경변수주소(little endian)"'`


이 된다.


위 사진에서 보이듯이 setuid가 attackme에 걸려있어 level12의 쉘을 얻었다.

728x90

'ctf + wargame > 해커스쿨ftz' 카테고리의 다른 글

[ftz] level13  (0) 2015.09.20
[ftz] level12  (0) 2015.09.20
[ftz] level10  (0) 2015.09.18
[ftz] level9  (0) 2015.09.18
[ftz] level8  (0) 2015.09.18

+ Recent posts