KO : 이 프로그램은 몇 밀리세컨드 후에 종료 되는가 
EN : How many milliseconds does it take for this program to terminate 

 

프로그램을 실행시켜보면 몇 초 후에 멈추게 됩니다.

그 초를 정확히 재는 것도 한 방법이 될 거 같네요. (가능한가;;)

이 프로그램은 다른 툴로 열어 보면 위 그림처럼 오토잇이라는 것이 나타나게 됩니다.

오토잇은 스크립트 언어인데요. 저걸로 여러가지를 만들 수 있더군요. (윈도우 자동 설치 등)

 

선택 옵션 중에 UPX를 선택하면 자동으로 압축해주는 기능도 갖고 있습니다.

이번 문제가 그런 유형입니다.

 

그리고 이 프로그램은 디버깅을 하다보면 프로그램이 바로 종료되게 되는데요.

그 이유는 안티디버깅이 걸려 있기 때문에 그렇습니다. (간단한 거라서 여기서는 패스요)

 

한줄씩 디버깅 하다 보면 위 함수가 실행됐을 때 프로그램이 실행 되는 것을 알 수 있습니다.

이 프로그램은 오토잇으로 감싸져 있고 그 안에 우리가 원하는 프로그램이 있기 때문에

저 안으로 들어가서 더 분석을 해야 합니다.

 

한단계 한단계씩 가다 보면 또 위와 같은 함수가 나오고 그 안에 들어가면 안티디버깅이 들어있는 것을 볼 수 있습니다.

간단한 안티디버깅이기 때문에 쉽게 우회하실 수 있을 겁니다.

 

안티디버깅 우회 하시고 쭉 진행하시다 보면 위 함수가 나옵니다.

위에 주석을 보면 윈도우 리소스 등록, 트레이 아이콘 생성등 프로그램을 실행하기 위해서 하나하나 과정을 밟고 있는 것을 볼 수 있네요.

그리고 여길 분석해야 함 이라는 소스가 실제 우리가 분석해야 하는 프로그램이 됩니다.

 

위 함수에 들어가 보면

위와 같은 소스가 보이는 데요. 눈에 익죠? 이제 프로그램은 우리의 입력을 받기 위해 대기를 합니다.

그리고 몇 개의 초기화 과정을 더 거치는 데요. 마지막 쯤에 가보시면

위 함수가 있습니다.

다들 알다시피 WaitForSingleObject 함수는 어떤 스레드의 종료를 가리키는 함수 잖아요?

그래서 저는 다른 스레드를 만들고 그 스레드의 종료를 기다리고 있구나 라고 생각을 했습니다.

잘 찾아 보면 실제로 CreateThread를 호출 하는 것을 볼 수 있습니다.

 

자 위를 보죠. 우리가 봐야 할 것은 3번째 인자인 ThreadFunction인자 인데요.

그 인자에는 함수 주소가 들어가게 됩니다.

그래서 저 함수를 분석을 했습니다. 결과는… 뭐가 없더군요;; (사실 제대로 분석 못했습니다.)

저것은 고의로 만들어 두신건지…… 굉장히 어려운 함수가 안에서 실행됩니다.

나중에 저 문제를 푸시는 분은 저기서 헤메지 마세요. 답은 훨씬 가까운 곳에 있습니다.

 

이 문제는 이정도 까지만 해도 될거 같네요.

처음 보는 유형이라 굉장히 헤맸습니다. (오토잇 해제 하려고 하루죙일… 저 스레드 분석하는데.. 몇일 ㅠㅠ)

저를 굉장히 헷갈리게 하는 소스가 많더라구요.. 에휴ㅋㅋ;;

다들 열심히 푸세요!!

 

Bloger: moltak.net

'Security > Reversing' 카테고리의 다른 글

CodeEngn Adv01  (0) 2010.04.27
CodeEngn 20  (0) 2010.04.27
Reverse Engineering  (0) 2010.04.22
CodeEngn 18  (0) 2010.04.14
CodeEngn 17  (0) 2010.04.14

사실 저도 심볼 심볼만 하고 있었지 이 녀석이 무엇인지 어떤 역할을 하는지 잘 몰랐습니다.

