'Wargame'에 해당되는 글 454건


code engn advance 5번 문제다.

키값 구하면 될 것 같다.

키값이니 또 비교하겠지. 함수보니 vbaStrCmp 또 너다.

입력값에 123주고 실행해보니 다음과 같이 내가입력한 값과 비교값이 나타난다.

 


저 값을 주고 다시 실행해봤다.

성공!


'Wargame > CodeEngn' 카테고리의 다른 글

CodeEngn advance 7번  (0) 2018.02.28
CodeEngn advance 6번  (0) 2018.02.08
code engn advance 4번  (0) 2018.02.08
code engn advance 3번  (0) 2018.02.08
code engn advance 2번  (0) 2018.02.05
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

code engn advance 4번 문제다.

문제가 다 고만고만하다. 

먼저 실행해보면 약간의 언패킹이 걸려있는 것 같다. 

F8로 하나씩 실행해보면 저 점프문에서 엄청위로 올라간다.

이부분이 OEP다 다시 덤프뜨고 실행해봤다.

Istrcmp에 BP걸고 위에처럼 값줘보니 다음과 같이 내가 준 값과 비교하는 값이 보인다.

이정도로 같은 유형을 반복시키면 이제 초등학생도 풀 수 있을 것 같다. 

성공!


'Wargame > CodeEngn' 카테고리의 다른 글

CodeEngn advance 6번  (0) 2018.02.08
code engn advance 5번  (0) 2018.02.08
code engn advance 3번  (0) 2018.02.08
code engn advance 2번  (0) 2018.02.05
code engn advance 1번  (0) 2018.02.04
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

code engn advance 3번 문제다.

basic에서 많이 보던 유형이다. CodeEngn에 해당하는 시리얼값 구하기.

패킹은 따로 안되어있고 열어서 함수부분을 확인해봤다.

떡하니 BP걸어달라고 기다리고 있는 너. 이름에 해당하는 시리얼값 구할때 저기서 비교할 확률이 상당히 높다.

이렇게 넣어주고 돌려봤다.

먼저 들어간 값은 내가준 시리얼값 그다음은 내가 준값이랑 비교할 값.

여기까지만해도 다들 눈치채셨을것같다.

아직까진 advance랑 basic이랑 다를게 없는 것 같다.


'Wargame > CodeEngn' 카테고리의 다른 글

code engn advance 5번  (0) 2018.02.08
code engn advance 4번  (0) 2018.02.08
code engn advance 2번  (0) 2018.02.05
code engn advance 1번  (0) 2018.02.04
code engn basic 20번  (0) 2018.02.04
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

codeengn advance 2번 문제다.

흠 문제만 봐선 모르겠다 파일부터 실행해보자.

실행시켜 보니 비밀번호를 맞추면 되는 것 같다. 

패킹은 따로 안되있어 그냥 열어봤다.

먼저 키입력하는 문자열을 찾아 주변 함수에 BP 걸고 F8로 하나씩 실행하면서 흐름을 파악해봤다.

그랬더니 별다른 분기점은 없고 CALL EDX라는 함수에서 프로그램이 종료된다.

함수 내부로 들어가봤다.

들어가보니 저 많은 JNZ 구문을 통해 프로그램이 종료되는 함수가 호출된다.

크랙하지 않았을때 흐름이 점프가 이루어져 프로그램 종료함수위치로 갔기 때문에 저 점프문들을 모두 통과하면 정상적으로 해결 될 것 같다. 그렇다면 CMP문에서 비교하는 ECX의 값이 중요한데 처음 비교 하는 ECX값을 보니 내가입력한 값의 첫번째 byte를 16진수로 반환한 값이었다.

그렇게 첫번째 점프문 안으로 들어오면 MOVSX ECX,BYTE PTR DS:[EAX+1]을 통해 한 바이트가 더 증가되 2번째, 3번째 ,4번째 바이트 순서로 비교하게 된다. 그렇다면 이제 해야할일은 간단하다. 비교값에 맞게 키 값을 구해봤다.

마지막 0 값은 문자열을 입력했을때 처리되는 null값으로 따로 처리해주지 않아도 될 것 같다.

한번 입력을 해봤다.

성공! 아직 초반이라 문제가 쉬운 것 같다. 


