Media Log


이번에는 바빌론 키젠미(Babylon Keygenme) 프로그램을 리버싱 해보도록 하겠습니다.


상당히 쉬운 편이며, 프로그램은 C언어로 만들어졌다고 합니다. 패킹은 되어있지 않은 상태이구요.


우선은 아래 파일을 다운로드 받아 Babylon Keygenme.exe를 실행시켜 보도록 합시다.


babylon-keygenme.zip


실행 파일을 실행시키시면 아래와 같은 화면이 보여질 것입니다.



우선은 아무렇게나 입력을 한 뒤에 결과를 확인해볼까요?



번역기로 저 문장을 해석해보니 잘못된 패스워드라고 합니다. 우선은 올리디버거를 열어 이 파일을 열어보도록 합시다. (필자는 이뮤니티 디버거를 사용했습니다. 올리 디버거를 쓰셔도 무방합니다.) 디버거로 파일을 열었으면 어셈블리 코드가 보이는 창에 우클릭을 하여 팝업 메뉴에서 Search for -> All referenced text strings를 선택합니다. 



위에 보시면 프로그램에서 참조되는 모든 문자열을 뽑아낸 것을 볼 수 있는데, 'Mauvais mot de passe!'는 패스워드가 틀렸을 경우에 나오는 문장이고, 'Yeah, c'est bon.'은 패스워드가 일치했을 경우 나오는 문장임을 추측할 수 있습니다. 우선은 처음으로 돌아가, 사용자에게 이름과 시리얼을 입력받는 부분을 살펴보도록 합시다. "[x] Name : "를 더블 클릭하여 이 문자열이 어디서 등장하는지 먼저 보도록 합시다.


00401455   . 68 AD124000    PUSH Babylon_.004012AD                   ; format = "%s"

0040145A   . E8 19040000    CALL <JMP.&msvcrt.scanf>                 ; scanf


위에서 보이는 scanf는 C언어의 입력 함수로써 format을 보시면 %s라고 되어있는데, 이는 문자열을 입력받는 다는 뜻입니다. 즉, 이름을 입력받고 나서 아래처럼 입력받은 문자열의 길이를 검사하고 있음을 알 수 있습니다.


0040146B   . 50             PUSH EAX                                 ; s

0040146C   . E8 FF030000    CALL <JMP.&msvcrt.strlen>                ; strlen

00401471   . 83C4 10        ADD ESP,10

00401474   . 8945 E8        MOV DWORD PTR SS:[EBP-18],EAX

00401477   . 837D E8 03     CMP DWORD PTR SS:[EBP-18],3

0040147B   . 7E 08          JLE SHORT Babylon_.00401485

0040147D   . 837D E8 0E     CMP DWORD PTR SS:[EBP-18],0E

00401481   . 7F 02          JG SHORT Babylon_.00401485

00401483   . EB 2B          JMP SHORT Babylon_.004014B0

00401485   > 83C4 F4        ADD ESP,-0C

00401488   . 68 B0124000    PUSH Babylon_.004012B0                   ; format = "Attention ! 3 < Nom < 15"

0040148D   . E8 EE030000    CALL <JMP.&msvcrt.printf>                ; printf


위를 천천히 살펴보시면 EAX 레지스터의 값을 스택에 올리고, 그 후에 strlen 함수를 호출합니다. 이는 strlen 함수를 호출한 뒤에 반환값이 EAX 레지스터에 담기기 때문에 나중에 EAX 레지스터의 원본 값을 복구하기 위함입니다. 그리고 ESP 레지스터에 10을 더해준 다음에 [EBP-18]에 EAX 레지스터의 값을 저장한다는 것을 알 수 있습니다. 그리고 [EBP-18]과 3을 비교하고 [EBP-18]이 3과 같거나 이하일 경우 JLE에 의해 401488로 점프되며, [EBP-18]과 0E(15)를 비교하고 나서 [EBP-18]이 15보다 크면 JG에 의해 401488로 점프됩니다. 만약 401488로 점프되지 않고, '3 < 이름의 길이 < 15'라면 4014B0으로 점프됩니다. 



직접 확인해보니 정말로 이름의 길이가 3자 이하이거나 15자 이상일 경우 저러한 문장이 출력되고 프로그램이 종료되어 버립니다. 그럼 이제 시리얼을 입력하는 부분을 보도록 하겠습니다. 입력되는 부분을 쭉 보시다 보면 반복되는 구간을 보실 수가 있습니다. 시리얼을 입력하는 부분 바로 뒤에 브레이크 포인트를 걸고 계속 F8로 실행해보시면 어느 부분에서 계속 반복하게 되는데, 이 부분을 잠깐 살펴보도록 하겠습니다. 우선은 이름이 su6net, 시리얼이 kneeng로 가정하고 설명을 드리도록 하겠습니다.


004014E0   > 8B45 E8        MOV EAX,DWORD PTR SS:[EBP-18]