저는 친절한 임베디드 시스템 블로그(http://recipes.egloos.com)를 참고 했습니다.

(개인적으로 굉장히 좋은 사이트라 생각합니다... 못 믿으시겠다면 어서 방문을 ㄱㄱㄱ)

 

http://recipes.egloos.com/5009181 여기를 보면 심볼에 대한 정보가 굉장히 잘 나와있습니다.

심볼이란 Linker가 쓰는 기본 단위로써, Link를 한 후 에는 자신만의 주소를 갖게 되는 특별한 단위를 말한다. 

(이 부분이 젤 중요합니다.)

위에 진하게 되어 있는 곳을 보죠. 그 중 빨간색이 가장 중요한데요. "자신만의 주소를 갖게 된다" 이 부분 입니다.. 

우리가 C로 프로그램을 짜고 디버깅을 할 때 생각해 보죠. 우리는 그 변수에 할당된 값들을 볼 수 있습니다.

 이 때 이것들의 주소가 없다면? 당연히 볼 수 없겠죠?? 하지만… 우리는 모든 변수들의 값들을 볼 수 있습니다. 

왜냐? 주소를 갖고 있기 때문입니다. 지역변수 들은 비록 EBP, ESP로 할당된 스택 프레임 안에 들어 있지만. 

일단은 주소를 갖고 있죠? 근데 이것들은 심볼이라는 것이 없습니다. 위에서 보면 "자신만의 주소"를 갖게 되는 특별한 단위라고 했는데 왜 심볼이 없냐 하면… 이 지역변수 주소는 "자신만의 주소"는 아니죠? 스택 프레임은 각 함수마다 할당되었다 사라졌다 합니다. 그 주소는 여러 변수에 의해서 계속 쓰이게 됩니다. 그래서 지역 변수는 "심볼이 없다"라고 볼 수 있겠네요.


이 분은 Symbol을 Global이라고 부르십니다(왠지 교주 찬양하는 것 같네요 -_ -;;). Global 은 프로그램이 시작하고 끝날 때까지 없어지지 않는 것들을 말하죠? 거기에 해당되는 것들이 뭐뭐 있을 까요? 함수, 전역변수, static 변수가 있죠? 위에서 말한 것 처럼 자신만의 주소를 갖게 되는 것도 이런 Global 밖에 없습니다. 나머지는 전부 stack, heap이죠…. 할당 되고 해제 되는…


자자 계속 할게요. Symbol의 이름은 그 Symbol이 갖는 메모리 영역의 시작 주소를 가리키는 Linker만의 pointer라고 하네요. 우리가 디버깅 할 때 VS에서는 자동으로 pdb 파일이 생성되죠?


(모른신다고 하면 안됩니다. 여기 증거가ㅋㅋ)


이때도 symbol의 이름이 사용된다고 합니다. 또한 우리가 C, CPP 파일을 컴파일 하면 object file(이 녀석은 소스 파일마다 생성됩니다.)


이 생성되는데 이 안에는 Linker를 위해서 symbol table을 놔둔다고 합니다. 여기 안에는 source code에 의해서 참조되는 symbol들의 이름과 위치 정보가 들어 있으며, 다른 파일에 정의되어 있는 symbol정보를 쓸 경우에는 그 정보가 해당 file에 없기 때문에 그 object 파일 안에 있는 symbol table은 완전하지 못하다고 하네요. 이런 불완전한 symbol들은 linker에 의해서 처리하여 다른 파일에 있는 symbol을 연결하여 사용할 수 있도록 만든다고 합니다. 이 symbol 정보들은 메모리에 올라오는 것이 아니며…. 오직 linker만이 이 정보들을 쓴다고 하네요. 그리고 binary(윈도우는 PE, 리눅스는 elf)로 만들어 질 때 이 symbol들을 주소로 모두 변환한다고 합니다. (네 그래서 native code안에는 symbol 정보가 없습니다.)

 

여기까지가 제가 공부한 내용이네요. 요약해서 뭔 말인가 하면. 이 symbol정보들은 global 한 정보들을 말하며 실제 실행 파일 안에는 들어가 있지 않다. 왜냐면 linker만 사용하기 때문에 그리고 실행파일로 만들 때 object file 안의 symbol 들을 모두 주소로 변환하니깐. 이제 좀 이해가 되기 시작하네요…(감사합니다 히언님ㅋ)

 

Bloger: moltak.net

'Programming > 이것저것' 카테고리의 다른 글

x86 Register  (0) 2010.04.30
어셈블리어 점프 명령어  (0) 2010.04.29
IL Code에 심볼 정보가 포함되는 이유  (0) 2010.04.24
초기화 하지 않은 메모리  (0) 2010.04.16
[Design Pattern] Singleton Pattern  (2) 2010.04.16

이제 심볼이란 것이 무엇인지 정확이 알았으니…

IL Code에 왜 심볼 정보가 포함되는지 알아 봐야죠??

저번 시간에 Native Code에 왜 심볼정보가 포함되지 않는지를 봤었죠??

(못봤으면 참고: http://moltak.net/entry/Symbol이란)

간단히 설명하자면 심볼은 linker가 쓰는 것으로 binary가 생성되면서 심볼정보는 다 지운다고 했었습니다.

(정확히 말하면 모두 주소로 변환)

그래서 C언어를 어셈으로 보면 알아 먹기가 힘들었죠.

하지만 IL Code는 안에 심볼정보가 포함되어 있기 때문에 원래 짠 코드 그대로 볼 수 있습니다.

 

(참고: 쩔철이네 블로그)

 

처음 심볼이 뭔지 제대로 알지도 못할 때 진 MVP인 철에게 물었습니다.

어째서 IL코드에는 심볼정보가 포함되는 거야? 하구요. 철은 범용적인 것 보다는 .NET에 특화된 말을 했습니다.

(철이 말: 즉.. .Net에서는 이런 "언어간 상호 운영성"을 위해서 CLS가 존재하고, CLR은 이에 기인하여 생성된 IL코드를 기반으로 명령을 수행한다는 것이지요..

   

여기서 서로 다른 언어에서 동일한 Type이나 기능이지만 언어간에 서로 다른 형태의 Keyword를 사용할 수 있기 때문에..

IL코드의 생성이 필요하게 되었고, 이렇게 서로 다른 Keyword를 사용하는 언어간 동일한 동작을 보장하기 위해 어떤 동일한 명령으로 변환시키기 위해서 "IL코드에 심볼들이 포함 될 수 밖에 없었다."라는 것이 제가 내린 결론입니다.)

 

네…. 맞는 말인 것 같지만… 너무 복잡하네요. 쉽게 풀어서 설명해보죠.

 

다음 내용들은 ezbeat(http://ezbeat.tistory.com/182)블로그를 참고했습니다.

(모르는게 나오면 지인들의 힘을 빌리는 것이 참…. 편하고 좋더군요 ㅋㅋ)

 

자자 이제 정리해보죠. 사실 참 쉬운 것들이었습니다.

제가 자주 사용하는 C, C++은 Native Code를 생성해 내게 됩니다. 이게 뭐냐 하면 하드웨어에 종속되어 있는 코드입니다. 바로 어셈블리어죠.

위에 있는 그림처럼 처음 보는 사람은 절대 그 내용을 알 수 없는 내용들이 가득 차게 됩니다.

 

하지만 .NET, Java 같은 경우는 좀 다릅니다.

이것들이 만드는 코드는 하드웨어에 종속되어 있는 코드가 아닌 플랫폼에 종속된 코드를 만들게 됩니다. 바로 IL 코드입니다. 여기서 플랫폼이란 .NET Framework나 JVM이 되겠네요.

그리고 이 플랫폼들을 거쳐서 Native Code가 튀어나오게 되는 것입니다. 그리고 이 언어들은 한줄 한줄씩 컴파일되면서 실행되는 JIT(Just In Time) 컴파일을 하게 됩니다.

실행이 되는 순간에 동적으로 컴파일이 되어야 한다는 것입니다.

근데 컴파일을 하려면 결국 무엇이 필요하냐 면… 네 맞습니다. 바로 Symbol이 필요하죠. 그래서 IL 코드에는 Symbol 정보가 필요합니다.

자 이제 IL 코드에는 왜 심볼정보가 필요한지 아시겠죠??

 

간단히 말하자면… 실행이 되어야 하니까 필요합니다. 하하하하 쉽네요. ㅋㅋ

 

 

Bloger: moltak.net

'Programming > 이것저것' 카테고리의 다른 글

어셈블리어 점프 명령어  (0) 2010.04.29
Symbol  (0) 2010.04.24
초기화 하지 않은 메모리  (0) 2010.04.16
[Design Pattern] Singleton Pattern  (2) 2010.04.16
typeid 연산자  (1) 2010.04.15
Reverse Engineering 이란?

소프트웨에어 공학에서 리버싱이란 무엇일까? 일단 사전적 의미를 찾아봤다.

요약
소프트웨어 공학의 한 분야로, 이미 만들어진 시스템을 역으로 추적하여 처음의 문서나 설계기법 등의 자료를 얻어 내는 일을 말한다. 이것은 시스템을 이해하여 적절히 변경하는 소프트웨어 유지보수 과정의 일부이다.
[
http://100.naver.com/100.nhn?docid=719182]

위 내용은 네이버에서 Reverse Engineering으로 검색했을 때 나오는 사전 자료이다. 위 사전 자료에서는 소프트웨어 공학의 한 분야로만 일축하고 있는 것을 볼 수 있는데 그것보다는 좀더 포괄적인 개념이 있다. 리버스 엔지니어링은 사람이 만들어낸 어떤 것으로 부터 정보를 빼내거나 그것이 어떻게 설계됐는지 알아내는 과정이다. 소프트웨어 공학에서만 나오는 것이 아니라 건축공학, 자동차 공학등 모든 분야의 공학에서 나오는 것이 리버스 엔지니어링이다. 엘다드 에일람(WILEY: Reversing)님의 말을 빌리자면 "리버스 엔지니어링은 과학자들이 원자나 인간의 마음에 대한 설계도를 알아내고자 하는 것과 매우 흡사하다." 과학과 다른 점은 과학은 자연에서 얻고 리버스 엔지니어링은 인간이 만든 어떤 것에서 얻는 다는 것이다. 리버싱을 통해 어떤 제품의 설계도를 가져 오거나 제품의 부품을 가져 올 수도 있다.

소프트웨어 공학에서의 리버스 엔지니어링이란 소스코드로 부터 프로그램의 모든 것들을 알아오는 것을 말한다. 소프트웨어의 생명 주기는 보통 요구사항 분석->설계->소스코드 작성->어셈블리어->기계어 순서로 이루어진다. 하지만 리버스 엔지니어링은 기계어를 어셈블리어로 변환하여 소스코드는 물론 설계, 요구사항 까지 얻어 오는 것을 말한다. 그리고 대한민국의 법에서 리버스 엔지니어링은 "합법"이다.

제12조의2(프로그램코드역분석)

 ①정당한 권원에 의하여 프로그램을 사용하는 자 또는 그의 허락을 받은 자가 호환에 필요한 정보를 쉽게 얻을 수 없고 그 획득이 불가피한 경우 당해 프로그램의 호환에 필요한 부분에 한하여 프로그램저작권자의 허락을 받지 아니하고 프로그램코드역분석을 할 수 있다.

②제1항의 규정에 의한 프로그램코드역분석을 통하여 얻은 정보는 다음 각호의 1에 해당하는 경우에는 이를 사용할 수 없다.

1. 호환 목적외의 다른 목적을 위하여 이용하거나 제3자에게 제공하는 경우

2. 프로그램코드역분석의 대상이 되는 프로그램과 표현이 실질적으로 유사한 프로그램을 개발·제작·판매하거나 기타의 프로그램저작권을 침해하는 행위에 이용하는 경우


위의 글에서 볼 수 있듯이. 호환에 필요한 부분에 한하여 프로그램 역분석(리버스 엔지니어링)은 합법이다. 하지만 그 외의 목적에 관해서는 불법이라는 것을 볼 수 있다. DMCA(Digital Millenium Copyright Act) (DMCA는 저작권 보호 기술을 보호하기 위해서 1998년에 재정됐다)를 검색해 보면 리버스 엔지니어링의 법에 관한 여러가지 정보를 얻을 수 있다.


한가지 덧 붙이자면 소프트웨어 공학에서의 리버스 엔지니어링은 Reversing(리버싱)으로 불린다.

정리하자면 소프트웨어 공학에서 리버스 엔지니어링(이하 리버싱)은 프로그램의 어셈블리 언어 코드를 보고 프로그램을 분석하는 것이며 어느 정도는 합법적인 것이다.


Bloger: moltak.net

'Security > Reversing' 카테고리의 다른 글

CodeEngn 20  (0) 2010.04.27
CodeEngn 19  (0) 2010.04.27
CodeEngn 18  (0) 2010.04.14
CodeEngn 17  (0) 2010.04.14
CodeEngn 16  (0) 2010.04.13

네트워크를 체크하려면 알아야 되는 지식들이 몇가지 있다. 아래 있는 것들도 그중 하나.

PPS를 보자면 대역폭별로 사용할 수 있는 최대 패킷 수이다.

현재 멤버십에서는 10Mbps급을 사용하고 있다. IEEE에서는 각 회선별 PPS를 정의하고 있다.

10Mbps = 14,880 pps

100Mbps = 148,800 pps

1Gbps = 1,488,000 pps


 인터넷 회선의 트래픽 양 (BPS)
   현재 트래픽이 인터넷 회선 대역폭의 80%에서 70% 미만을 점유하는 것이 좋습니다. 70%에서
   80%를 넘게되면 패킷들이 전송대기 상황이 발생되고 이에 따른 대기 지연이 발생하여 응답시간
   에 나쁜 영향을 미치게됩니다. 80%이상을 넘게되면 응답시간은 지수함수로 증가하게되어 심각
   한 응답속도의 증가를 겪게 됩니다. 통상 송 수신별로 트래픽 양을 평가하게 되는 데 어느 한
   방향의 트래픽 양이 80%이상을 넘게되면 비록 반대 방향의 트래픽이 정상적이라 하더라도
   응답속도가 요청에 대한 응답이므로 영향을 받게됩니다.

 인터넷 회선의 패킷 수 (PPS)
   인터넷 회선의 대역폭별로 처리가능한 최대 패킷 수가 제한됩니다.
   패킷의 크기는 최소 64바이트 이므로 회선 대역을 이 최소 패킷 바이트로 나누면 최대 패킷 수를
   얻을 수 있습니다. 이 처리 패킷 수는 네트워크 장비의 처리 용량과 밀접한 관계가 있습니다.
   회선 대역폭이 최대 패킷수를 수용할 수 있다고 하더라도 연결된 네트워크 장비가 이 패킷들을
   처리하지 못하게 되면 네트워크가 마비되게 됩니다. 대표적인 경우가 웜 바이러스에 의한
   네트워크 마비 현상인데 이 경우가 바로 웜이 폭발적으로 작은 사이즈의 패킷을 무수히 많이
   보내 네트워크 장비의 처리용량을 초과하도록 하여 결국 네트워크 장비가 다운되게 되어
   네트워크를 통한 업무가 마비되거나 지연되게 됩니다.

 프로토콜 점유율
   일반적인 네트워크 환경 하에서 TCP의 점유율이 UDP에 비해 높습니다. 각 네트워크 환경별로
   차이는 있으나 일반적으로 UDP의 회선 점유율이 TCP보다 높거나 30%가 넘는 경우는 비정상적
   이라고 볼 수 있습니다. 단, 비디오 강의나 교육방송과 같은 스트리밍 서비스의 경우에는 UDP의
   회선 점유율이 높을 수 있습니다. 마찬가지 ICMP나 기타 프로토콜이 많이 점유를 하고 있다면
   웜에 의한 이상 트래픽임을 추정할 수 있습니다.

 프로토콜 포트 점유율
   일반적으로 TCP의 점유율이 70%이상이며, TCP 포트 중 80(http) 포트가 50% 이상을 대부분
   차지합니다. 단, P2P와 같은 파일공유 트래픽을 허용하는 네트워크 에서는 80(http)의 점유율이
   낮을 수 있습니다. 통상적으로 만약 TCP포트 중 80(http)포트가 아닌 다른 포트의 점유율이
   높다면 비정상인 트래픽 형태라고 볼 수 있습니다. 

 평균 패킷사이즈
   네트워크에 연결된 사용자가 인터넷의 웹사이트에 접속할 때, 인터넷 회선을 지나가는 패킷의
   평균사이즈를 대략 계산하면 {송신(64byte) + 수신(1518byte)} / 2 하면 대략 790byte가 됩니다.
   웜이나 바이러스와 같은 트래픽은 일반적으로 64byte의 패킷사이즈를 가지고 있으므로, 내부
   네트워크에 웜이나 바이러스 트래픽이 발생한다면, 평균 패킷사이즈는 매우 작아질 것입니다.
   일반적으로 정상적인 네트워크 환경에서의 평균 패킷사이즈는 700byte ~ 900byte이며,
   비정상적인 경우에는 600byte 미만으로 내려가는 경향이 있습니다.

'scrap' 카테고리의 다른 글

방화벽 정책(예)  (0) 2010.04.29
방화벽 정책  (0) 2010.04.29
XP 네트워크 명령어  (0) 2010.04.18
IDS  (0) 2010.03.27
IPS  (0) 2010.03.27

1. WDK - Windows Vista RTM 을 다운 받아 설치

   

2. http://www.hollistech.com/Resources/ddkbuild/ddkbuild.htm 에서 ddkbuild 를 받아 압축을 풀고 vs .net 이 참조 가능한 패스에 복사한다.( C:\Program Files\Microsoft Visual Studio .NET 2005\Vc7\bin

3. DDKBUILD 에게 사용할 DDK version 을 알려주기 위해 약간의 편집을 해야 한다. ( 설치한 DDK 경로 설정 )

   

4. 프로젝트 생성 -> 메이크 파일을 선택

    

5. 디버그 구성 구성 설정에서 그림과 같이 설정.

   

6. 참고로 드라이버는 일반 어플리케이션과는 달리 debug build/release build 라고 하지 않는다. 
Debug build checked build
Release build free build

    

7. Visual Studio .Net의 intellisense 기능활용하기.

lib\wxp, inc\ddk, inc\api 폴더추가.

'Programming > WinDriver' 카테고리의 다른 글

NDIS Extending The PassThru IM Driver  (0) 2010.05.06
NDIS Driver 01) 시작  (0) 2010.05.02
NDIS/TDI  (0) 2010.03.18
_LIST_ENTRY  (2) 2010.03.18
Lookaside list  (0) 2010.03.18

01. 라우팅 테이블 확인 명령어

route print

 

02. IP주소를 초기화 하고 다시 받아오는 명령어 및 옵션

ipconfig /release : 네트워크어댑터의 ip 주소 제거

ipconfig /renew : ip 주소 갱신

 

03. 클라이언트의 DNS 캐시정보를 비우는 명령어 및 옵션

ipconfig /flushdns

 

04. 명령어 입력시 나타나는 결과값을 "test.txt"로 저장

C:>ipconfig > test.txt (내용을 추가할 땐">>" )

 

05. PC 에서 상대방 맥 어드레스를 확인하는 명령어

nbtstat -a (상대방 IP 주소 )

 

06. Mac Table 확인

arp –a

 

07. DNS 확인

nslookup (상대방 IP 주소)


Bloger: moltak.net

'scrap' 카테고리의 다른 글

방화벽 정책  (0) 2010.04.29
BPS, PPS, 프로토콜 점유율, 프로토콜 포트 점유율, 평균 패킷 사이즈  (0) 2010.04.21
IDS  (0) 2010.03.27
IPS  (0) 2010.03.27
IPS  (0) 2010.03.27
힙이나 스택에서 초기화를 안하면 뭔 값이 들어갈까?? 
마소에서 마음데로 정해 줬겠지만..ㅋㅋ
그래서 검색해봤다.

0xcccccccc : 초기화 되지 않은 지역 변수
0xcdcdcdcd : 초기화되지 않은 힙에 할당된 메모리
0xdddddddd : 힙에서 free된 메모리
0xfeeefeee : 힙에서 free된 메모리
0xfdfdfdfd : 힙에 할당된 메모리의 초가 범위(할당된 메모리의 양 끝 )
이런 비밀이 있었다.


'Programming > 이것저것' 카테고리의 다른 글

Symbol  (0) 2010.04.24
IL Code에 심볼 정보가 포함되는 이유  (0) 2010.04.24
[Design Pattern] Singleton Pattern  (2) 2010.04.16
typeid 연산자  (1) 2010.04.15
enum 문자열  (0) 2010.04.09
디자인 패턴에 대해 잘 알지는 못하지만... 예전에 열심히 공부해보려 했던 때가 있습니다.
디자인 패턴을 공부하시다 보면 아시겠지만 우리가 봉착한 문제를 유연하고 멋있게 해결합니다.
그 중에 제가 가장 잘 사용하는 것이 이 Singleton Pattern 입니다.

싱글톤 패턴의 정의는 아래와 같습니다.
소프트웨어 엔지니어링 영역에서의 singleton은 객체지향 프로그래밍 시 클래스가 단 하나의 사건, 즉 단 하나의 인스턴스만을 갖도록 하는 패턴이다.  이 패턴은 주로 중요한 자원을 관리하고자 할 때, 다수의 인스턴스가 생성되지 않도록 제한하기 위해서 사용한다.  예를들어, 한번에 하나의 인스턴스만이 DB에 연결되도록 설정할때 사용할 수 있다.

여러개의 인스턴스가 생성되면 안되는 것들을 하나만 생성되게 막는 것입니다. 
일단 어떻게 사용하시는지 보시죠.

저는 어제 올렸던 KSocket을 계속 발전 시켜 나갈 것입니다.

일단 헤더파일을 보시죠.
아래와 같이 instance를 하나 선언하고 가장 중요한 것은 생성자, 파괴자를 private로 선언하는 것입니다.
아무데서나 마음대로 사용할 수 없도록.
생성자 파괴자는 이제 static 함수에 의해서만 호출 될 수 있겠죠??

그리고 아래와 같이 인스턴스를 초기화 시켜주고 인스턴스 생성자, 인스턴스 파괴자 함수를 만들어 줍니다.
간단하고 명쾌하네요. 

하지만 클래스를 만들 때마다 위 처럼 안에 함수를 생성해야 한다는 것이 너무 귀찮고 안좋아 보입니다.
그래서 아래 처럼 템플릿으로 만들었습니다.
위 블로그를 가시면 알겠지만 굉장히 간결하게 짜 놓은 것을 볼 수 있네요.
조금만 보시면 쉽게 아실 겁니다.


사용은 m_KClientSocket = KSingleton< KSocketClient >::getInstance(); 이렇게 하시면 됩니다.
하지만 위 코드는 문제점이 있죠. 생성자, 파괴자는 인스턴스 생성 함수에 의해서만 호출 한다는 것이 깨져 버렸습니다. 
이것은 다음에 해결하도록 하겠습니다.

그럼 모두들 즐프 하세요 ^^/

'Programming > 이것저것' 카테고리의 다른 글

IL Code에 심볼 정보가 포함되는 이유  (0) 2010.04.24
초기화 하지 않은 메모리  (0) 2010.04.16
typeid 연산자  (1) 2010.04.15
enum 문자열  (0) 2010.04.09
ASCII Table  (0) 2010.04.05
다른 분들도 이 연산자를 사용하는지 모르겠지만... 저는 오늘 첨 알았네용ㅠㅠ
프로그래밍을 하던 중 인스턴스에 따라서 분기를 결정해야 했습니다. 평소 하던 방법은 문자열을 넣거나 nType이라는 타입 정수를 넣어서 그것에 맞춰서 해줬죠..
하지만 오늘 검색해보니 C++에서 C#과 같은 타입 비교 연산자가 있더군요;;
놀랐습니다.ㅋㅋ
아~~~주 좋습니다. ㅋㅋ


그래서 비교 코드를 아래 처럼 바꿀 수 있었죠.

아래는 skyarro라는 아이디를 쓰시는 블로그에서 퍼왔습니다.
결과 화면입니다.



모두 즐프요~~ㅋㅋ

'Programming > 이것저것' 카테고리의 다른 글

초기화 하지 않은 메모리  (0) 2010.04.16
[Design Pattern] Singleton Pattern  (2) 2010.04.16
enum 문자열  (0) 2010.04.09
ASCII Table  (0) 2010.04.05
사용자 정의 exception (1)  (0) 2010.03.21
복잡한 design module과는 다르게 굉장히 심플합니다. ㅋㅋㅋ
다들 해보시길 ㅋㅋㅋ

결과:


소스:



Bloger: moltak.net

오늘 SOC설계 시간에 배운 FSM입니다. 교수님이 그려주신 그림에 따라 설계하고 코드를 작성했습니다.
VerilogHDL 실력이 날이 갈 수록 늘어나고 있습니다. ㅋㅋ
기분이 좋군요. ㅋㅋ


위 그림이 기본 그림입니다. 괄호 안의 숫자들은 제가 사용하는 Spartan3의 포트 번호인데요. 이 코드를 갖고 ISE에서 Synthsesize 하면 됩니다. ㅋㅋ


위 그림이 기본 알고리즘인데요. 굉장히 간단하게 생겼습니다.
Accelerate와 Brake를 보고 상태에 따라 속도를 올리거나 줄이게 됩니다.




이 코드에서 가장 중요한 것은 OneShot Signal 인데요. 만약 사용자가 버튼을 클릭하게 되면 그 시간은 몇초 정도 되겠죠. ns로 따지면 엄청난 시간입니다. 그것을 단 한클럭만 하게 바꾸는 것이 OneShot Signal 이구요.


위 그림이 OneShot Signal을 나타내는데요. Acc를 버튼으로 가정하면 됩니다. 지금 클럭에 비해 굉장히 길게 입력이 되고 있죠?? 하지만 AccOneShot은 딱 한 클럭 만큼만 나타나고 있는데요. 그걸 가능하게 하는 것이 Acc_1과 Acc_2입니다. 이것들이 버퍼로 작동하는데 Propagal Delay(스펠링맞나??;;;)에 따라 한클럭 뒤에 값이 나오게 되죠. 이 값들을 저장해서 나중에 AND 연산을 취하게 됩니다.(아래 소스가 있습니다.) 그러면 위와 같이 AccOneShot Signal이 딱 튀어 나오게 되죠. ㅋㅋ 어렵습니다;;




위 소스가 OneShot Signal을 만드는 소스입니다. 자 공부 합시다. 공부 공부ㅋㅋㅋ


Bloger: moltak.net

Korea 
Name이 CodeEngn일때 Serial은 무엇인가 

English 
Find the Serial when the Name is CodeEngn. 

으응?? Nothing found *는 뭐지;;

뭔지 모르겠지만 일단 ㄱㄱ

 

이런 저런 함수들이 사용되고 있는 것을 확인

그리고 실행

 

입력하고…. 코드 좀 봤더니;;; 바로 답이?? 왐마;;ㅋㅋㅋ

 

Bloger: moltak.net

'Security > Reversing' 카테고리의 다른 글

CodeEngn 19  (0) 2010.04.27
Reverse Engineering  (0) 2010.04.22
CodeEngn 17  (0) 2010.04.14
CodeEngn 16  (0) 2010.04.13
CodeEngn 15  (0) 2010.04.13

Korea 
Key 값이 BEDA-2F56-BC4F4368-8A71-870B 일때 Name은 무엇인가 
힌트 : Name은 한자리인데.. 알파벳일수도 있고 숫자일수도 있고.. 
정답인증은 Name의 MD5 해쉬값(대문자) 

English 
What is Name when the Key is BEDA-2F56-BC4F4368-8A71-870B 
Hint : The name is 1 letter and it could be either alphabetic or numeric. 
Verify your solution with the MD5 value of the Name. 

 

MD5로 인증을 하라 하니 우선 MD5에 대해 먼저 알아야 하겠다.

http://ko.wikipedia.org/wiki/Md5

MD5(Message-Digest algorithm 5) 128비트 암호화 해시 함수이다. RFC 1321 지정되어 있으며, 주로 프로그램이나 파일이 원본 그대로인지를 확인하는 무결성 검사 등에 사용된다. MD5 임의의 길이의 메시지(variable-length message) 입력받아, 128비트짜리 고정 길이의 출력값을 낸다.

 

해시 값을 생성할 때는 http://www.md5decrypter.com/ 여기서 하라.

 

위 글을 보면 알겠지만… 128비트(16바이트)를 프로그램에 입력해야 할 것 같다. 그리고 그걸 어떻게 하든 키값과 비교를 하겠지. 일단 임의의 16바이트를 넣어 보거나, 아니면 다른 프로그램을 써서 알파뱃을 하나씩 넣어 보면서 풀 수도 있겠지.. 어떻게 푸는가는 자유다. 여기서는 임의의 16바이트를 넣고 그것으로 분석한다.

이곳부터 분석해보면 될 것 같다.

 

 

빨간색 박스 두 개의 함수가 핵심적인 역할을 하고 있다. 저곳을 분석하면 될 것 같다.

 

일단 비교 함수라고 체크되 있는 곳을 실험해 보자.

함수 호출하기 전에 EAX, EDX의 레지스터를 똑같이 맞추고 실험했다. 결과는 비교함수는 단순히 비교만 한다는 것을 알아 낼 수 있었다.

그럼 이제 분석할 곳은 L17.0045B850으로 좁혀 지는군..

 

근데 저 함수를 분석하기가 너무 힘들더라;

그래서 생각을 달리 해보기로 했다. 왜 CodeEngn에서 답은 한글자라고 힌트를 줬을까?

거기에 초점을 맞춰서 생각을 했는데…. 코드를 조금 수정하고 하니 답이 바로 나오더라;

 

 

Bloger: moltak.net

'Security > Reversing' 카테고리의 다른 글

Reverse Engineering  (0) 2010.04.22
CodeEngn 18  (0) 2010.04.14
CodeEngn 16  (0) 2010.04.13
CodeEngn 15  (0) 2010.04.13
CodeEngn 14  (0) 2010.04.12

Korea 
Name이 CodeEngn일때 Serial을 구하시오

English 
Find the Serial when the Name is CodeEngn 

 

Dev-C++로 컴파일 된 것은 처음 보는데?? Console 프로그램인 것도 알 수 있다.

 

실행 했더니 위와 같은 결과가… 그럼 Wrong password! 부터 찾아 볼까?

 

문자열 검색을 했더니 Wrong password!가 보였고 저기에 bp를 걸고 이동했다.

그리고 조금 위로 이동했더니 내가 좋아하는 단어인 Good Job! 이 보였고

노란 색 부분과 같이 16.0043C3D8이란 함수가 자주 호출되는 것을 볼 수 있었다. 그 곳이 printf 함수와 같은 기능을 하는 것이라는 것을 짐작할 수 있었다.

 

16.00428A40은 scanf함수라는 것을 짐작할 수 있었다. 그럼 우리는 함수가 끝난 다음부터 분석을 해야겠지.

 

우리가 분석을 해야 할 곳은 위 6줄로 좁혀 진다.

저기서 SS:[EBP-3C]에 우리가 원하는 답이 적혀있다. 근데 이 답은 위의 6줄과 우리가 입력한 값들(NAME, PASS)에 따라 달라지기 때문에 위 6줄을 분석 해야 한다.

앞의 문제와 같이 brute force로 해볼 수 도 있으나 한번 분석해 보자.

MOV EAX, DWORD PTR SS:[EBP-3C] // 이 부분은 scanf에서 입력 받은 값을 EAX에 넣는 것 으로 보인다.

IMUL EDX, EAX, 0ACE80// EDX = EAX * 0ACE80(708224) (오버플로우 발생 확률 높음)

LEA EAX, DWORD PTR SS:[EBP-3C] // EAX = &( SS:[EBP-3C] ), EAX에 변수의 주소를 넣는다.

ADD DWORD PTR DS:[EAX], EDX // *EAX = *EAX + EDX

MOV EAX, DWORD PTR SS:[EBP-40] // EAX에 EBP-40의 주소가 가리키고 있는 값을 넣는다.

CMP EAX, DWORD PTR SS:[EBP-3C] // EAX와 아까 만들었던(*EAX = *EAX + EDX )의 값을 비교한다.

 

위에서 보면 참 간단하다. 우리가 할 일은 A = A + ( A * 708224 )를 구하는 것이다.

한번 해 보자. 일단 A는 123이라고 치면 EAX에 123이 들어가야 하는데 들어 가지 않는다!!

여러 번 실험 결과 저기는 비번에 따라 변하는 것이 아니라 아이디에 따른 다는 것을 알 수 있었다.

그럼 EAX의 값은 항상 고정된다.

그럼 비번은 어딨어!! 라고 했는데 바로 옆에 있었네 -_-;

답은 다 구했으니 입력만 하면 되겄구먼ㅋ

 

Bloger: moltak.net

'Security > Reversing' 카테고리의 다른 글

CodeEngn 18  (0) 2010.04.14
CodeEngn 17  (0) 2010.04.14
CodeEngn 15  (0) 2010.04.13
CodeEngn 14  (0) 2010.04.12
CodeEngn 13  (0) 2010.04.12

Korea 
Name이 CodeEngn일때 Serial을 구하시오 

English 
Find the Serial when the Name is CodeEngn 

답을 찾으란다. 일단 패킹 같은 건 되어 있지 않다는 것을 확인.

 

저기 근처라는 것을 알 수 있었다.

 

노란색으로 선택되어 있는 부분이 인증 분기이며 답들은 그 위의 함수들에서 어떤 값을 만들어서 비교 후 인증이 된다는 것을 알 수 있다.

 

아마 정석대로 풀어야 한다면 CMP바로 위의 함수를 분석을 해야 하겠지만 꼭 그럴 필요가 있나? 라고 생각 되었다.

이곳을 보니 이름에 따라 함수에서 EAX의 값을 바꿨고 우리의 목적은 00006160이기 때문에 저 출력에 맞춰서 입력을 바꿔 넣어주면 어떨까 라는 생각을 하게 되었다.

몇 번 했더니 감을 잡을 수 있었고 2분 만에 값을 유추해 낼 수 있었다.

 

Bloger: moltak.net

'Security > Reversing' 카테고리의 다른 글

CodeEngn 17  (0) 2010.04.14
CodeEngn 16  (0) 2010.04.13
CodeEngn 14  (0) 2010.04.12
CodeEngn 13  (0) 2010.04.12
CodeEngn 12  (0) 2010.04.12

Korea 
Name이 CodeEngn 일때 Serial을 구하시오 
(이 문제는 정답이 여러개 나올 수 있는 문제이며 5개의 숫자로 되어있는 정답을 찾아야함, bruteforce 필요) 
Ex) 11111 

English 
Find the Serial when the Name of CodeEngn 
(This problem has several answers, and the answer should be a 5 digit number. Brute forcing is required.) 
Ex) 11111 

 

Bruteforce 하란다;; ㅋㅋㅋ

아까도 노가도 했는디 ㅠㅠ

그래도 하라면 해야지 ㅠㅠ ㄱㄱㄱㅅ

 

UPX pack이네??ㅋㅋ 요건 뭐ㅋㅋ

이젠 쉽다ㅋㅋ

 

프로그램 디자인이 ㅋㅋㅋ 엄청 나다ㅋ 독수리 오형제?? 사자 머리?? 뭐야 저건ㅋㅋㅋ

자 MUP부터 하고 시작하자. ㅋㅋ 쉽게 되넹ㅋㅋ

 

코드를 보면 GetDlgItemTextA라는 함수가 두번 보인다.

대충 짐작이 가겠지만 입력한 아이디, 시리얼의 값을 받아 오는 곳이다

그리고 아래쪽의 비교코드를 잘 살펴보면 ESI에 어떤 값이 오는 것을 알 수 있는데 그것이 5자리의 10진 숫자가 올 때 까지 계속 보자.

어느 순간!! 값이 보인다. ㅋㅋ

 

Bloger: moltak.net

'Security > Reversing' 카테고리의 다른 글

CodeEngn 16  (0) 2010.04.13
CodeEngn 15  (0) 2010.04.13
CodeEngn 13  (0) 2010.04.12
CodeEngn 12  (0) 2010.04.12
CodeEngn 11  (0) 2010.04.12

Korea 
정답은 무엇인가 

English 
Find the answer 

 

문제 한번 엄청 심플하네;ㅋㅋㅋ

자 풀어보자!!ㅋㅋ

오호ㅋ 닷넷으로 짰네?? ㅋㅋ

처음보는 유형이네. 하지만 닷넷으로 짜면 더 쉽지!!

자 쉽게 풀어버리자!!

 

일단 이 닷넷을 이야기 하자면 자바와 같이 IL코드를 생성한다. IL(Intermediate Language)코드에는 심볼정보가 포함되어 있는데 C++, C같은 Native Language가 심볼정보를 포함하지 않는 것과 대조적이다. 그래서 NL은 디버깅하려면 심볼 파일이 따로 필요로 하게 되며 그것이 없을 경우 어셈 코드로 분석을 해야한다. 하지만 심볼정보가 포함되는 IL는 어셈을 몰라도 쉽게 분석을 할 수 있다.

자 그럼 시작해 보자.

우선 .NET프로그램을 분석하려면 .NET reflector란 프로그램이 필요하다.

다운은 알아서 받으시고 프로그램을 실행하면

아예 대놓고 소스코드가 다 보인다. ㅋㅋㅋ

참 편하다. ㅋㅋㅋ 쉽게 풀 수 있을 것 같다. 자 가자ㅋㅋㅋ

저 프로램을 다 분석하기는 힘들고 소스를 다 볼 수 있다면!! 그래!! 컴파일을 하면 된다.ㅋ

그럼 원하는 값이 톡 튀어나오겠찌??ㅋㅋ

 

VS2008을 이용해 컴파일하고 reflector에서 모든 소스를 긁었다.

그리고 plainText를 봤더니.. 왐마 답이ㅋ

자자 해보세요ㅋㅋㅋ

 

Bloger: moltak.net

'Security > Reversing' 카테고리의 다른 글

CodeEngn 15  (0) 2010.04.13
CodeEngn 14  (0) 2010.04.12
CodeEngn 12  (0) 2010.04.12
CodeEngn 11  (0) 2010.04.12
CodeEngn 10  (0) 2010.04.12

eKorea : 
Key를 구한 후 입력하게 되면 성공메시지를 볼 수 있다 
이때 성공메시지 대신 Key 값이 MessageBox에 출력 되도록 하려면 파일을 HexEdit로 오픈 한 다음 
0x???? ~ 0x???? 영역에 Key 값을 overwrite 하면 된다. 

문제 : Key값과 + 주소영역을 찾으시오 
Ex) 7777777???????? 