'Wargame > CodeEngn' 카테고리의 다른 글

code engn advance 4번  (0) 2018.02.08
code engn advance 3번  (0) 2018.02.08
code engn advance 1번  (0) 2018.02.04
code engn basic 20번  (0) 2018.02.04
code engn basic 19번  (0) 2018.02.04
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

예전에 우연찮게 접했던 어느 고등학생분이 만든 워게임 사이튼데 재밌게 문제 풀다가 막혔던 웹 문제하나가 있었는데 ctf랑 딴 워게임들 풀다가 갑자기 영감이 떠올라서 다시 풀어보게 됬다.

 

들어가보면 아래와 같이 로그인 기능이랑 계정 등록 기능, 패스워드 찾기 기능 정도가 있다.

여기서 아무계정이나 하나 만들어서 들어가면 메일 보내기 관련 기능이 몇개 있는데 SQLi나 XSS로 admin 세션 따보려고 했는데 딱히 먹히는게 없었다. 그 중에 Members 기능에 접근하면 admin이 아니라 접근이 안됬었다.

 

 

 

 

어찌됫든 admin으로 로그인을 해야 될 것 같았는데 SQLi로 비밀번호를 딸 수 있는 상황도 아니었고 XSS도 필터링이 빡세게 되있어서 먹히지가 않았다. 그래서 가입할때 애초에 admin으로 가입을 해봐야 겠다고 생각했다. 근데이미 admin계정이 있었기 때문에 admin                                        1으런 식으로 가입해주면 admin으로 로그인이 가능했고 Members 메뉴에 접근할 수 있었다.

 

들어가보면 다음과 같이 멤버에 대한 정보를 조회하는 기능이 있었다.

 

 

 

일단 조회를 해보니 다음과 같이 특정 url을 파라미터로 넘기고 있었고 응답값으로 계정 정보가 출력되는 걸 볼 수 있었는데 이 때 파라미터로 날라가는 url에 직접접근해보면 다음과 같이 xml파일 정보를 받아오는걸 확인할 수 있었다. 

 

 

 

일단 xxe인건 알겠고 여기서 url로 넘기는 값을 내 서버로 땡겨서 시도를 해봤는데 애초에 내 서버로 접근조차 안되는거 보니 요청 url정보에 대한 입력값 검증이 이루어 이루어지고 있는 것 같았다. 그래서 원래 서버로 xml내용을 요청할 때 응답값을 내가 원하는 형태로 조작할 수 있나 생각해봤고 search파라미터에서 SQLi가 터지는걸 볼 수 있었다.

 

 

여기서 SQLi를 통해서 xxe를 터트릴려고 했더니 위에처럼 내가 조작할 수 있는 영역이 External Entity를 박아넣을 수 없는 영역이었다. 여기서 xxe가 아닌가하고 디비에 뭔가 들어있나하고 디비정보를 다 털었는데 별다른 수확이 없었다.

 

여기까지가 이전에 문제를 풀었을 때인데 여기서 도저히 영감이 안떠올라서 나중에 풀어야겠다 하고 넘어갔었다. 근데 불현듯 왜 그때 인코딩 값을 안건드려봤지라고 생각이 들었고 다시 들어와서 인코딩값부분에 특정값을 넣어봤더니 요청한 xml에 내 인코딩 파라미터값이 넘어가고있는걸 확인할 수 있었다.

  

 

왜 그 땐 이부분을 간과하고 그냥 넘어갔을까. 웹 해킹하면서 요새 많이 느끼는건데 어느정도 공부 좀 했다고 내 지식선에서 100퍼를 단정짓고 이건 아니다 이런 고정관념에 사로잡히면 안되겠다 라는 생각을 많이 한다.

 

어쨋든 external entity를 선언할 수 있는 시점에서 이미 문제는 끝난거나 마찬가지였고 바로 index.php를 읽어오기위해서 구문을 짰다. 

 

 

요런식의 xml문서를 만들어서 보내면 되겠다고 생각했고 그대로 url파라미터에 값을 담아서 넘겨봤다. (url인코딩해서 넘겨줬음)

 

 

해당 코드를 디코딩해서 봤는데 flag가 없었다.

 

 

 