[EBP-18]의 값을 EAX 레지스터에 저장한다.

-> [EBP-18]에 담긴 값은 이름의 길이입니다. 곧 EAX 레지스터에 닮기는 값은 6입니다.

004014E3   . 89C2           MOV EDX,EAX

EAX 레지스터의 값을 EDX 레지스터에 저장한다.

004014E5   . 8D0412         LEA EAX,DWORD PTR DS:[EDX+EDX]

[EDX+EDX]의 주소를 EAX 레지스터에 저장한다.

-> 여기서 EDX의 값이 6이므로, EDX+EDX는 12이며 이 주소를 EAX에 저장한다는 것입니다.

004014E8   . 3945 FC        CMP DWORD PTR SS:[EBP-4],EAX

EAX 레지스터와 [EBP-4]의 값을 비교한다.

-> [EBP-4]에는 처음에 0으로 초기화 되었으며, 이 분기문에서 반복문이 진행되냐 종료되냐를 결정합니다.

004014EB   . 7C 03          JL SHORT Babylon_.004014F0

위의 비교에서 [EBP-4]가 EAX보다 작을 경우 4014F0으로 점프한다.

004014ED   . EB 31          JMP SHORT Babylon_.00401520

401520으로 점프한다. 반복을 모두 끝마치고 반복문을 빠져나가는 부분이다.

004014EF     90             NOP

아무런 기능을 하지 않는다.

004014F0   > 8D85 A0FDFFFF  LEA EAX,DWORD PTR SS:[EBP-260]

[EBP-260]의 주소값을 EAX 레지스터에 저장한다.

004014F6   . 8B55 FC        MOV EDX,DWORD PTR SS:[EBP-4]

[EBP-4]의 값을 EDX 레지스터에 저장한다.

-> 처음의 [EBP-4] 값은 0이므로 EDX 레지스터에 0이란 값이 저장된다.

004014F9   . 8D8D E0FEFFFF  LEA ECX,DWORD PTR SS:[EBP-120]

[EBP-120]의 주소값을 ECX 레지스터에 저장한다.

-> [EBP-120]은 입력받은 이름이 들어가있는 변수의 주소다. 즉 이름 변수의 주소를 ECX 레지스터에 저장한다.

004014FF   . 8B5D F8        MOV EBX,DWORD PTR SS:[EBP-8]

[EBP-8]의 값을 EBX 레지스터에 저장한다.

처음에 [EBP-8]의 값은 0이므로 EBX에는 0이 저장된다.

00401502   . 8A0C0B         MOV CL,BYTE PTR DS:[EBX+ECX]

[EBX+ECX]의 값을 CL 레지스터에 저장한다.

-> ECX에는 이름의 주소가, EBX는 반복할때마다 1씩 증가한다. 처음에는 EBX 값이 0이므로 결과적으로는 ECX 레지스터에 담긴 값이 가리키는 문자의 아스키 코드를 CL 레지스터에 저장한다. 이름이 su6net 이므로, 처음에는 's'의 아스키 코드가 CL 레지스터에 들어가는 셈이다. 's'의 아스키 코드가 115이므로 CL엔 115(16진수로는 73)가 들어갈 것이다.

00401505   . 880C02         MOV BYTE PTR DS:[EDX+EAX],CL

CL의 값을 [EDX+EAX]에 저장한다.

00401508   . 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]

[EBP-4]의 값을 EAX 레지스터에 저장한다.

-> 처음의 [EBP-4] 값은 0이므로 EAX 레지스터에 0이란 값이 저장된다.

0040150B   . 40             INC EAX

EAX 레지스터의 값을 1만큼 증가시킨다.

0040150C   . 8D95 A0FDFFFF  LEA EDX,DWORD PTR SS:[EBP-260]

[EBP-260]의 주소값을 EDX 레지스터에 저장한다.

00401512   . C60410 20      MOV BYTE PTR DS:[EAX+EDX],20

20이란 값을 [EAX+EDX]에 저장한다.

-> 0x20은 10진수로 32이며, 이는 공백의 아스키 코드이다.

00401516   . FF45 F8        INC DWORD PTR SS:[EBP-8]

[EBP-8]의 값을 1만큼 증가시킨다.

00401519   . 8345 FC 02     ADD DWORD PTR SS:[EBP-4],2

[EBP-4]의 값에 2를 더한다.

0040151D   .^EB C1          JMP SHORT Babylon_.004014E0

4014E0으로 점프한다.


위처럼 이름의 문자를 하나 달고 공백을 추가하고 이 과정을 반복하다 보면 [EBP-260]에 "s u 6 n e t "가 들어가게 됩니다. 그리고 쭉 내려가다보면 괴상한 특수문자들이 추가되며, 이 특수문자의 길이를 구하고 그 길이만큼 반복을 하는 반복문이 보이실 것입니다. 반복문을 살펴보자면,


00401531   . 50             PUSH EAX                                 ; s = "-[#]]=}&&&+(=$*,,)&.*/+++[][;/..?"