English : 
You will see a success message after finding the key. 
If you would want the Key itself to replace the success message in the MessageBox, 
open up a Hex Editor and overwrite the key value in the offset range 0x???? ~ 0x????. 

Q : find the key value and the offset range and write the solution in this format : key???????? 
(first ???? for the start and the next 4 ?s for the end). 

 

아~~ 이 문제 허져 헤맸당ㅠㅠ

문제가 좀;; 헷갈리게 되어 있어서 해결책은 진작 찾았는뎅 범위 찾는 것이 너무 헷갈려ㅋ

아무튼 시작!!ㅋ

 

자 또 MASM이다. ㅋㅋ 쉽게 풀어 버리자.

 

코드를 보면 바로 아래에 GetDlgItenInt와 CMP가 보이는데 딱 봤을 때 드는 생각은

"아하 숫자를 갖고 와서 비교를 해서 끝나나 보다" 였다.

그런데 가운데에 CMP아래쪽에 JNZ JMP등 알 수 없는 코드와 ASCII 값이 들어 있었다.

가운데 함수가 뭐 하는 함수인지는 몰라도 우리가 공략 해야 할 곳은 CMP EAX, 7A2896BF 이다.

이곳을 잘 해결 하면 금방 답이 뽕하고 나온다. 다음은 이제 그 답을 코드에 입력을 해야한다.