웹 루트 index.php에 플래그가 있다했는데 현재디렉토리의 index.php가 웹루트 디렉토리가 아닌 것 같았고 ../index.php로 다시 시도해봤다.

 

 

 

플래그가 들어있었고 잘 나왔당.

 

 

 

 

 

 

 

 

블로그 이미지

JeonYoungSin

메모 기록용 공간

,

code engn advance 1번 문제다.

문제가 basic 19번 문제와 똑같다. 내부와도 같을지 궁금하다.

열어보니 같은 내용에 그냥 값만 다르다. 
http://blog.naver.com/dudtls8503/220893097300

문제와 같은 방식으로 풀어준 후 인증할때 md5값으로 바꾸기만 해주면 될 것 같다.

첫번째 문제라 그냥 복습 시켜주나보다.


'Wargame > CodeEngn' 카테고리의 다른 글

code engn advance 3번  (0) 2018.02.08
code engn advance 2번  (0) 2018.02.05
code engn basic 20번  (0) 2018.02.04
code engn basic 19번  (0) 2018.02.04
code engn basic 18번  (0) 2018.02.04
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

codeengn basic 20번 문제다.

드디어 basic 마지막문제. 

키 크랙 문제인 것 같다. crackme3.key라는 파일이 필요한 것 같다.

파일부터 실행해보자. 그냥 실행시키면 뭐가 없다. 

패킹은 따로 되어있지 않다. 바로 열어보자.

우선 문제에서도 나와있듯이 키 파일을 열고 파일내용을 읽는 CreateFile, ReadFile 함수가 보인다.

그냥 돌려보니 역시나 키파일이 없어 정상적으로 동작하지 않는다.

대충 아무값이나 넣고 crackme3.key라는 키 파일부터 만들어서 돌려봤다.

F8로 하나씩 실행하다보니 ReadFile 실행 후 CMP을 보면 4021A0의 값이 내가 입력한 bytes 크기인 9

라고 나온 것 같다. 저 값을 ReadFile에서 지정하고있는 최대바이트크기인 12(10진수로 18)bytes 랑

비교를 하는데 일반적으로 그냥 점프를 하도록 만들기 때문에 점프를 안하고 분기문 안에 있는 코드를

실행시켜보려면 JNZ를 통해 점프를 하면 안되므로 ZF가 1이 되어야 한다. 

파일의 내용을 다음과 같이 18bytes로 바꿔봤다.

동작시켜보니 정상적으로 JNZ SHORT 20.00401037을 통과한다. 그렇다면 이제 그 안을 분석할 차례이다.

우선 의심스러워 보이는 함수 두개를 BP걸고 내부로 들어가봤다. 여기서 이 알고리즘을 이해를 못해서

결국 검색의 힘을 빌려버렸다. 처음엔 풀이를 봐도 잘 이해가 안됬는데 이해하고 보니 그냥 내 어셈블

리어 실력이 문제였다. 명령어 흐름과 메모리구조에대해 공부좀하고 보니 크게 어려운 문제가 아니었다.

하... 어셈블리 ㅠ 

다음은 00401311 함수의 내부 코드다.

분석을 해보면 먼저 XOR을 통해 ECX,EAX를 0으로 초기화 한다.
그다음 키 값이 들어있는 ESP+4를 ESI에 입력한다. 그다음 BL을 0x41로 초기화 한다.

그다음으로는 AL에 키 값이 담긴 ESI를 BYTE단위로 첫번째 부터 넣어준다.

그 후 AL과 BL을 XOR하여 암호화 하는데 예를 들면 현재 내가 입력한 파일의 첫번 째 바이트값인 1의 16진수값인 31과 첫번째 BL값인 41을 XOR하는 경우다. 

다음으로 이렇게 암호화된 AL값을 원래의 바이트 값에 다시 넣어준다.

그 다음 ESI와 BL 값을 1씩 증가시키고 4020F9값에 암호화 시킨 값인 EAX값을 넣어준다.

이 때 암호화된 AL이 0 값이면 함수는 끝이나고 CL은 1씩 증가하는데 총 몇번 반복했는지에 대한 카운트를 나타낸다.

다음으로 BL이 1씩 증가하다가 4F(O)가 되면 함수가 끝이난다.