00401532   . E8 39030000    CALL <JMP.&msvcrt.strlen>                ; strlen


이렇게 괴상한 특수문자의 길이를 구하고 나서는 이 길이만큼 반복을 하게 되는데, 여기서 BL 레지스터에 괴상한 특수문자 하나가 넣어지고 INC 명령문에 의해 값이 증가되고, 길이를 비교하고 넣고 증가하고 이렇게 반복하다가 [EBP-160]의 특수문자 아스키코드에서 1씩 증가하여 ".\$^^>~''',)>%+--*'/+0,,,\^\<0//?"으로 바뀌게 됩니다. 그리고 그 아래에 또 반복문이 등장하는데, 이 반복문을 살펴보면 XOR 연산을 하는 부분이 있습니다.


00401581   . 50             PUSH EAX                                 ; s

00401582   . E8 E9020000    CALL <JMP.&msvcrt.strlen>                ; strlen

..

0040158C   . 3945 FC        CMP DWORD PTR SS:[EBP-4],EAX

..

004015C9   . 321C37         XOR BL,BYTE PTR DS:[EDI+ESI]

..

004015CF   . FF45 FC        INC DWORD PTR SS:[EBP-4]

004015D2   .^EB A4          JMP SHORT Babylon_.00401578


위 부분을 간략하게 보시면 공백이 들어간 이름 문자열의 길이만큼 반복을 하게 되는데, 이름의 문자와 괴상한 특수문자의 값이 각각 대응하여 XOR 연산을 합니다. 115(s) XOR 46(.), 32(공백) XOR \(92).. 이런식으로 계속 XOR 연산을 하다가 끝나게 되면 또다시 반복문이 등장하게 됩니다.


004015F0   > 837D FC 00     CMP DWORD PTR SS:[EBP-4],0

004015F4   . 7D 02          JGE SHORT Babylon_.004015F8

004015F6   . EB 20          JMP SHORT Babylon_.00401618

004015F8   > 8D85 A0FCFFFF  LEA EAX,DWORD PTR SS:[EBP-360]

004015FE   . 8B55 F4        MOV EDX,DWORD PTR SS:[EBP-C]

00401601   . 8D8D A0FEFFFF  LEA ECX,DWORD PTR SS:[EBP-160]

00401607   . 8B5D FC        MOV EBX,DWORD PTR SS:[EBP-4]

0040160A   . 8A0C0B         MOV CL,BYTE PTR DS:[EBX+ECX]

0040160D   . 880C02         MOV BYTE PTR DS:[EDX+EAX],CL

00401610   . FF45 F4        INC DWORD PTR SS:[EBP-C]

00401613   . FF4D FC        DEC DWORD PTR SS:[EBP-4]

00401616   .^EB D8          JMP SHORT Babylon_.004015F0

 

위에서 [EBP-4]는 XOR 연산된 문자열의 길이가 들어가며, 길이만큼 루프를 돌게 됩니다. 우선은 EAX 레지스터에 [EBP-360]의 주소값이 저장되고, [EBP-C]의 값이 EDX 레지스터에 저장됩니다. 그러고나서 [EBP-160]의 주소값이 ECX 레지스터에 저장되고, [EBP-4]의 값이 EBX 레지스터에 저장됩니다. 마지막으로는 CL 레지스터에 [EBX+EDX]의 값이 저장되고, CL 레지스터의 값을 [EDX+EAX]에 저장하며 [EBP-C]를 증가시키고 [EBP-4]를 감소시킵니다.

 

정리해보자면, 처음에 EBX+ECX가 가리키는 것이 EBX에는 XOR 연산된 문자열의 길이, ECX 레지스터에는 [EBP-160]의 주소값이 담기었는데 [EBP-160]의 주소값 + XOR 연산된 문자열의 길이는 [EBP-160]의 마지막 문자를 가리킬 것이고, 이 문자를 [EDX+EAX]에 놓게 되는데 EDX 레지스터에는 [EBP-C]의 값이, EAX 레지스터에는 [EBP-360]의 주소값이 담기므로 [EBP-360]의 주소값 + [EBP-C]일 것입니다. [EBP-4]는 점점 감소되며, [EBP-C]는 점점 증가하는데 이는 [EBP-360]에 [EBP-160]의 값이 거꾸로 뒤집혀서 저장이 되는것을 확인하실 수 있습니다. 
 

00401629   . 50             PUSH EAX                                 ; /s

0040162A   . E8 41020000    CALL <JMP.&msvcrt.strlen>                ; strlen

0040162F   . 83C4 10        ADD ESP,10

00401632   . 89C0           MOV EAX,EAX

00401634   . 3945 FC        CMP DWORD PTR SS:[EBP-4],EAX

00401637   . 72 07          JB SHORT Babylon_.00401640

00401639   . EB 45          JMP SHORT Babylon_.00401680

0040163B     90             NOP