난 Fileinsigt라는 프로그램을 쓰는데 좋은 줄은 모르겠고 ezbeat이 쓰더라ㅋ

그래서 그냥 쓴다.

 

프로그램을 실행시키면 위와 같은 섹션들이 보인다. 우리가 프로그래밍 공부할 때 잘 보이는 것들이다.

텍스트영역에는 코드가, 데이터 영역에는 전역변수나 텍스트가 존재한다. 저곳을 가보자.



그럼 위와 같은 문자열이 보이고 우리는 직감상 아 저곳을 고치면 되는 구나! 라는 것을 알게 된다.

맞다 하지만 난 헤맸다. ㅠㅠ 프로그램 사용도 서툴렀고 다른 헷갈린것도 여럿 있었다;;;

다른 분들은 쉽게 해결 하길!!ㅋㅋ

 

Bloger: moltak.net

'Security > Reversing' 카테고리의 다른 글

CodeEngn 14  (0) 2010.04.12
CodeEngn 13  (0) 2010.04.12
CodeEngn 11  (0) 2010.04.12
CodeEngn 10  (0) 2010.04.12
CodeEngn 09  (0) 2010.04.12

Korea 
OEP를 찾으시오. Ex) 00401000 / Stolenbyte 를 찾으시오. Ex) FF35CA204000E84D000000 
정답인증은 OEP+ Stolenbyte 
Ex ) 00401000FF35CA204000E84D000000 