즉  정상적으로 진행된다면 41(A) ~ 4F(O) 1~14bytes동안 저 형식이 계속해서 반복이 되며  실제로 입

력한 키 값을 XOR를 통해 암호화 하며 변경한다. 그리고 추가적으로 4020F9에 값에는 암호화된 값들

의 총 합이 저장되게 된다.

이렇게 함수가 끝나고 다시 원래 실행흐름으로 돌아오면 

다음과 같이 함수를 통해 암호화된 값들의 총합이 저장된 4020F9의 값과 12345678을 XOR하고 

0040133C 함수를 호출한다. 함수 내부동작을 보기 위해 들어가 봤다.

분석해보면 ESP+4 부분이 파일의 입력한 키 값이 담겨있는데 이를 ESI에 입력하고 ESI값에 0E를 ADD

하여 15byte 위치로 이동한다. 그 후 ESI를 EAX에 넣고 리턴하게되면 EAX에는 파일의 입력된 키 값의

15~18bytes내용이 들어가게 된다.

다음으로 넘어가면 EAX값을 위에서 암호화하였던 4020F9값과 비교한다. 이 부분이 중요한데 다음의 SETE AL을 통해 AL값이 1이 나와야 TEST AL,AL구문을 통해 JE내부로 들어가 성공함수인 00401346으로 들어 갈 수 있다. 그렇다면 SETE AL을 통해 AL값이 1이 나오게 하는게 중요하는데 이를 위해선 CMP EAX,4020F9를 통해 ZF가 1이 되어야 하므로 EAX값이 4020F9값과 같아야한다.  

※SETE에 대해 모르시는 분들이 있으실까 동작원리를 적어드리면 ZF가 1이되면 Byte형 레지스터 즉 여기서 AL을 1로 set하는 명령어다.


현재 값을 확인해 보니 다음과 같았다. 일단 저 부분이 통과될 수 있도록 004020F9부분을 EAX와 같도록 다음과 같이 수정을 해보았다.

실행해보니 다음과 같이 값이 뜬다. 

무슨 값인가 했더니 다음 에서 볼 수 있듯이15~18bytes값을 담고있던 EAX의 앞부분이다. 즉 1~14bytes 부분인 암호화 되어 나온 키 값 부분에 마지막에 !가 함께 나온 것을 알 수 있다.


그렇다면 이제 저 부분이 CodeEngn가 나오도록 하면 CodeEngn!가 출력될 것 같다. 그렇다면

처음에 키 값을 가지고 암호화 해주도록 하는 함수에서 41^입력값첫번째byte=C , 42^입력값두번째byte=o 와 같은 방식으로 8바이트 까지 CodeEngn을 만들고 9번째부터는 null값이 들어가야 되므로 함수를 빠져나올 수 있도록 9번째 byte에 49^00을 통해 AL에 0값을 입력하여 함수를 빠져나오는 조건을 달성시켜준다.

이제 그럼 어떤 값을 입력해야 될지가 문제인데 

xor의 특성인 a^b=c, a^c=b를 활용한다. 즉 2가지값만 알고있으면 나머지하나를 구할 수 있다.

우리는 41~4F의 값과 우리가 도출해내고 싶은 CodeEngn값을 알고있기 때문에 위의 방식을 이용하여

헥스에디터를 통해 다음과 같은 파일을 만들어낸다. 


다음과 같이 넣고 돌려보니. 실패를 했다. ㅡㅡ? 문제가 뭐지 제대로 흐름탄거 같은데 뭔가 했더니 거의 다왔다는생각에 흥분을 했다.


저 CMP구문에서 새로 수정한  파일의 1~14bytes를 통해 만들어진 4020F9값이 1234557B인걸 확인했다. 그렇다면 15~18bytes값을 EAX가 가지고 있기 때문에 파일 내용에서 15~18bytes부분을 다음과 같이 바꾸어봤다.

 


정상적으로 통과하고 다음과 같이 성공하게 된다.


basic이라 쉽게 생각하고 있었는데 마지막 문제풀면서 역시 쌩초보구나 라는걸 다시한번 느꼈다. 혼자

풀다 막혀서 다른분들 풀이까지 참고를 했는데도 어셈블리어를 한번도 제대로 공부해보지 않고 문제풀