0040163C     8D7426 00      LEA ESI,DWORD PTR DS:[ESI]

00401640   > 8D85 A0FBFFFF  LEA EAX,DWORD PTR SS:[EBP-460]

00401646   . 8B55 FC        MOV EDX,DWORD PTR SS:[EBP-4]

00401649   . 8D8D A0FCFFFF  LEA ECX,DWORD PTR SS:[EBP-360]

0040164F   . 8B5D F0        MOV EBX,DWORD PTR SS:[EBP-10]

00401652   . 8A0C0B         MOV CL,BYTE PTR DS:[EBX+ECX]

00401655   . 880C02         MOV BYTE PTR DS:[EDX+EAX],CL

00401658   . 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]

0040165B   . 40             INC EAX

0040165C   . 8D95 A0FBFFFF  LEA EDX,DWORD PTR SS:[EBP-460]

00401662   . 8D8D A0FEFFFF  LEA ECX,DWORD PTR SS:[EBP-160]

00401668   . 8B5D EC        MOV EBX,DWORD PTR SS:[EBP-14]

0040166B   . 8A0C0B         MOV CL,BYTE PTR DS:[EBX+ECX]

0040166E   . 880C10         MOV BYTE PTR DS:[EAX+EDX],CL

00401671   . FF45 F0        INC DWORD PTR SS:[EBP-10]

00401674   . FF45 EC        INC DWORD PTR SS:[EBP-14]

00401677   . 8345 FC 02     ADD DWORD PTR SS:[EBP-4],2

0040167B   .^EB A3          JMP SHORT Babylon_.00401620

 

이 부분도 반복문이 등장하고, 다른 반복문과 비슷합니다. 간략하게 보자면, [EBP-460]에 [EBP-360]과 [EBP-160]의 값을 번갈아가면서 저장하는데 이는 즉, [EBP-460][1]에는 [EBP-360][1]이, [EBP-460][2]에는 [EBP-160][1]이, [EBP-460][3]에는 [EBP-360][2]이, [EBP-460][4]에는 [EBP-160][2] 이런 식으로 들어간다는 것입니다. 이 부분 아래를 쭉 내리다 보면 반복문이 또다시 등장합니다. 

 

004016AC   . 803C02 1F      CMP BYTE PTR DS:[EDX+EAX],1F
004016B0   . 7E 11          JLE SHORT Babylon_.004016C3
...
004016BB   . 803C02 7A      CMP BYTE PTR DS:[EDX+EAX],7A
004016BF   . 7F 02          JG SHORT Babylon_.004016C3
004016C1   . EB 0D          JMP SHORT Babylon_.004016D0 

...

004016CC   . C60402 36      MOV BYTE PTR DS:[EDX+EAX],36

...

 

그 중에서도 위와 같은 어셈블리 코드를 보실 수 있는데, 이는 [EBP-460]의 문자열 중에서 헥스값이 z(7A)보다 크거나 1F 보다 작을 경우 모두 문자 6(36)으로 바꿉니다. 마지막으로는 아이디의 길이 만큼 [EBP-460]의 값을 앞에서 자르면 키가 나오게 되는데, 위의 과정을 차례차례 밟으면서 어떠한 값이 나오고 그 값이 정확한 시리얼인지 테스트를 한번 해보셔도 좋습니다. 우선은 이러한 과정을 모두 거쳤더니 1]66/Q라는 값이 나왔고, 이 값을 시리얼로 넣었더니 시리얼이 맞는 것을 확인하실 수 있습니다. 아래 C언어 코드에 대략적인 과정을 주석으로 끼워 넣었으니 참고하시면 좋을듯 합니다.

#define _CRT_SECURE_NO_WARNINGS
#include <STDIO.H>
#include <STRING.H>