English 
Find the OEP. Ex) 00401000 / Find the Stolenbyte. Ex) FF35CA204000E84D000000 
The solution should be in this format : OEP + Serial 
Ex ) 00401000FF35CA204000E84D000000 

 

아까 봤던 문제다!!ㅋㅋ

뭐야ㅋ 재탕이야ㅋ

아까 너무 빡시게 해놔서ㅋㅋ 그냥 답 인증을 해버렸다 -_-;

Bloger: moltak.net

'Security > Reversing' 카테고리의 다른 글

CodeEngn 13  (0) 2010.04.12
CodeEngn 12  (0) 2010.04.12
CodeEngn 10  (0) 2010.04.12
CodeEngn 09  (0) 2010.04.12
CodeEngn 08  (0) 2010.04.12

Korea 
OEP를 구한 후 "등록성공"으로 가는 분기점의 OPCODE를 구하시오. 정답인증은 OEP + OPCODE 
EX) 00400000EB03 

English 
After finding the OEP, find the OPCODE of the branch instruction going to the "goodboy routine" 
The solution should be in this format : OEP + Serial 
EX) 00400000EB03 

 

문제를 보면 역시나 Packing이 되어 있다는 것을 알 수 있다.

하지만 이몸은 이미 UPX에 익숙해져 있는 몸!ㅋㅋㅋ