면서 하나둘 검색해서 배워가다보니 처음에 흐름이 제대로 이해가 안가서 완벽히 이해하고 푸는데 하루

시간이 걸렸다. 공부를하면할수록 부족하다는 것만 더 느끼게 되는것 같다. 앞으로도 더 열심히 해야

것 같다. 일단 basic은 clear해서 나름 뿌듯한 것 같다. 이제 한숨돌리고 advance로 넘어가보도록 하

다.


'Wargame > CodeEngn' 카테고리의 다른 글

code engn advance 2번  (0) 2018.02.05
code engn advance 1번  (0) 2018.02.04
code engn basic 19번  (0) 2018.02.04
code engn basic 18번  (0) 2018.02.04
code engn basic 17번  (0) 2018.02.04
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

codeengn basic 19번 문제다.

오... 드디어 새로운유형.... 몇초 후에 종료 되는지 알아보란다. 시간과 관련이 있을 것 같다.

파일부터 실행 해 보자. 저렇게 프로그램이 실행되고 어느정도 시간이 지나면 프로그램이 종료된다.

이제 패킹 확인후 파일부터 열어보자.

언패킹 후 파일을 실행해보니 실행이 안된다.

뭔가가 막고있다. 함수들을 확인해보니 IsDebuggerPresent 함수가 막고있었다. 이전에 했던 간단한 우회니 가볍게 회피해보자. 이후 부턴 실행이 잘 된다.


다음으로 이제 시간과 관련해서 뭔갈 찾아야 한다. 함수 목록을 확인해보니 맨처음 보인게 Sleep 함수였

다. 일단 모르니까 sleep함수에 죄다 BP걸고 돌려봤다. 근데 하나도 걸리는게 없다. 여기서부터 멘붕 시

작. 다른 시간관련 함수를 찾아야 하는데 내눈이 사시인지 왜 이걸 의심을 못했지.. ㅡㅡ timegetTime

이라는 함수를 못찾아서 엄청나게 해맸다. 여기서 애초에 내가 뭔가 잘못짚고 있나 싶어서 이러다 결국

포기할까봐 찾아봤다...하... 근데 대충보니 풀이는 볼 것도 없고 그냥 저 함수를 발견하냐 못발견하냐의

문제였다. 아 그냥 더 삽질해서 찾아볼걸..ㅡㅡ  

그래서 timegetTIme 함수에대해 검색을 해봤다. 

윈도우(운영체제)가 시작되어서 지금까지 흐른 시간을 1/1000 초 (milliseconds) 단위로 DWORD형을 리턴하는 함수란다.

그럼 이제부턴 간단하다. F8로 하나씩 실행하면서 분석해봤다.

먼저 최초로 timeGetTime 함수가 실행되면 EAX에 반환된 프로그램 실행시작 값을 ESI에 저장시켜 놓는다. 그 후 CALL EDI를 통해 timeGetTIme 함수를 호출할 수 있기 떄문에 두번째로 실행시킨 함수의 값으로 최초시간과 비교를한다. 두번째로 호출된 함수는 항상 최초 시작값인 ESI값보다 클수밖에 없기 때문에 점프를 하여 다음 사진의 위치로 간다.

다음과 같이 점프해서 오면 EAX에는 두번째로 호출됬을때 시간값이 담겨있고 이를 최초값과 SUB한다.

그러면 실행 후 현재까지의 시간이 EAX에 저장이 되고 이 시간값이 다음의 CMP구문에 있는

 DWORD PTR DS:[EBX+4] 값과 비교가 된다. DWORD PTR DS:[EBX+4] 00002B70이라는 값으로

나와있고 EAX값이  00002B70 보다 작으면 다시 두번째로 timegetTime함수가 호출되었던 위치로 돌

아가 이 과정을 계속 반복한다.  그러다 timegetTIme함수가 호출된 값이 최초 시작값과 SUB되

어  00002B70 값보다 커지게 되면  JMB 19.00444C71에서 점프가 안되서 다음 점프문을 통해 프로

그램 종료 위치로 넘어가게 된다. 이 흐름만 이해한다면 뭘 기준으로 프로그램이 종료되는지 아실테니

정답은 뭔지 다들 짐작하실 거라고 생각한다.

분석할 함수를 못찾아서 검색하고 풀어 괜시리 찝찝했던 문제.