int main(int argc, char **argv)
{
	char name[128], EBP260[128], EBP360[128], EBP460[256];
	char EBP160[35] = "-[#]]=}&&&+(=$*,,)&.*/+++[][;/..";
	int i, j, l;

	EBP160[32] = 0xA7; EBP160[33] = 0x30; EBP160[34] = 0;
	// 1. 아이디를 입력한다.
	printf("이름을 입력하세요: ");
	scanf("%s", name);
	// 2. EBP-160의 값을 증가시킨다.
	for (i = 0; i < 34; i++)
		EBP160[i] = EBP160[i] + 1;
	// 3. 이름 문자열 사이에 공백을 추가시킨다.
	l = strlen(name);
	for (i = 0, j = 0; j < l; i += 2, j++)
	{
		EBP260[i] = name[j];
		EBP260[i + 1] = 0x20;
	}
	EBP260[i] = '\0';
	// 4. [EBP-160]과 [EBP-260]의 XOR 연산
	l = strlen(EBP260);
	for (i = 0; i < l; i++)
		EBP160[i] ^= EBP260[i];
	// 5. [EBP-360]에 [EBP-160] 값이 거꾸로 된 값이 저장됨
	l = strlen(EBP160);
	for (i = 0; i < l; i++)
		EBP360[i] = EBP160[l - i - 1];
	EBP360[i] = '\0';
	// 6. [EBP-460]에 [EBP-360]과 [EBP-160] 값을 번갈아 가며 저장함
	for (i = 0, j = 0; j < l; i += 2, j++)
	{
		EBP460[i] = EBP360[j];
		EBP460[i + 1] = EBP160[j];
	}
	EBP460[j] = '\0';
	// 7. [EBP-460]의 값 중 7A보다 크거나 1F보다 작으면 6으로 바꾼다
	l = strlen(EBP460);
	for (i = 0; i < l; i++)
		if (EBP460[i] > 0x7A || 0x1F > EBP460[i])
			EBP460[i] = 0x36;
	EBP460[strlen(name)] = '\0';
	printf("시리얼: %s\n", EBP460);

	return 0;
}
저작자 표시 비영리 변경 금지
신고
  1. BlogIcon gvegfvtn at 2014.08.06 02:55 신고 [edit/del]

    이런 것들에 대해서 잘 모르지만 이것을 할 때 컴퓨터 계산의 힘을 빌립니까? 아니면 종이와 펜으로만 가능한가요? 머리가 어지럽네요

    Reply
    • BlogIcon EXYNOA at 2014.08.20 14:36 신고 [edit/del]

      '이런 것'이 어떤 것을 말씀하시는지 모르겠습니다. 물론 분석은 컴퓨터가 해주는 것이고, 기타 부수적인 내용은 사람이 파악하는 것입니다.

  2. bandb at 2014.10.29 10:36 신고 [edit/del]

    제 꿈이 보안 전문가인데 어떤것부터 공부해야할까요?

    Reply

submit

[가독성에 관해서]

[이 글은 저자인 더스틴 보즈웰, 트레버 파우커가 작성한 '읽기 좋은 코드가 좋은 코드다'를 토대로 쓰여졌습니다.]


코드를 작성할 때 가장 중요한 지침을 제공하는 원리!

코드는 이해하기 쉬워야 한다



 

혹시 자신이 작성한 소스 코드를 1~2달 뒤에 보게되니 이게 어떠한 역할을 하는 코드 부분인지 몰랐던 경험이 있으신가요? 코드 구조가 복잡해지게 되면서 다른 사람뿐만 아니라 자기 자신도 못알아보게 되는 상황이 있었던 분들이 있을 것이라 생각합니다. 코드 구조가 복잡하고 코드가 함축되어 있거나, 쓸데없는 코드가 많아지다 보면 '가독성'이 떨어지게 됩니다. 여기서 가독성이란 얼마나 쉽게 읽을 수 있는지 나타내는 정도이며, 이 강좌는 가독성을 중심으로 하여 내용을 다룰 예정입니다. 먼저 코드를 작성할 때는 '기본적으로 다른 사람이 코드를 이해하는 데 들이는 시간을 최소화 하는 방식으로 작성이 되어야 한다'고 합니다. 아래 두 코드를 비교해보도록 합시다.

return exponent >= 0 ? mantissa * (1 << exponent) : mantissa / (1 << -exponent);
if (exponent >= 0) {
   return mantissa * (1 << exponent);
} else {
   return mantissa / (1 << -exponent);
}

위 두 코드를 보고 어느것이 더 눈에 확 들어오는가 하면 두번째 코드가 첫번째 코드보다 이해하기 쉽게 느껴질 수 있습니다. 여기서 완전히 이해한다는 것은 코드를 자유롭게 수정하고, 버그를 짚어내고, 수정된 내용이 우리가 작성한 다른 부분의 코드와 어떻게 상호작용하는지 알 수 있어야 한다고 합니다. 오히려 첫번째 코드를 보면 코드의 분량이 적어 더 좋게 느껴지실 수 있는데 물론 코드의 분량이 적으면 빠르게 이해할 수는 있지만 항상 그렇다는건 아니라는 겁니다. 아래의 경우를 봅시다.

assert((!(bucket = FindBucket(key))) || !bucket->IsOccupied());
bucket = FindBucket(key);
if (bucket != NULL) assert(!bucket->IsOccupied());

우선 위 두 코드는 동일한 기능을 하는 코드로, 키 값으로 양동이를 찾고 양동이가 존재한다면 해당 양동이가 가득 찰 경우 부정 연산자에 의해 거짓이 되고, 이는 assert 함수에 의해 오류 메시지가 출력되고 프로그램이 종료될 것입니다. 가득차지 않았을 경우에는 아래로 코드가 계속 진행되겠죠. 위의 두 코드를 놓고 보았을때, 첫번째 코드가 두번째 코드보다 이해하기까지 걸리는 시간이 길 수도 있습니다. 물론 적은 분량으로 코드를 작성하는 것도 좋지만, 이해에 걸리는 시간을 보다 최소화 시키는게 관건이라 할 수 있습니다. "컴퓨터가 이해할 수 있는 코드는 어느 바보나 다 짤 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다."라는 명언이 있는 것처럼, 자신이 작성한 코드를 몇개월 뒤에 다시 봤더니 낯설게 보이고, 다른 사람도 이해할 수 없는 코드라면 무슨 소용이 있을까요? 뒤로 한걸음 물러나서 이게 과연 이해하기 쉬운 코드인지 생각해보고 넘어가는 것도 중요할 듯 싶습니다.