쉽게 해주마!!

 

그래서 일단 프로그램을 다운 받고 PEiD를 돌려봤다.

왐마…. 요건 뭐냐;;; ASPack이당ㅠㅠ 댄장… CodeEngn이 나를 여러 방면으로 키워 주는구나!!

 

그리고 실행을 해봤더니…. 뭐야;; 이름이랑 시리얼이 쳐지지도 않네!!ㅋㅋㅋ

어쩌냐ㅋㅋㅋ

 

올디로 열어보니 UPX와 똑같이 PUSHAD로 시작하고 있었다. 어쩐지 전부는 아니더라도 다른 Packer들도 PUSHAD로 시작하는 것이 몇 개 있을 거 같다.

그리고 똑같이 F8->Dump->HP 하고 보니 POPAD아래로 떨어졌다. 흠 여기까지는 같네??

 

그리고 소스를 보니 어쩐지 다 된거 같다.

근데 나중에 검색해 보니 저렇게 된게 맞고

http://blog.naver.com/kodoi486?Redirect=Log&logNo=70026289264참조

6) JNZ 로 시작하는 명령에서 실행이 멈춤

7) Step into (F7)을 2번 더 누름

8) Push로 시작되는 명령줄 밑 retn에 도달해 잇어야함

9) F7을 한번 더 누름