'Wargame > CodeEngn' 카테고리의 다른 글

code engn advance 1번  (0) 2018.02.04
code engn basic 20번  (0) 2018.02.04
code engn basic 18번  (0) 2018.02.04
code engn basic 17번  (0) 2018.02.04
code engn basic 16번  (0) 2018.02.04
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

codeengn basic 18번 문제다.

이전에 많이 풀었던 문제랑 같다. 

실행해보면 다음과 같고 패킹이 따로되어있지않아 그대로 열면 된다.

코드를 봤는데 흐름이 전에문제들과 다를바가 없다. 결국 OR EAX,EAX에서 조건이 결정되는데 이때 이

값이 0이 되어야 하므로 EAX값에 0을 리턴하도록 lstrcmpiA 함수가 0을 리턴하도록 하면 된다.

다음과 같이 값을 넣어보니 첫번 째 함수 인자로 입력한 값이 들어간다. 그렇다면 두번째 인자가

CodeEngn의 시리얼 값이라도 추측할 수 있다. 간단하다. 이전에 계속 했던 방식이다.


그대로 입력해주면 다음과 같이 성공하게 된다.

17번에서 알고리즘 풀어보겠다고 엄청 애썼는데 다시 너무 쉬워져서 당황..


'Wargame > CodeEngn' 카테고리의 다른 글

code engn basic 20번  (0) 2018.02.04
code engn basic 19번  (0) 2018.02.04
code engn basic 17번  (0) 2018.02.04
code engn basic 16번  (0) 2018.02.04
code engn basic 15번  (0) 2018.02.04
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

codeengn basic 17번 문제다.

오.. 드디어 뭔가 좀 바뀐 느낌이다. 이전과는 다르게 키 값을 통해 Name값을 알아내야 하는 것 같다. 그

리고 한자리라는 뭔가 제한적인 것도 있을 것 같다. 

파일부터 실행해보자. name이 1자리라고 해서 넣어봤더니 더 입력하란다. 뭔가 조건으로 막고 있는 것 같다.

패킹은 안되어 있으니 그냥 열어보자. 떡하니 점프문 앞에서 3이랑 비교를 하고 있다. 이걸 CMP EAX,1

로 수정하면 일단 한글자입력은 가능해진다. 


그렇다면 이제 분석을 해보자. 여기저기 BP 걸고 삽질하면서 하나씩 실행하다보니 0045B850 함수를 통해 내가 입력한 name값을 가지고 키 값을 만들어 내는걸 알 수 있었다.

 그 다음 00404C3C 함수를 통해 분기문 조건이 설정되는데 결과 값을 보니 다음과 같이 EAX값은 고정

되어 있고 입력한 name값에 따라 EDX의 값이 달라진다.


직감적으로 EAX와 EDX의 ASCII 값이  같아질 수 있도록 만들면 JMP문 안으로 들어올 것 같다. 어차피

한글자 밖에 안되니 Brute force 방식을 쓰면 될 것 같다. 알파벳아니면 숫자라했으니 하나씩 천천히 넣

어보자. 몇 번 넣어보니 F에서 동일 한 값이 나오고 정상적으로 성공화면이 나온다.


사실 생각보다 오래 걸린 문제였다. 중간에 네임값으로 키값을 만들어내는 함수가 있는데 함수 내부로

들어가서 알고리즘을 파악해보고 입력해야될 값을 알아내려다 결국 실패했다. 아직 실력이 확실히 부족

한 것 같다.이런식으로 풀어서 얻는게 있긴 하는걸까 생각이 든다. 웹쪽 워게임을 집중적으로 하고 있어

서 좀더 시간투자를 하지는 못했지만 다음에는 검색을해서 도움을 받아서라도  알고리즘을 꼭 분석하고

넘어가겠다. 아직도 갈길이 먼 것 같다.


'Wargame > CodeEngn' 카테고리의 다른 글

code engn basic 19번  (0) 2018.02.04
code engn basic 18번  (0) 2018.02.04
code engn basic 16번  (0) 2018.02.04
code engn basic 15번  (0) 2018.02.04
code engn basic 14번  (0) 2018.02.04
블로그 이미지

JeonYoungSin

메모 기록용 공간

,