저작자 표시 비영리 변경 금지
신고
  1. BlogIcon L0GIC at 2014.02.27 21:47 신고 [edit/del]

    새로운 강좌군요 잘읽고 갑니다~

    Reply
  2. ZiNee at 2014.02.27 23:39 신고 [edit/del]

    좋은 글 잘 읽었습니다. "좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다"라는 말씀을 기억하겠습니다.

    Reply
  3. at 2014.08.19 14:30 [edit/del]

    비밀댓글입니다

    Reply
  4. ParkPro at 2015.02.24 11:35 신고 [edit/del]

    주옥같은 말이내요 잘봤습니다^^

    Reply

submit

제목 그대로 프로그래밍이나 보안 등에 관심이 있고 이미 그에 관련한 공부를 하고 계시는 분들을 구합니다.


목적은 정보 공유와 스터디를 모집하여 보다 효율적으로 공부할 수 있도록 하기 위함이며, 


대상은 중고등학생 중 관심사가 확실히 IT 쪽으로 정해진 분들이고 만약 이 모집글에 관심이 있으신 분들은


제 네이트온 계정으로 메일을 보내주시거나 대화를 걸어주시면 감사하겠습니다.


참고로 제 메일은 su6net@nate.com 입니다.


추신. 파이썬 강좌 게시글이 최근에 들어서 계속 수정되고 있습니다. 꾸준하게 강좌에 보완하여야할 부분을 지적해 주시거나, 궁금한 사항을 계속 댓글로 달아주시면 답해드리고 있습니다.

저작자 표시 비영리 변경 금지
신고
  1. BlogIcon 벨붕 at 2014.03.31 22:18 신고 [edit/del]

    중1인데 괞찮을까요? 프로그래밍 공부는 하려는데 뭐부터해야될지 막막하거든요 ㅋㅋ

    Reply
    • BlogIcon EXYNOA at 2014.04.02 09:22 신고 [edit/del]

      중학교 1학년이면 빠르긴 빠릅니다. 프로그래밍에 관심이 있어서 공부하시는 분들 연령대를 살펴보면 초등학생부터 대학생, 어른까지 다양합니다. 중학교때 관심 가지셔서 공부를 하셔도 되긴 되는데 학교 공부에도 신경을 쓰셔야 할 것 같습니다.

  2. DF at 2014.04.21 17:38 신고 [edit/del]

    친추드렸습니다 ^^

    Reply
  3. YHS at 2014.05.21 11:17 신고 [edit/del]

    제가 지금 고2이며 중3부터 프로그래밍을 시작으로 보안쪽에 관심이 생겨서 학원에서도 교육을 받고 있는 중입니다 자바 강좌를 찾다가 이 블로그를 알게되어 방문합니다

    Reply
  4. 엘빈 at 2014.06.09 23:40 신고 [edit/del]

    제가 지금 중1인데 괞찮을까요? 일단 프로그램쪽에 관심있고 꿈은 컴퓨터 보안전문가입니다.
    네이트온 친추 걸었습니다

    Reply
    • BlogIcon EXYNOA at 2014.06.10 23:33 신고 [edit/del]

      위에서도 말했지만 왠만하면 학교 공부에 더 신경을 쓰시는게 좋을 것 같습니다. 중학교 1학년때 정보보안전문가에 대한, IT에 대해 진로를 정했다는 것 자체가 대단하기도 하고 이른 나이기도 합니다. 열정을 다해서 공부를 하시면 못이룰 일도 없습니다.

  5. JB at 2014.07.08 15:03 신고 [edit/del]

    중고생은 아니지만.. 지금도 유효한가요?

    Reply
  6. at 2014.07.22 01:27 신고 [edit/del]

    저기 지금 중1인데요..
    프로그래밍과 보안쪽을 조금이나마 할줄 알고 관심이 있어 가입하고 싶습니다.
    혹시 가능한가요..
    지금 언어 수준은 c언어와 자바 조금 그리고 비주얼 베이직 조금에다가 여러 워게임 사이트들 해보았습니다.
    가능한지요..

    Reply
    • BlogIcon EXYNOA at 2014.07.23 15:34 신고 [edit/del]

      한분이라도 더 스터디에 들어오게끔 하고 싶지만, 최근 들어서 많이 바빠져서 스터디도, 블로그도 잘 신경을 못쓰게 되는것 같습니다. 죄송합니다 (_ _)/

  7. 복칵생 at 2014.07.28 16:13 신고 [edit/del]

    올해22살 1학년만마치고 입대한 대학생(?)입니다.
    곧 전역을앞두고있고, 소프트과,보안쪽으로 IT특기병이라 보안및 프로그래밍쪽에 많은관심을두고있는데,
    아직 초기단계밖에안되네요 ㅜ 스터디를통하여 좀더 많은 지식을 쌓고 싶습니다.

    Reply
    • BlogIcon EXYNOA at 2014.08.02 23:31 신고 [edit/del]

      최근 블로그를 관리할 시간이 부쩍 줄어들어서 스터디 역시도 진행되지 않고 있습니다. 만약 따로 대화를 원하시면 네이트온에서 su6net@nate.com로 친구 추가 요청 부탁드립니다.

  8. 은하개발자 at 2015.01.24 14:51 신고 [edit/del]

    지금 중2인데요 꿈이 정보보안전문가였지만 소프트웨어 개발자로 바뀐지 별로 안되서요...잘부탁드립니다.

    Reply
  9. wireshark at 2016.04.05 02:02 신고 [edit/del]

    안녕하세요
    현재 대학생이고요 IT학부에서 공부중입니다.
    스터디에 참여하고 싶은데 가능 한가요?

    Reply
  10. syun93 at 2016.04.07 12:23 신고 [edit/del]

    안녕하세요 현재 대학생이고 it 학부에 있는데 스터디에 참여하고 싶은데 가능한가요??

    Reply