10) AS pack으로 암호화(?)된 문자열들 앞으로 이동함 (여기가 OEP)

11) Ctrl + A (Analyse Coed)를 누름

12) 코드가 제대로 보임

위와 같은 과정이 더 필요하다는 것을 알게 되었다.

 

위와 같은 코드가 ctrl+a를 누름으로써 알아 볼 수 있는 코드로 바뀌었다.

오호ㅋ 신기하다ㅋㅋ 곧 풀 수 있을 것 같다. ㅋㅋ

패킹을 한 후 텍스트를 보면 아래와 같은 문자열을 찾을 수 있다.

답이 곧 나올거 같다 bp를 걸고 진행해 보자

그럼 그림과 같은 곳에서 프로그램이 멈추게 된다.. 흠… 답은 저기 근처에 있다. ㅋ

Bloger: moltak.net

'Security > Reversing' 카테고리의 다른 글

CodeEngn 12  (0) 2010.04.12
CodeEngn 11  (0) 2010.04.12
CodeEngn 09  (0) 2010.04.12
CodeEngn 08  (0) 2010.04.12
CodeEngn 07  (0) 2010.04.12

Korea 
StolenByte를 구하시오 
Ex) 75156A0068352040 

English 
Find the StolenByte 
Ex) 75156A0068352040 

 

이 문제는 굉장히 헤맸다. ㅠㅠ

Stolen byte의 의미가 따로 있는지 모르고 있었다;;

그래서 파일의 크기를 맞춰 주려고 했는데… 그 파일의 크기가 Stolen Byte인 줄 알았다;;

자주 봐왔던 유형이다. UPX로 패킹 되어있는…

바로 OEP를 봤더니

어라 평소와는 다르게 이상한 곳에서 멈췄다.. 그리고 PUSH를 하는 것을 볼 수 있었다.

처음에는 저것을 전혀 신경 쓰지 않았다. 하지만 그게 내 큰 잘못이었다. ㅠㅠ

 

OEP를 찾아서 들어가보면 NOP이 굉장히 많다;; 뭐야?? 이상한데?? 그리고 아래 함수에는 GetFileSize가 존재하며 조금만 조작하면 나에게 "키 찾았어 라고 알려줬다" 파일 크기는 16byte였는데 난 그게 맞는 답인 줄 알고 왜 안되지;; 하다가 stolen 바이트를 검색하고는….. orz 상태로 빠져 있었다.

이 문제에서 가장 중요한 것은 stolen byte였다. 그게 무엇인지부터 보자.

 

http://blog.naver.com/jjysrh?Redirect=Log&logNo=60061439813

 

이곳을 참고 했으니 방문해 보시라.

정리하자면 패커가 보호된 프로그램의 코드의 윗 부분을 이동 시킵니다. 이 부분의 명령어는 이동된 곳이나 할당 받은 메모리 공간에서 실행되는데 만약 프로세서의 메모리를 덤프 했을 때 Stolen Byte를 복구 하지 못한다면 덤프된 실행파일은 작동하지 않는다. 글을 잘 읽고 생각해 보면 패커가 프로그램의 흐름을 어렵게 하기 위해서 작업을 하는 것 같다. 나중에 분석이 어렵게 하기 위해??

다행히 이 문제는 굉장히 단순해서 Stolen Byte를 쉽게 복구할 수 있다.

일단 Stolen Byte를 제대로 복구 못했을 경우를 보자.

위 그림과 같이 글씨가 다 깨지고 난리가 난다. 이 프로그램은 글씨만 깨지고 다른 것은 다 되지만 다른 프로그램의 경우도 그럴 것이라는 것을 장담할 수 없다.

자 그럼 Stolen Byte를 복구 해 보자.

우리가 복구해야 할 곳은 위에 노란색으로 채워진 14바이트 이다. Push 0부터 Push ~~까지 인데 저곳을 복사해서 OEP에 붙여 넣자.

 

위 처럼 붙여 넣으면 된다. 사실 아까 보면 엔트리 포인트가 0040100C 였는데 사실은 00401000이다. 그래서 저대로 저장을 하고 다시 DUMP를 뜨고 OEP를 복구하면 프로그램이 원래대로 뜨는 것을 볼 수 있다.

 

OEP를 1000으로 바꾸고 덤프를 뜨자.

그리고 ImportREC로 OEP를 바꿔서 넣으면

짜잔 아래 처럼 문자열이 깨지지 않고 뜨게 된다.

이 문제의 답은?? 진작 나왔제ㅋ

'Security > Reversing' 카테고리의 다른 글

CodeEngn 11  (0) 2010.04.12
CodeEngn 10  (0) 2010.04.12
CodeEngn 08  (0) 2010.04.12
CodeEngn 07  (0) 2010.04.12
CodeEngn 06  (0) 2010.04.12

Korea 
OEP를 구하시오 
Ex) 00400000 

English 
Find the OEP 
Ex) 00400000 

문제 참 심플하다;; ㅋㅋ 뭐로 패킹이 되어 있는지부터 확인 해 보자.

프로그램이 UPX로 패킹이 되어있는 것을 확인 할 수 있었다.

저번에 했으니 빠르게 답을 찾아보자.

우선 F8을 누르고 ESP dump 해서 하드웨어 브레이크 포인트를 찍고 조금 밑으로 이동했더니 OEP가 보였다. 쉽게 해결 할 수 있었다.

Bloger: moltak.net

'Security > Reversing' 카테고리의 다른 글

CodeEngn 10  (0) 2010.04.12
CodeEngn 09  (0) 2010.04.12
CodeEngn 07  (0) 2010.04.12
CodeEngn 06  (0) 2010.04.12
Code Engn L04 Start  (0) 2010.04.06

Korea 
컴퓨터 C 드라이브의 이름이 CodeEngn 일경우 시리얼이 생성될때 CodeEngn은 "어떤것"으로 변경되는가 

English 
Assuming the drive name of C is CodeEngn, what does CodeEngn transform into in the process of the serial construction

 

원래 그런지 모르겠지만.. 코드엔진은 유독 Packing 문제가 많더라;;

그래서 올디로 열기 전에 확인을 먼저 해야 한다.

예전에 PEiD라는 프로그램을 이용한 적이 있었고 블로깅도 조금 했었다.

일단 프로그램 실행

 

아하ㅋ MASM이다. 오랜만에 보니 반갑다. ㅋ

예전에 어셈으로 프로그래밍 할 때 사용했었는데. ㅋㅋ

암튼 문제를 보면 C드라이브랑 CodeEngn이 관련이 있는 거 같으니 이름을 바꾸고 올디로 열어보자.

 

소스를 천천히 찾다 보니 드라이브의 정보를 얻어오는 함수가 보였다.

아하 어떻게 하는지 감이 온다. 쉽게 해결 할 수 있었다.



Bloger: moltak.net

'Security > Reversing' 카테고리의 다른 글

CodeEngn 09  (0) 2010.04.12
CodeEngn 08  (0) 2010.04.12
CodeEngn 06  (0) 2010.04.12
Code Engn L04 Start  (0) 2010.04.06
Code Engn L03 Start  (0) 2010.04.05

Korea 
Unpack을 한 후 Serial을 찾으시오. 정답인증은 OEP + Serial 
Ex) 00400000PASSWORD 

 

Unpack이란다.. 이젠 대놓고ㅋ 압축 풀라네ㅋㅋ