submit

요즘 블로그에 포스팅 거리가 없어서 고민하던 참에, 


지금 올라와 있는 파이썬 강좌의 부실한 점을 보충해나가는 식으로 새로이 작성하려고 합니다.


파이썬 강좌를 모두 수정하고 나면 또 어떤 글을 써야 할지 감이 잡히지가 않네요.


만약 된다면 PHP와 같은 서버 사이드 스크립트 언어를 다뤄보고 싶기도 합니다.


블로그가 잘 활성화 되지도 않음에도 불구하고 계속 찾아오셔서 강좌를 봐주시는 블로그 독자분들에게도 


감사하다는 말을 전하고 싶습니다.

저작자 표시 비영리 변경 금지
신고
  1. 이전 댓글 더보기
  2. BlogIcon 미친고양이 at 2014.01.15 08:01 신고 [edit/del]

    덕분에 좋은 강좌 잘 보고있습니다 ^^;
    앞으로도 좋은 강의 부탁드리겠습니다

    Reply
  3. Pyth0n at 2014.01.15 16:32 신고 [edit/del]

    파이썬 GUI강좌 같은건 안나오나요?
    나왔으면 좋을것같습니다

    Reply
  4. 굿맨 at 2014.01.16 12:36 신고 [edit/del]

    아주 잘 보고 있습니다. 화이팅이에요

    Reply
  5. at 2014.01.19 16:49 [edit/del]

    비밀댓글입니다

    Reply
    • BlogIcon EXYNOA at 2014.01.31 13:41 신고 [edit/del]

      여러가지 기법과 메서드 그리고 서버 사이드에서 사용되는 언어 등을 우선 생각을 하시고 하시는게 좋습니다. 무엇보다 경험이 중요하기 때문에 워게임 같은 사이트를 통해서 지식을 터득하시는게 좋을겁니다.

  6. Thanks at 2014.01.20 10:24 신고 [edit/del]

    안녕하세요 잘 보고 있습니다
    ㅎㅎ
    혹시 상용엔진들은 다뤄볼 생각이 없으신지요

    Reply
  7. ziny at 2014.01.22 11:44 신고 [edit/del]

    안녕하세요
    늘 잘 보고 있습니다.
    파이썬 강좌 외전으로 장고나 플라스크 같은 프레임워크 강좌를 한 번 고려해주심이 어떠신지요?

    Reply
    • BlogIcon EXYNOA at 2014.01.31 13:37 신고 [edit/del]

      생각보다 파이썬 강좌에 관심을 가져주시는 분들이 많은 것 같습니다. 기대에 부응하여 외전을 쓰게 된다면 그런 쪽으로 작성하여 보도록 하겠습니다. 감사합니다 ^ㅡ^*

  8. cyan at 2014.01.25 00:12 신고 [edit/del]

    안녕하세요
    강좌 잘 보고 있습니다.
    혹시 RSS피드를 제공해주실 생각은 없으신가요?
    업데이트 알람을 받고 싶은데 항상 잊어먹네요..

    Reply
  9. at 2014.02.01 15:48 [edit/del]

    비밀댓글입니다

    Reply
    • BlogIcon EXYNOA at 2014.02.02 02:37 신고 [edit/del]

      네이트온 있으시면 su6net@nate.com로 친구추가 해주셔서 대화를 해주시거나, 또는 메일로 내용을 보내주시면 감사하겠습니다! ^ㅡ^*

  10. at 2014.02.02 11:18 [edit/del]

    비밀댓글입니다

    Reply
  11. nico at 2014.02.04 12:16 신고 [edit/del]

    내용을 참 쉽고, 이해가 잘 되도록 작성해 주셨네요.
    많은 내용 배우고 있습니다. 감사합니다.

    Reply
  12. story at 2014.02.20 22:31 신고 [edit/del]

    안녕하세요, 늘 많은 정보들을 얻어갑니다. 개인적으로 자바강의 정말 잘봤는데 심화과정에 대해 강의하실 계획은 없나요?

    Reply
  13. 감사합니다 at 2014.02.25 11:13 신고 [edit/del]

    많이 배우고 얻어갑니다.^^* 좋은 글 감사합니다

    Reply
  14. 학생1ㅎㅎ at 2014.02.26 14:39 신고 [edit/del]

    C와 C++ 다 보고, 파이썬까지 다 본 열혈 독자입니다. ㅎㅎ
    앞으로도 많이 기대하겠습니다. 감사합니다.^^

    Reply
  15. SH at 2014.03.19 14:14 신고 [edit/del]

    화학 전공한 후 입사했는데 python을 배워야해서 막막했습니다.
    정말 큰 도움 받고 있습니다.
    감사합니다.

    Reply
  16. 빈이아빠 at 2014.03.29 22:59 신고 [edit/del]

    python tkinter로 GUI프로그램을 목표로 열심히 배우고 있는데요.
    python을 배우는데 많은 도움 되었습니다.
    좋은글 감사합니다. ^^

    Reply
  17. 독학생 at 2014.04.29 23:14 신고 [edit/del]

    안녕하세요. 우연히 접한 블로그인데, 파이썬을 공부해보려고 합니다. 이전에 쓰여진 글을 차례로 공부해도 괜찮겠죠? 아니면 기다려서 공부하는게 나은가요? 감사합니다 ^^

    Reply
    • BlogIcon EXYNOA at 2014.04.30 08:31 신고 [edit/del]

      블로그 내에 강좌 게시글은 참고하는 식으로 공부하셔야 될 것 같습니다. 아무래도 급하게 작성된 강좌라 부족한 부분이 많고 이해가 힘들 수 있습니다.

    • 독학생 at 2014.04.30 11:52 신고 [edit/del]

      안녕하세요 답변 감사합니다. 블로그 내의 강좌 6개를 읽었는데 너무 재밌네요. 프로그래밍의 'ㅍ'자도 모르는 상태로 시작했는데 재미를 붙여가고 있습니다. 블로그 내용에 덧붙여서 파이썬에 대해 탄탄하게 공부하고 싶으면 어떻게 해야 할까요? 추천해주실 만한 교재가 있으신가요?

    • BlogIcon EXYNOA at 2014.04.30 18:46 신고 [edit/del]

      저같은 경우는 인터넷에 올라온 글들을 보면서 파이썬에 대해 배우고 있습니다.

  18. 블랙 at 2014.08.12 13:17 신고 [edit/del]

    너무 잘 꾸며 놓으셨습니다.
    내용은 더욱더 알차고요
    화이팅 입니다.

    Reply
  19. 나운규 at 2014.10.09 22:40 신고 [edit/del]

    감사합니다.
    궁금한 점 계속 찾아봅니다

    Reply
  20. 고마워요 at 2014.11.04 16:27 신고 [edit/del]

    신입 새내기 개발자 입니다. Java를 쓰다가 Python을 쓰게 될거같은데 무척 많은 도움이 되고 있습니다
    매번 좋은 글 감사하고 잘 되시길 빕니다~

    Reply
  21. at 2014.11.18 17:17 [edit/del]

    비밀댓글입니다

    Reply

submit

청마의 해, 2014년의 아침이 밝았습니다.

 

올해도 행운과 성공이 가득하길 기원하면서, 자신이 이루고 싶은 일들을 모두 이루고 보람있는 한해 되시길 바랍니다.

 

새해를 맞아 공부 계획을 확고히하고, 미뤄뒀던 계획들을 다시 정리해보려 합니다.

 

모두 새해 복 많이 받으세요!

저작자 표시 비영리 변경 금지
신고
  1. ZiNee at 2014.01.02 06:48 신고 [edit/del]

    노아님도 새해 복 많이 받으세요.

    Reply
  2. BlogIcon J Nam at 2014.01.02 14:59 신고 [edit/del]

    컨텐츠가 너무도 건실하네요. 노아님도 새해복많이 받으시고, 건승하세요.

    Reply
  3. BlogIcon Netzin at 2014.01.11 22:58 신고 [edit/del]

    안녕하세요..^^ 우연히 검색을 통해서 찾게 되었습니다.
    많이 배우고 가겠습니다. 많은 가르침 부탁 드립니다.
    새해 복 많이 받으시고 하시는일 다 잘되시길 바라겟습니다. ^^ 자주 올께요!

    Reply

submit

티스토리 툴바