그럼 풀어줘야징. 일단 다운로드 받고

흠 이걸 하면 되는구나??

자 일단 Unpack을 해보자.

저번에 말했다시피 Unpack(이하 언팩)은 OEP를 찾아내는 과정이라고 말했다.

문제 자체도 OEP를 찾으라는 거니 일단 빨리빨리 해야지.

 

처음 시작하면 위 화면과 같다. 언패과정은 이전 블로깅에서 자세히 했기 때문에 그냥 지나치도록 하겠다.

 

POPAD로 이동을 하면 JMP문이 저 아래 있고 가운데에 어떤 코드가 삽입되어 있다.

이게 뭔지 지금은 자세히는 알지 못하고 일단은 JMP에서 점프를 하도록 하겠다.

자 찾았다 OEP다 일단 문제 하나는 풀었군ㅋㅋ

그럼 Serial만 찾으면 되겠구나

 

GetWindowText에 breakpoint를 걸고 따라가다 보면 답들이 보인다…

언팩만 하면 쉽구먼??

자 아까 구한 OEP와 답을 합쳐서 인증하면 레벨 클리어!!

 

Bloger: moltak.net

'Security > Reversing' 카테고리의 다른 글

CodeEngn 08  (0) 2010.04.12
CodeEngn 07  (0) 2010.04.12
Code Engn L04 Start  (0) 2010.04.06
Code Engn L03 Start  (0) 2010.04.05
Reverse L02 Start  (0) 2010.04.05

아래 챕터 처럼 다 했다면 다 성공했다.

이젠 Flash에 쓸 차례다. 혹시 전원을 뽑아 봤나? 뽑으면 알겠지만.. 걍 죽는다.ㅋ

프로그램 다 사라짐ㅋ 처음에 엄청 어이없었다. ㅋㅋ

하지만 Flash 메모리에 쓰지 않았으니 사라지는게 당연하겠지 라고 생각하고 있다.

암튼 시작~

 

Flash에 쓰려면 PROM File로 포멧을 변경해야 한다. 위 그림처럼 PROM File Formatter를 더블 클릭하자.

위 그림처럼 메뉴가 뜨는데 나도 잘 모르지만 위 처럼하면 그냥 된다.

위 그림 처럼 Next를 누르다가 파일 한번 선택해 주고 또 Next를 누른다. 중요한것은 마지막 화면인데 화면창이 Add Device라고 쓰여져 있는게 보이나?? 다른 장치가 있으면 추가한다던데 해본적이 있어야지ㅋ 그냥 NO를 선택하자.

 

이젠 단순히 그림을 보고 따라가면 된다. 블로깅은 여기서 마치겠다.ㅋㅋ

 

거의 고지에 다왔다.

이젠 우리가 만든 코드를 실제 FPGA보드에 올릴 차례다!

우리가 예상한데로 된다면 불이 반짝반짝 들어오는 Digital Clock이 완성되겠지!ㅋ

 

이젠 제일 아래를 선택하자. Configure Target Device라고 쓰여있다. 여기서 코드를 타겟 보드에 맞게 바꾸나 보다.

 

이거 뭔 말인지 잘 모르겠더라. 그냥 OK누르고 있으면 알아서 진행된다.

 

오 잘 됐다. 올 클리어다.ㅋ 쉽네??

잘 되었으면 창이 넘어가면서 칩 그림 두개가 뜬다. 오른쪽이 우리가 넣을 칩이고 왼쪽은 플래시메모리다.

우리는 일단 왼쪽에 넣어야 한다. 우클릭하고 Program을 누르자.

근데 에러가 뜨는 경우가 많다. 왜 그런지 잘 모르겠다. 아래 그림처럼 옆을 선택하고 Erase를 한 후에 다시 Program을 눌러보자.

 

에러 없이 잘 됐는가? 그럼 이제 불이 반딱 거릴 것이다.!!ㅋ

아 좋다.ㅋ

세번째 단계는 신스사이즈라고 불리는 단계이다.

컴파일과 거의 비슷한데 생성되는 코드가 타겟 보드 코드이며 실행되는 프로그램 형태가 아닌 게이트의 역할을 바꾸는 코드를 생성한다는 것이다. 사실 잘 모른다. 그냥 이렇게 이해하고 있다.

암튼 코드를 생성했으니 다음 단계는 Synthesize 단계이다. Coding->Synthesize라고 생각하면 된당.

 

Synthesize는 의외로 간단하다. Synthesize – XST를 더블 클릭하거나 그림처럼 우클릭해서 RUN을 선택하면 된다.

 

위 그림과 같이 녹색 체크바가 생성되었다면 성공!

다음 단계는 포트 연결인데 우리가 만든 코드는 외부와 데이터를 주고 받으려면 당연하겠지만 포트를 설정해줘야 한다.

Verilog Code에도 생성해 놨는데 anode와 seven_seg 변수가 그것이다. 아무튼 아래 그림과 같이 RUN을 선택한다.

 

 

그리고 아래 그림처럼 포트를 설정하는데 포트에 대한 정보는 해당 제품 매뉴얼을 봐야 한다.

 

Default 값으로 놔두고 그냥 OK선택하면 Synthesize와 Port설정은 끝이 난다.

프로젝트를 생성했으면 소스를 추가 해야지ㅋ

아래에 있는 VerilogHDL소스가 원본이기 때문에 알아서 컴파일 해보도록.

아무튼 에러없이 잘 작동하는 Verilog코드가 있다면 바로 FPGA에 구울 수 있다.

일단 소스를 추가 해줘야겠지? 작성된 소스를 Add 시킬 수도 있지만 난 New Source를 하겠다.

 

우리는 Verilog 코드를 쓸것이기 때문에 Verilog Module을 선택한다. 이름은 맘대로 하고~

 

포트 설정 페이지인데 아직 할 필요 없다 그냥 Next~

 

코드 파일이 생성되었다. 이제 이 파트의 마지막 단계다.

 

마지막 단계는 당연히 코드를 써넣는 거겠지? 아래 소스가 있으니 쉽게 할 수 있을 듯 하다.

'Programming > hdl' 카테고리의 다른 글

Digital Clock - FPGA(04 프로그램 올리기)  (0) 2010.04.10
Digital Clock – FPGA(03 Synthesize)  (0) 2010.04.10
Digital Clock – FPGA(01 프로젝트 생성)  (0) 2010.04.10
Digital_Clock TestBench  (0) 2010.04.10
D F/F Verilog  (0) 2010.04.07

오늘 짰던 Digital_Clock Verilog Code를 FPGA로 굽는 작업을 했다.

기억하기 좀 복잡해서 복습하면서 모든 사진을 다 찍었다. ㅋㅋ

일단 보자! (너무 길어서 파트별로 짤랐당ㅠㅠ)

 

나는 Xilinx ISE 10.1 버전을 사용했다.

이 것을 사용하면서 좀 어이없었던 것은 소스가 다 맞는데도 synthesize가 되지 않았다는 것이다.

(자꾸 알 수 없는 오류가 생겼다.)

그래서 프로젝트를 다시 생성했더니 잘 되더라…. 옆에 나를 가르쳐주던 형한테 물어보니…

원래 그런다더라ㅋㅋ 꼬물ㅋㅋ

암튼 위 그림처럼 먼저 프로젝트를 생성한다. 그리고 Next 클릭

 

위 그림은 프로젝트를 생성할 때 우리의 보드 정보를 입력해주는 곳이다. 나는 Sprtan3를 사용하고 XC3S200을 사용하기 때문에 위처럼 설정하고 Next를 클릭하자.

 

위 세 그림은 별로 설정할 것이 없다. 그냥 next, next 클릭하면 끝!

프로젝트 생성 완료!

'Programming > hdl' 카테고리의 다른 글

Digital Clock – FPGA(03 Synthesize)  (0) 2010.04.10
Digital Clock – FPGA(02 소스추가)  (0) 2010.04.10
Digital_Clock TestBench  (0) 2010.04.10
D F/F Verilog  (0) 2010.04.07
Computer Design - Digital Logic  (0) 2010.03.20

+ Recent posts