안경잡이개발자

728x90
반응형

wargame.kr - Crypto Crackme Basic 문제풀이(Write Up)

문제 분류: 리버싱(Reversing)

 

  이번 시간에 풀어 볼 문제 또한 wargame.kr에서 제공하는 간단한 리버싱(Reversing) 문제입니다. 문제 이름은 Crypto Crackme Basic이며 간단한 암호화 라이브러리 코드에 대한 분석을 물어보는 문제입니다.

 

  ▶ 문제풀이 사이트 주소: http://wargame.kr

 

  바로 문제에서 제공해주는 프로그램을 다운로드 받아서 실행해봅시다.

 

  다만 본 프로그램은 C# .NET Framework를 이용해 개발이 된 것으로 보입니다. 따라서 프로그램을 실행하는 과정에서도 .NET Framework가 설치되어 있는지 물어봅니다. 저는 설치가 안 되어 있어서, .NET Framework 3.5를 설치하는 과정이 필요했습니다.

 

 

    설치 이후에 프로그램을 실행할 수 있는데, 이름과 비밀번호를 정확히 입력해야 Flag를 얻을 수 있는 문제 유형인 듯 합니다.

 

 

  가장 먼저 IDA Pro를 이용하여 프로그램이 어떻게 동작하는지 확인하도록 하겠습니다. 나아가 적절한 Name과 Password 값을 찾아야 정답 처리를 받을 수 있을 것입니다.

 

 

  다만 기본적인 IDA Pro를 이용해서는 C# 프로그램을 쉽게 분석할 수 없다는 것을 깨달았습니다. 다시 말해 소스코드를 제대로 분석하기 어려운 상태입니다. 그러므로 동적 분석을 하거나 C# 전용 디컴파일러가 필요할 것 같습니다. 저는 대표적인 C# 디컴파일러인 dotPeek을 이용하도록 하겠습니다.

 

  dotPeek 다운로드: https://www.jetbrains.com/decompiler/

 

dotPeek: Free .NET Decompiler & Assembly Browser by JetBrains

dotPeek is a free tool based on ReSharper. It can reliably decompile any .NET assembly into C# or IL code.

www.jetbrains.com

 

  공식 홈페이지에 접속한 이후에는 기본 설정 그대로 설치를 진행할 수 있습니다.

 

 

  바로 [DOWNLOAD] 버튼을 눌러서 기본 설정 그대로 설치를 진행합니다.

 

 

 

  다른 프로그램은 받지 않고, dotPeek만 선택하여 INSTALL하였습니다.

 

 

  설치 이후에는 dotPeek을 실행합니다.

 

 

  실행 이후에는 프로그램을 Drag & Drop하여 놓습니다. 그러면 자동으로 해당 프로그램을 정적 분석할 수 있도록 도와주는 것을 알 수 있습니다.

 

 

  이제 전체 소스코드를 거의 원래 개발 환경에서의 상태 그대로 확인이 가능합니다. 다시 말해 소스코드 분석을 위해 직접 C# 개발환경을 구축해서 동적으로 분석하는 방법도 있지만, 이렇게 간단히 C# 디컴파일러 도구를 이용하는 것 만으로도 리버싱이 가능한 것 입니다. 이제 하나씩 함수를 분석하겠습니다.

 

 

  먼저 mPadding 함수입니다. mPadding(string s) 함수는 다음과 같이 동작합니다.

- s의 길이가 8자인 경우, 문자열 그대로 반환 
- s의 길이가 8자를 초과하는 경우, 문자열의 뒤쪽 8자만 반환 
- s의 길이가 8자 미만인 경우, 부족한 길이만큼 문자열 뒤에 '*'를 추가하여 반환

 


  getps(string name) 함수는 다음과 같이 동작합니다.

- 특정한 웹 서버로 파라미터 값을 전송하고, 웹 서버의 응답 값을 가져 옴

 


  myEncrypt(string password, string name) 함수는 다음과 같이 동작합니다.

- 입력 받은 비밀번호를 "mPadding(name)"으로 DES 암호화 한 결과를 Base64로 인코딩하여 반환 

  이제 이러한 정보를 활용하여 문제를 풀 수 있습니다.

 


  일단 서버로 보내지는 값은 항상 같습니다. 왜냐하면 BluSH4G이라는 문자열은 8자 미만이므로 항상 뒤에 *이 붙기 때문입니다. 따라서 소스코드를 분석한 결과, 최종적으로 호출되는 URL 주소는 다음과 같습니다.

 

http://wargame.kr:8084/prob/28/ps.php?n=BluSH4G*

 

 

  접속 결과 반환되는 문자열은 다음과 같다는 것을 알 수 있습니다.


JbY4qKhzRgPY1rtQayPU+RtQJ8+ndUFC1wz8h0eBOEsRs00MHv9Czv2luONBu34b 

  이제 이 값을 DES 복호화 하면 요구하는 비밀번호가 무엇인지 알아낼 수 있는 것입니다. Base64 형태를 가지고 있는 DES 암호화 구문을 특정한 키로 DES 복호화 해주는 사이트가 있으니, 이를 이용하면 될 것 같습니다.

https://www.tools4noobs.com/online_tools/decrypt/ 

 

  다음과 같이 DES 암호화의 Key 값을 함께 넣어서 복호화를 진행합니다.

 

 

  이렇게 구한 Flag 값을 기입하면 정답 처리를 받을 수 있습니다.

 

728x90
반응형

728x90
반응형

wargame.kr - DLL with notepad 문제풀이(Write Up)

문제 분류: 리버싱(Reversing)

 

  이번 시간에 풀어 볼 문제 또한 리버싱(Reversing) 문제입니다. 문제 이름은 DLL with notepad로 간단한 DLL 모듈을 분석할 수 있는 지에 대해서 물어보는 문제입니다.

 

  ▶ 문제풀이 사이트 주소: http://wargame.kr

 

  사이트에 접속하면 두 개의 파일이 들어 있는 압축 파일을 다운로드 받게 됩니다. 압축을 풀어 주고 다음과 같은 두 파일을 확인합니다.

 

 

  실제로 노트패드 애플리케이션을 실행해 보면, 메모장 프로그램이 실행되는 것을 알 수 있습니다.

 

 

  아무래도 이러한 메모장 프로그램이 실행됨과 동시에 blueh4g13.dll 모듈이 함께 실행되는 것으로 판단할 수 있습니다. 문제부터 DLL을 사용한다고 명시하고 있기 때문입니다. 따라서 가장 먼저 IDA Pro 32 bit을 실행하여 blueh4g13.dll 파일을 열어 보도록 하겠습니다.

 

  그랬더니 DLL 모듈의 메인 함수 부분이 눈에 보입니다.

 

 

  막막할 때는 해당 모듈에 어떤 문자열이 포함되어 있는지 확인하는 것이 가장 좋습니다. 따라서 Shift + F12로 [String View]를 실행합니다.

 

 

  확인 결과 'oh! handsome guy!'라는 수상한 문자열을 확인할 수 있었습니다. 따라서 더블 클릭하여 문자열이 참조되는 함수를 찾아가 보았습니다. start+49 함수에서 해당 문자열을 참조하는 것을 알 수 있습니다. 따라서 이를 따라가서 F5를 눌러 Hex-Ray를 이용합시다.

 

 

  그랬더니 다음과 같이 DLL 모듈이 notepad.exe와 연동되는 코드를 확인할 수 있습니다. wcsicmp는 문자열 비교 함수로서 두 문자열이 같을 때 0이 반환됩니다. 따라서 전체 소스코드를 살펴 보자면 정확히 "notepad.exe"라는 프로그램과 연동되는 것입니다. 또한 StartAddress라는 쓰레드 함수가 실행되는 것을 확인할 수 있습니다. 따라서 StartAddress 함수를 확인합시다.

 

 

  함수를 방문한 결과, 사용자가 입력한 문자가 dword_10003388과 동일할 때 정답 처리를 받을 수 있도록 소스코드가 작성되어 있는 것을 확인할 수 있습니다. 그렇다면 dword_10003388에 Password가 담겨 있을 가능성이 높습니다.

 

 

  따라서 dword_10003388을 더블 클릭하여, 해당 문자열이 어떤 함수에서 불려지는지 확인할 수 있습니다.

 

 

  아래 사진을 보시면 dword_10003388이라는 배열에 한 글자씩 v2의 값을 넣는 것을 알 수 있습니다. v2는 어떤 값인지 명확히 판단이 어렵지만, 시간 변수를 적절히 조절해서 임의의 값을 생성한 뒤에 이를 v2에 넣는 것임을 알 수 있습니다. 아무래도 정적 분석은 쉽지 않을 것 같습니다. 동적 분석이 가능한 상황이므로 동적 분석을 진행하도록 하겠습니다.

 

 

  이쯤에서 한 가지 의문점을 가져야 합니다. dword_10003388의 값이 언제 Update 되는 지 고려할 수 있습니다. 실제로 dword_10003388가 언제 참조되는지 확인해보면, 세 가지 명령어에서 참조되는 것을 알 수 있습니다. 다음과 같습니다.

 

 

  첫 번째 명령어: dword_10003388을 0으로 초기화

  두 번째 명령어: dword_10003388을 임의의 문자열로 만들기

  세 번째 명령어: dword_10003388이 사용자가 입력한 텍스트와 동일한 지 비교 

 

  결과적으로 dword_10003388은 임의의 문자열이 대입 된 이후에는 값이 다시 변경되지 않습니다. 정리하자면 notepad.exe가 실행되어 dll 모듈이 적재된 순간에 dword_10003388에 저장되어 있는 값을 출력하면, 그것이 바로 Password일 것이라고 유추할 수 있습니다.

 

  그렇다면, 이러한 dword_10003388에 담겨 있는 값은 어떻게 꺼내 올 수 있을까요? 앞서 언급했듯이 코드가 복잡할 때는 정적 분석보다는 동적 분석을 추천합니다. 이럴 때는 OllyDbg를 이용하면 쉽게 문제를 풀 수 있습니다.

 

※ OllyDbg를 이용한 방법 ※

 

  OllyDbg로 한 번 노트 패드 프로그램을 열어 보겠습니다.

 

 

  ALT + E를 눌러 [Executable modules] 탭을 열면, 해당 프로그램과 연동된 DLL 모듈을 확인할 수 있습니다. blueh4g13.dll이 보이네요. 더블 클릭합니다.

 

 

  blueh4g13.dll의 창을 불러 온 다음에 실행 버튼을 눌러서 노트 패드가 켜지는 것을 확인합니다.

 

 

  이제 실행이 되었으니, DLL 모듈이 성공적으로 초기화 되었겠죠? 이제 우클릭 하여 [Search for] - [All referenced text strings]를 눌러서 해당 DLL에 존재하는 문자열 정보를 확인합니다.

 

 

  그랬더니 다음과 같이 문자열에 Password 값으로 보이는 문자열이 발견되었습니다.

 

 

  다음과 같이 Password 값을 이용하여 [auth] 버튼을 누르면 Flag 값을 얻을 수 있습니다.

 

 

※ Process Explorer를 이용하는 방법 ※

 

  또한 사실 런타임 환경에서 dll 모듈에 저장되어 있는 변수의 값을 찾는 방법으로 프로세스 익스플로러(Process Explorer)를 이용하는 방법이 있습니다. DLL 모듈이 초기화 된 이후에 String 값은 Memory 영역에 올라가기 때문에 이를 검토할 수 있습니다.

 

  Process Explorer에서 현재 실행 중인 Notepad 프로그램을 선택하면, 아래 쪽에 함께 실행 중인 서브 프로세스를 확인할 수 있습니다.

 

 

  [Memory] 탭으로 이동하여 확인해도, 아까와 마찬가지로 Password 값이 보이는 것을 알 수 있습니다. 하지만 일반적인 경우 위에서 다룬 OllyDbg를 이용한 동적 분석 방식이 효과적으로 사용됩니다.

 

 

728x90
반응형

728x90
반응형

wargame.kr - keypad CrackMe 문제풀이(Write Up)

문제 분류: 리버싱(Reversing)

 

  이번 시간에 풀게 될 문제는 간단한 리버싱(Reversing) 문제입니다.

 

  ▶ 문제풀이 사이트 주소: http://wargame.kr

 

  문제에 접속하면, 패스워드를 찾아보라는 안내 메시지와 동시에 하나의 실행 파일이 존재합니다.

 

 

  프로그램을 실행하여 간단히 키패드에 아무 내용이나 입력한 뒤에 [AUTH] 버튼을 눌러봅시다.

 

 

  아무래도 정확한 패스워드 값을 넣어야 정답 처리가 되는 것 같습니다. 따라서 IDA Pro를 실행하여 해당 프로그램을 대상으로 정적 분석을 진행하겠습니다. 가장 먼저 [Shift + F4]를 눌러서 [Names View]에 'password'를 검색합니다. 그러면 위에서 확인했던 wrong password라는 값을 가지고 있는 변수를 찾아낼 수 있습니다.

 

 

  이제 이 변수는 어디에서 사용되고 있을까요? 검색 결과, sub_401740라는 함수에서 사용되고 있는 것을 확인할 수 있습니다.

 


   따라서 해당 변수를 참조하고 있는 함수인 sub_401740을 더블 클릭하여 확인해보겠습니다. 그랬더니 무언가 인증을 수행하는 느낌의 어셈블리어 코드가 나오는 것을 알 수 있습니다.

 

 

  이후에 F5를 눌러서 Hex-Ray를 사용해 봅시다. 그랬더니 다음과 같이 상당히 유추하기 쉬운 소스코드가 등장하는 것을 알 수 있습니다.

 

 

  소스코드를 있는 그대로 확인해보겠습니다. 아무래도 사용자가 입력한 값은 v3 변수에 담기는 것 같습니다. 이제 그 변수에서 숫자만 추출하여 정수형으로 만들어 v5에 담습니다. 그리고 v6에는 현재 달 정보가 담기는 것을 알 수 있습니다.

 

  따라서 -201527 * 7월 + v5 == 195934910입니다.

 

  그러므로 정답은 "현재 달(포스팅 시점은 7월) * 201527 + 195934910"입니다. 저는 계산기를 이용해 정답이 197345599인 것을 알아냈습니다. 아마 이 포스팅을 접하고 계신 분들의 현재 날짜에 따라서 정답이 달라질 것으로 예상할 수 있습니다.

 

 

  실제로 해당 값을 입력하여 [AUTH] 버튼을 누르면 성공적으로 Flag 값이 도출됩니다. 실제 Flag 값은 직접 리버싱을 통해 확인해보세요!

 

728x90
반응형

728x90
반응형

wargame.kr - EASY_CrackMe 문제풀이(Write Up)

문제 분류: 리버싱(Reversing)

 

  이번 시간에 풀어 볼 문제는 대표적인 워게임(Wargame) 사이트인 wargame.kr에서 제공하는 간단한 리버싱(Reversing) 문제입니다. 문제 이름은 EASY_CrackMe입니다.

 

  ▶ 문제풀이 사이트 주소: http://wargame.kr

 

Wargame.kr - 2.1

https://www.facebook.com/wargame.kr

wargame.kr

 

  바로 문제풀이 사이트에서 [EASY_CrackMe] 문제를 선택해서 풀어보겠습니다.

 

 

  [Start] 버튼을 눌러서 프로그램 파일을 확인합시다.

 

 

  파일을 다운로드 하여 실행을 해보겠습니다.

 

 

  실행을 하면, 단순히 무언가를 입력하여 제출하는 창이 나옵니다.

 

 

  일단 아무 텍스트나 입력한뒤에 [check] 버튼을 누르면, 다음과 같이 틀렸다는 내용이 등장합니다. 확인 결과 문자열은 nono.. 인 것으로 판단됩니다.

 

 

  이제 IDA Pro 32bit을 실행하여 해당 CrackMe1st.exe 파일을 분석해보도록 하겠습니다.

 

 

  처음 IDA Pro로 프로그램을 불러오면, 위와 같이 프로그램의 크기가 작지 않기 때문에 로딩에 있어서 약간의 시간이 소요됩니다. 일단 가장 먼저 [Quick View(Ctrl + F1)]을 실행하여 [Names View]를 확인합니다.

 

 

  이후에 찾고자 하는 문자열인 "nono"를 검색하여 더블 클릭 합니다.

 

 

  그러면 다음과 같이 텍스트 부분이 나옵니다.

 

 

  이제 마우스 우클릭을 한 뒤에 [List cross references to...] 버튼을 눌러서 이를 참조하는 코드를 확인합니다.

 

 

  그러면 다음과 같이 함수 내용이 나옵니다.

 

 

  이제 함수가 등장했으므로, [F5]를 눌러서 Hex-Ray를 동작시킵니다.

 


  그러면 다음과 같이 Hex-Ray로 내용을 살펴 볼 수 있습니다. 보시면 "G00d!"라고 출력되는 부분이, 바로 정답 처리를 부분이라고 판단할 수 있습니다. 또한 서버와 통신하는 부분이 들어가 있습니다. 즉, 정답을 서버로 제출하게 되고 서버가 실질적인 Flag 값을 주는 것으로 파악할 수 있습니다.

 

 

  소스코드를 확인해 보시면 다음과 같이 분석할 수 있습니다.

 

  - v1[30]: 사용자가 입력한 문자열

  - v4: 문자열의 길이

  - wcsstr(A, B): A 문자열에 B 문자열이 포함되어 있는지 확인합니다.

  - wtoi(A): A 문자열을 정수 형태로 변경합니다.

 

  따라서 소스코드의 내용을 다음과 같이 정리할 수 있습니다.

 

  문자열의 길이가 정확히 13글자이면서, 문자열에 _my_b와 birth가 포함됩니다. 그와 동시에 문자열이 1114로 시작해야 합니다. 왜냐하면 wtoi() 함수는 앞에서부터 출발하여 숫자가 아닌 문자를 만났을 때, 거기서부터는 수로 변경하지 않기 때문입니다.

 

  이러한 조건을 만족하는 문자열은 1114_my_birth입니다.

 

 

  따라서 해당 정답을 제출하면, Flag 값을 받을 수 있습니다.

 

 

  혹은 서버의 API 주소에 바로 정답 데이터를 보내도 Flag를 얻을 수 있었습니다.

728x90
반응형

728x90
반응형

  제가 관심있는 분야는 개발과 보안입니다. 그 중에서 개발은 Web, Game, Data Analysis, Machine Learning 분야를 좋아합니다. 보안은 AI Security, Mobile Security, Ransomware, Social Engineering 분야를 좋아합니다. 사실 컴퓨터 분야면 전부 좋아합니다. 슬프게도 좋아하는 분야는 많지만, 잘 하는 분야는  없습니다.

 

  아무튼 그래서 석사 진학을 결정했습니다. 석박 통합은 자신이 없어서, Only 석사로 지원하여 합격했습니다. 합격 과정에 대한 내용은 다음 포스트에서 확인하실 수 있습니다.

 

https://ndb796.tistory.com/305

 

2019 포항공대(POSTECH) 가을학기 컴퓨터공학과 석사 과정 합격 후기

2019년 포항공대(POSTECH) 가을학기 컴퓨터공학과 석사 과정에 합격 했습니다. 사전에 컨택은 하지 않았고, 대학원 진학 결정도 성급히 한 편이어서 이와 같이 합격까지 순탄하게 이루어질 줄은 몰랐습니다. 영어..

ndb796.tistory.com

  결과적으로 2019년 가을학기로 입학하게 되었습니다. 현재 연구실의 주요 분야는 Security입니다. 사실 분야 자체는 굉장히 다양한데요, 어떤 Category를 딥하게 파볼까... 고민되기도 하고 설레기도 하네요.

 

< 석사 일기 시작 >

 

[2019-05-27]

 

  현재는 포항에 내려가서 수학을 하기 전에 랩 선배님께 읽을 논문들을 소개해달라고 하여, 논문 목록을 받아 공부하는 중입니다.

 

[2019-07-02]

 

  최대한 빨리 연구에 참여하고자, 포항에 내려와 공부하게 되었습니다. 연구실에 출근해서 컴퓨터를 받고, 운영체제를 설치한 뒤에 Git, 문서 프로그램, IDA Pro, FTP 접속 프로그램, Slack, VSC를 설치했습니다. 저희 랩은 Slack를 주 메신저로 사용하고, 각종 문서들은 별도의 서버에서 보관하고 있습니다. Latex는 처음 사용해 보았는데, 쉽지 않은 것 같습니다.

 

  그리고 먼저 내려 온 만큼, 교수님께서 월급도 주시기로 하셨습니다. 기숙사 또한 학교 측에서 사전입사를 제공해주고 있습니다. 고시원에서 살던 저에게는 너무나도 좋은 환경입니다. 공부 열심히 하겠습니다!

 

[2019-07-03]

 

  유랑 생활을 하다가, 개인적인 자리가 생긴 것이 익숙하지 않습니다. 물론 이틀간 정리를 한 끝에 기숙사와 연구실 자리 정리가 어느 정도 완료된 상태입니다. 슬리퍼, 선풍기, 스탠드 등을 구매하여 연구실 자리에 배치했습니다. 

 

  저희 랩장 선배 팔뚝이 엄청나게 굵습니다. 전형적인 Power Lifter의 Physical을 타고 났습니다. 랩장 선배님과는 가능하면 Physically Adversarial한 상황이 발생하지 않아야만 합니다.

 

  밤에는 연구실 회식을 했습니다. 우리 연구실 남자 선배들은 전부 노래를 잘 합니다. (여자 선배님께서 노래를 못 한다는 말은 아닙니다.) 특히 성대 접지와 Mix Voice의 원리를 체득화 하고 계십니다. 제가 분위기를 띄웠어야 했는데... 발라드만 불러서 죄송했습니다.

 

[2019-07-04]

 

  저는 저희 연구실에서 나이가 가장 어립니다. 연구실 선배님께서 '우리 연구실은 네가 압도적 막내구나?'라고 했습니다. 물론 제 피지컬은 이미 나이에 걸맞지 않는 Aging이 발생했으나 생물학적으론 제가 어린게 맞습니다. 선배들은 저보다 나이가 많지만 다들 동안입니다. 선배들한테 배울 점이 정말 많습니다. 사실 대학원에 대해 안 좋은 이야기도 많이 들어서 걱정했는데, 여기에서는 정말 재미있게 공부할 수 있을 것 같습니다. 선배들은 다양한 High-Tier Security Conference의 존재와, 좋은 논문들은 어떤 논문인지에 대해서 간략하게 설명해주셨습니다.

 

  그리고 저는 제가 얼마나 몰랐는지, 무엇을 몰랐는지 서서히 깨닫고 있습니다. 지금까지 아무것도 모르면서 인터넷 공간에 Perturbation을 흩뿌리던 제가 부끄럽게 느껴집니다.

 

  그리고 선배님들은 자차를 가지고 계신데(승용차 혹은 오토바이), 매 번 밥을 먹으러 나갈 때마다 운전을 해서 저를 태워주십니다. 사실 차를 운전하는 건 엄청나게 귀찮은 일입니다. 그럼에도 불구하고 저를 태워주시는 것에 감사합니다. 저는 그래서 태워 주실 때마다 감사하다는 말은 잊지 않고 꼭 하고 있습니다. 저는 노예가 되어도 상관없습니다.

 

[2019-07-05]

 

  우리 연구실의 출퇴근 시간은 자유입니다. 하지만 대부분은 누가 시키지 않아도 10시 가량에 출근해서 저녁을 먹고도 남아서 연구를 진행합니다. 저도 그렇습니다. 어차피 집에 가봤자 컴퓨터 하는데, 이왕 연구실에서 컴퓨터 하는게 나으니까? 그런 것 같습니다. ㅋㅋㅋ

 

  그리고 오늘은 교수님께서 짜장면을 사주셨습니다. 짜장면 집까지는 걸어서 갔는데, 교수님 걸음걸이가 저보다 2배는 빠릅니다. 그래서 자연스럽게 허기가 져서 짜장면을 허겁지겁 먹었습니다. 생각보다 학교 주변엔 맛있는 음식점이 많습니다. 어쩌면 그릇 째로 아그작 아그작 먹을 수 있지 않을까요?

 

  저희 연구실은 신입생이 들어오면, 연구실 적응을 위하여 영어 세미나를 시킨다고 합니다. 지금 저는 Conference 발표 영어 듣기도 겨우 따라가고 있는 수준인데(그마저도 제대로 이해 못 함) 영어 발표를 잘 할 수 있을까요? 저도 잘 할 수 있습니다. 다들 하는 건데, 저도 해야죠!

 

[2019-07-06]

 

  지금까지 제대로 논문을 정독한 적이 없었는데, Paper하나 읽고 Exploit Demo까지 해보는 것은 생각보다 더 많은 시간을 필요로 하는 것 같습니다. 지금까지 다양한 분야의 논문 15개 가량을 속독했지만, 제대로 읽고 구현까지 해 본 것은 없는 수준입니다. 저 같은 폐급이 또 있을까요?

 

  영어 또한 정말 못 하는 편이지만 그래도 읽을 수록 속도가 느는 것 같아서 기분이 좋습니다.

   

  공학 논문에서 하나의 문장을 이해하지 못하겠다면, 그 문장을 이해하기 위해서 또 많은 것들을 DFS로 찾아 공부해야 하는 것 같습니다. 레퍼런스의 레퍼런스의 레퍼런스... 끝나지 않는 재귀지옥... 아무튼 처음에 읽었을 때는 제대로 이해하지 못하고 넘어갔던 부분이, 나중에 다시 읽었을때 본 저자의 의미를 조금이나마 이해하게 되는 것 같습니다.

 

[2019-07-09]

 

  선배들과 개인적으로 보내는 시간이 많아져서, 연구실에 대한 이야기를 더 많이 들을 수 있었습니다. 내가 생각했던 것 보다 더 공부하기 좋은 연구실이라는 생각이 들었고, 더 열심히 해야겠다는 생각이 들었습니다. 저도 좋은 Conference에 논문을 Submit하여 발표하게 될 날이 올까요?

 

[2019-07-20]

 

  박사 선배님이 논문 Summary 과제를 여러 개 내주셨습니다. 저는 Academic Writing이 매우 부족한 편이기 때문에 많은 지적을 받고, 배울 수 있었습니다. (Top-Bottom 방식의 글 쓰기, 능동태 위주로 쓰기, 축약형 쓰지 말기, But/And/So와 같은 접속사 쓰지 말기, 글의 Flow 잘 살펴 보기. Evaluation/Implementation은 Author의 관점에서 서술하기 등) 아주 많은 것들을 배울 수 있었습니다. 신입생 교육 기간에서 다룰 모든 논문에 대하여 Summary를 해보라고 하셔서, 아마 당분간은 영어 공부를 많이 하게 될 것 같습니다.

 

[2019-08-09]

 

  오늘을 마지막으로 신입생 교육 기간이 끝났습니다. 저희 연구실에서는 대학원생 신입생이 입학하면, 4주 간 선배들이 최근에 공부하고 있는 논문을 읽은 뒤에 해당 논문의 내용을 세미나로 발표해야 합니다. 일주일에 하나의 논문을 읽은 뒤에 내용을 정리하여 PPT로 만들고, 영어로 발표해야 하기 때문에 쉽지 않았습니다. 제가 최근에 주제로 잡고 발표한 논문은 Adversarial Example 관련 논문 2개, Fuzzing 관련 논문 1개, Blockchain 관련 논문 1개입니다. 일단 다양한 연구 주제에 대한 기본적인 내용을 이해할 수 있어서 좋았고, PPT 구성 및 논문 내용 발표에 있어서 많은 피드백을 얻을 수 있어서 좋았습니다.

 

[2019-08-14]

 

  실험을 위한 연구용 PC 세팅 작업이 끝났습니다. 그래픽 카드 2장과 파워가 있는 상황에서 CPU, 메인보드, RAM 등을 구매하여 연구용 PC 조립을 했습니다. PC 조립이 끝난 이후에는 Ubuntu 18.04 OS를 설치하고, NVIDIA 그래픽 드라이버를 설치한 뒤에 Cuda 설정까지 마쳤습니다. 다만 제가 Headless한 GPU 서버를 지원하지 않는 메인보드를 구매해버려서, 그래픽 카드의 부착과 부팅 설정 등에서 매우 많은 우여곡절이 있었습니다. 그래서 매뉴얼을 쥐잡듯이 살펴 보며 Error Code를 확인하고, 각종 포럼을 뒤져 가며 문제를 해결해야 했습니다. GPU PC의 전반적인 구성에 대해 많은 내용을 공부할 수 있었습니다.

728x90
반응형

728x90
반응형

pwnable.kr - flag 문제풀이(Write Up)

문제 분류: 리버싱(Reversing)

 

  이번 시간에 풀어 볼 문제는 pwnable.kr의 flag입니다. 이 문제는 가장 기본적인 리버싱(Reversing) 도구를 활용하는 문제입니다.

 

  ▶ 문제풀이 사이트 주소: http://pwnable.kr/play.php

 

 

  위 URL에 명시되어 있는 곳으로 접속하면, 하나의 파일이 다운로드 됩니다. 파일은 flag이며, 이 프로그램을 분석하면 되는 문제입니다.

 

 

  분석을 위해 IDA Pro 32bit 버전을 실행합니다.

 

 

  다음과 같이 프로그램을 열 수 있습니다.

 

 

  다만, 프로그램이 32bit 프로그램이 아니라 64bit라고 하네요.

 

 

  따라서 IDA Pro 64bit 버전을 실행해서 다시 엽니다.

 

 

  이제 분석된 소스코드를 확인합니다. [Graph View]로 보면 정상적으로 코드를 분석하기 어렵습니다.

 

 

  따라서 스페이스 바(Space Bar)를 눌러서 [Text View]로 접속합니다.

 

 

  다만, 어셈블리어가 정상적으로 출력되지 않는 것을 알 수 있습니다. 이럴 때는 일단 프로그램에 포함되어 있는 Strings에 대한 정보를 확인하면 됩니다. 따라서 [Quick View(Ctrl + 1)]을 확인하여, [Strings(Shift + F12)]를 열면 됩니다.

 

 

  그러면 다음과 같이 UPX에 대한 내용을 확인할 수 있습니다. 바로 이 UPX 때문에 우리의 프로그램이 정상적으로 분석되지 않고 있다는 것으로 이해할 수 있습니다.

 

 

  이는 프로그램이 UPX(Ultimate Packer for eXecutable)를 이용하여 패킹되어 있다는 것을 암시합니다. UPX는 다양한 파일 포맷을 지원하는 실행 파일 압축 프로그램입니다. 실행 파일 압축을 하게 되면, 파일의 크기를 줄일 수 있으며 기본적인 리버싱을 방어할 수 있다는 장점이 있습니다.

 

  또한 이와 같이 패킹(Packing) 처리가 된 프로그램을 다시 언패킹(Unpacking)해서 원래의 소스코드를 제대로 확인할 수 있습니다. 언패킹 도구는 다음의 경로에서 확인할 수 있습니다.

 

https://github.com/upx/upx/releases/tag/v3.94

 

upx/upx

UPX - the Ultimate Packer for eXecutables. Contribute to upx/upx development by creating an account on GitHub.

github.com

 

  윈도우 사용자의 경우 upx394w.zip을 다운로드 받아서 압축을 풀어줄 수 있습니다.

 

 

  이제 압축을 푼 폴더에 flag 프로그램을 위치시킵니다.

 

 

  이후에 명령 프롬프트(CMD) 상에서 해당 폴더로 이동하여 upx -d [파일 이름] 명령을 이용하여 특정한 파일을 언패킹 할 수 있습니다.

 

 

  이후에 다시 언패킹 된 flag 파일을 IDA Pro 64bit로 열면 다음과 같이 깨지지 않고 코드가 나옵니다.

 

 

  이제 [Text View]를 확인하면 Flag 값을 확인할 수 있습니다. 이것은 전체 플래그 값이 아니며, 플래그 값을 얻기 위해서는 직접 분석해보시는 것을 추천드립니다.

 

 

728x90
반응형

728x90
반응형

  AWS EC2 인스턴스를 생성한 뒤에, 거기에 접속해서 MySQL, Apache, PHP를 설치하여 연동하는 방법에 대해서 소개하겠습니다.

 

AWS EC2 인스턴스 생성

 

1. AWS EC2 관리 페이지로 이동합니다.

 

  EC2 관리 페이지: https://ap-northeast-2.console.aws.amazon.com/ec2/v2/home

 


2. [인스턴스 시작] 버튼을 눌러 [Ubuntu Server 18.04 LTS (HVM), SSD Volume Type]로 인스턴스를 생성합니다.

 


3. 무료 유형인 [t2.micro] 인스턴스 유형을 선택한 뒤 [검토 및 시작] 버튼을 누릅니다. 이후에 인스턴스를 시작할 수 있도록 하면 됩니다.

 


4. 키 페어를 생성해 저장한 뒤에 [인스턴스 시작] 버튼을 누릅니다.

 

 

인스턴스 접속


1. 아까 EC2 접속 목적의 키 페어 파일을 준비합니다.

 


2. 키 페어에 적절한 권한을 줍니다.


  1) 리눅스: 다음의 명령어로 권한을 설정합니다.

chmod 400 {키 페어 파일 이름.pem}


  2) 윈도우: 키 페어를 우클릭 한 뒤에 [속성] - [보안] [고급] - [상속 사용 안 함] - [명시적 사용] - [관리자 제외하고 모든 그룹 삭제]를 진행합니다. 이후에 관리자 권한으로 CMD를 실행합니다.

 

 

3. SSH 명령어로 서버에 접속합니다. 서버 접속 주소는 [Connect] 버튼을 누르면 나옵니다.

ssh -i "{키 페어 파일 이름.pem}" ubuntu@{AWS EC2 서버 URL}

 

 

  저는 다음과 같은 명령어를 확인할 수 있습니다.

 

 

  이제 다음과 같이 SSH로 AWS EC2 서버에 접속해보겠습니다.

 

 

MySQL 서버 설치 및 환경설정


1. AWS EC2 서버에 접속합니다.


2. MySQL를 설치하고 접속합니다.

sudo apt update # MySQL 설치를 위해 업데이트
sudo apt install mysql-server # MySQL 서버 설치
sudo mysql -u root -p # MySQL 접속

 


3. MySQL 접속 이후에 비밀번호를 설정합니다.

use mysql;
CREATE USER '{생성할 사용자 이름}'@'%' IDENTIFIED BY '{비밀번호}'; # 생성할 사용자 비밀번호 설정
GRANT ALL PRIVILEGES ON *.* TO '{사용자 이름}'@'%'; # 외부 접속이 가능하도록 설정
FLUSH PRIVILEGES;
exit;

 


4. MySQL 설정 파일을 수정합니다.

cd /etc/mysql/mysql.conf.d;
sudo vi mysqld.cnf;

 

  (이 때 만약 vi가 설치되어 있지 않다면 다음과 같이 vim을 설치합니다.)

 


5. mysqld.cnf를 수정하여 MySQL의 외부 접속을 허용합니다.

bind-address = 0.0.0.0


6. 수정 이후에 Mysql를 재시작 합니다.

sudo service mysql restart

 

MySQL 외부 접속 테스트


1. AWS EC2 보안 그룹 페이지로 이동합니다.

 

2. 보안 그룹 설정을 진행합니다. [인바운드] - [편집] - [규칙 추가] - [MySQL/Aurora] - 허용 IP로 [0.0.0.0/0]를 설정합니다.

 


3. MySQL Workbench와 같은 MySQL 관리 도구를 이용하여 접속합니다.

Hostname: {AWS EC2의 공인 IP 주소}
Username: {생성한 사용자 이름}
Password: {비밀번호}

 


4. MySQL에 접속하여 간단한 쿼리를 날립니다.

select now();

 

 

Apache 웹 서버 설치 및 환경설정


1. Apache 웹 서버를 설치합니다.

 

sudo apt-get install apache2

 

 

2. AWS EC2 보안 그룹 페이지로 이동합니다.


3. 보안 그룹 설정을 진행합니다. [인바운드] - [편집] - [규칙 추가] - [HTTP] - 허용 IP로 [0.0.0.0/0]를 설정합니다.

 


4. 공인 IP로 접속하여 웹 서버가 정상적으로 구동하는지 확인합니다.

 

 

5. apache2.conf 설정 파일을 엽니다.

sudo vi /etc/apache2/apache2.conf

 

6. 루트 디렉토리를 [/home/project]로 변경합니다.

<Directory /home/project/>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
</Directory>

 


7. default.conf 설정 파일 열기

sudo vi /etc/apache2/sites-available/000-default.conf

 

8. 루트 디렉토리를 [/home/project]로 변경합니다.

DocumentRoot /home/project

 


9. /home/project 폴더 생성 및 index.html 파일을 생성합니다.

sudo mkdir /home/project
sudo vi /home/project/index.html


10. index.html 파일을 작성합니다.

Hello World!


11. Apache 웹 서버 재시작

sudo apachectl restart


12. 공인 IP로 접속하여 웹 서버가 정상적으로 구동하는지 확인합니다.

 

 

PHP 웹 서버 설치 및 Apache 연동

 

1. 간단히 옛날 버전의 PHP 5.6를 설치해보겠습니다.

sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
sudo apt-get install -y php5.6

 

  (이 때 만약 add-apt-repository가 설치되어 있지 않다면 다음과 같이 설치합니다.)

 


2. 설치된 PHP 버전을 확인합니다.

php -version

 


3. Apache와 PHP 연동 테스트

sudo vi /home/project/index.php


4. PHP 소개 페이지를 작성합니다.

<?php phpinfo();?>


5. 공인 IP의 /index.php로 접속하여 PHP 연동이 제대로 됐는지 확인합니다.

 

  (index.html 파일을 지워야 할 수 있습니다.)

 

 

PHP와 MySQL 연동


1. MySQL 연동 라이브러리를 설치합니다.

sudo apt install php5.6-mysql
sudo service mysql restart
sudo apachectl restart


2. 설치된 패키지를 확인합니다.

dpkg -l | grep php

 

 

3. index.php 소스코드를 작성합니다.

 

<?php
$conn = mysqli_connect(
  '{데이터베이스 IP}',
  '{사용자 이름}',
  '{비밀번호}',
  '{데이터베이스 이름}',
  '3306');
if (mysqli_connect_errno())
{
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
$sql = "SELECT VERSION()";
$result = mysqli_query($conn, $sql);
$row = mysqli_fetch_array($result);
print_r($row["VERSION()"]);
?>

 

 

4. 접속 결과를 확인합니다.

 

 

  정상적으로 MySQL, PHP, Apache가 설치되어 연동이 모두 완료되었습니다.

 

728x90
반응형

728x90
반응형

  사업자 폐지를 하고 싶을 때는 일반적인 경우 홈택스를 이용해, 인터넷으로 손쉽게 사업자 폐지를 할 수 있습니다. 사업자 폐지를 인터넷으로 하고자 한다면 다음과 같이 홈택스에 방문하면 됩니다.

 

  ▶ 홈택스(Hometax): https://www.hometax.go.kr

 

  방문 이후에는 가장 먼저 로그인을 해주세요.

 

 

  로그인 이후에는 다음과 같이 [신청/제출] 탭으로 이동합니다.

 

 

  이후에 [휴폐업신고] 탭으로 이동하여 폐업 신고를 진행하면 됩니다.

 

 

  폐업 신고를 위해서는 먼저 [공인인증서 인증]을 해야 합니다.

 

 

  인증 이후에는 바로 [폐업신고서]에 체크를 하여 폐업 신고를 진행할 수 있습니다.

 

 

  결과적으로 저는 다음과 같이 작성하여 제출했습니다.

 

 

※ 폐업 신고 이후에 해야 할 일 ※

 

  폐업 신고를 한 뒤에, 폐업일이 속하는 과세기간의 개시일로부터 폐업일까지의 사업실적에 대해 신고(부가가치세)해야 합니다. 이 때 폐업일이 속한 달의 말일로부터 25일 이내에 신고를 해야 한다고 하니 꼭 기억해두세요!

 

  저는 최근 과세기간 동안에 사업 실적이 없기 때문에, 다음과 같이 [부가가치세 신고]에서 무실적 신고를 하게 되었습니다.

 

 

  [무실적 신고] 같은 경우는 신고서를 작성하기가 매우 간편합니다. 사실 실적이 없는 지는 꽤 되었는데, 귀찮아서 사업자 폐지를 안 하고 있었거든요.

 

 

  그냥 그대로 [신고서 입력완료] 버튼을 누르면 신고가 끝납니다.

 

728x90
반응형

728x90
반응형

※ Google Colaboratory란? ※

 

  Google Colaboratory를 이용하게 되면, 기존에 주피터 노트북(Jupyter Notebook) 환경에서 인공지능을 공부하던 사람들은 이제 더욱 편하게 공부할 수 있게 됩니다. 자신의 컴퓨터 성능이 매우 좋은 것이 아니라면, 일반적인 프로그래밍을 공부하는 학생들은 CoLab을 이용하는 것을 추천합니다.

 

  CoLab은 주피터 노트북 환경과 Google Drive를 합친 것과 같습니다. 주피터 노트북만큼이나 편하게 소스코드를 작성하고, 그에 대한 설명을 작성할 수 있습니다. 뿐만 아니라 Google Drive에 문서를 저장하고, 이를 다시 불러올 수 있습니다. 더불어 구글 계정만 있으면 무료로 이용할 수 있다는 점에서 매우 간단히 이용하며 머신 러닝을 공부할 수 있습니다.

 

  CoLab은 2017년 10월에 공개되었고, 2019년 1월에 걸쳐 업데이트 되어 PyTorch를 포함해 상당수 유명 라이브러리들을 웹 환경에서 곧 바로 이용할 수 있는 상태입니다. 그래서 교육 목적, 팀 내에서 함께 연구할 목적으로 CoLab을 이용하면 매우 효과적입니다. 같이 소스코드를 작업하면, 곧바로 변경사항이 상대방에게 표시되기 때문에 사실상 뛰어난 공유 환경이라고 할 수 있습니다.

 

  이러한 CoLab은 무료 서비스일 뿐만 아니라 GPU까지 지원합니다. GPU는 한 번에 12시간 동안만 무료로 이용할 수 있지만, 공부를 하면서 웬만한 모델을 돌리는 목적으로 매우 충분하기 때문에 아주 강력하고 좋은 협업 개발환경이라고 할 수 있습니다.

 

  ▶ Google CoLab: https://colab.research.google.com/

 

Google Colaboratory

 

colab.research.google.com

 

  지금까지 다양한 머신러닝 프로젝트를 진행하기에 앞서, 항상 자신의 컴퓨터에 Jupyter 개발환경을 구축해야 했습니다. 하지만 CoLab은 그 자체로 웹 브라우저만 있어도 실행할 수 있는 개발환경입니다. 따라서 매우 편리한 겁니다.

 

※ 파이썬(Python) 소스코드 작성해보기 ※

 

  Google Colaboratory에 접속하면 다음과 같은 [Google Colaboratory] 사용 방법에 대해서 안내가 나올 수 있습니다. 이 때는 [취소] 버튼을 눌러서 안내 문구를 꺼주시면 됩니다. 사실 안내 문구를 다 읽지 않아도, 사용하기에 직관적이고 편리하게 구성되어 있기 때문에 쉽게 이용할 수 있을 것입니다.

 

 

  파이썬(Python) 소스코드를 작성하기 위해서는 다음과 같이 [파일] - [새 Python 3 노트]를 열어주시면 됩니다.

 

 

  이후에 다음과 같이 파이썬(Python) 소스코드를 작성하여 구동시켜 볼 수 있습니다.

 

 

※ 소스코드 공유하기 ※

 

  Google Colaboratory의 가장 큰 장점 중 하나는 소스코드를 손쉽게 공유할 수 있다는 점입니다. 특히 [파일] - [GitHub에 사본 저장...] 버튼을 눌러서 GitHub의 특정한 Repository에 해당 파일을 업로드할 수 있습니다.

 

 

  저는 사전에 GitHub에 [Google-CoLab]이라는 이름의 Repository를 만들어 주었으며, 다음과 같이 Google-CoLab이라는 Repository에 특정한 CoLab 소스코드 파일을 업로드할 수 있도록 설정했습니다.

 

 

  결과적으로 소스코드가 업로드 되면, 다음과 같이 Repository에서 확인할 수 있게 됩니다.

 

※ 유의 사항 ※

 

  Google CoLab은 소스코드는 Drive에 영구적으로 저장이 된다는 장점이 있습니다. 하지만 소스코드를 실행함에 있어서 임시적으로 저장되는 변수 값, 데이터 등은 영구적이지 않다는 점을 유의하셔야 합니다. 그래서 학습 목적의 데이터를 다운로드 받아서 사용하고자 할 때는 Drive에 저장을 한 뒤에, 이를 불러오는 방식을 이용하셔야 합니다.

 

  이러한 현상이 발생하는 이유는 CoLab이 Docker 기반의 컨테이너 개발환경이기 때문입니다. 따라서 추가적으로 pip 등의 명령어를 이용해  다른 라이브러리를 설치했다고 하더라도, 몇 시간 뒤에는 해당 라이브러리가 설치 이전 상태로 돌아가 있을 수 있습니다. 그래서 다시 주기적으로 설치해야 하는 과정이 필요할 수 있습니다.

 

※ CoLab 성능 확인 ※

 

  파이썬 버전을 확인해 봅시다.

import sys 
sys.version_info 

  디스크 용량도 확인해보겠습니다.

!df -h

  메모리 정보는 다음과 같이 확인할 수 있습니다.

!cat /proc/meminfo 

  CPU 정보는 다음과 같이 확인할 수 있습니다.

!cat /proc/cpuinfo

  이후에 GPU를 사용할 수 있도록 설정해보겠습니다.

  이제 GPU를 사용할 수 있는 상태인지 확인해보겠습니다.

!nvidia-smi 

 


※ CoLab 파일 업로드 및 다운로드 ※

  파일을 업로드 할 때는 다음과 같이 할 수 있습니다.

from google.colab import files 
uploaded = files.upload() 

  위 소스코드를 실행하면 파일 업로드 버튼이 등장하게 되고, 이를 이용해 업로드 할 수 있습니다. 저는 한 번 하나의 문서 파일을 업로드 해보았습니다.

  업로드가 된 파일을 다운로드 받을 때는 다음과 같이 할 수 있습니다.

files.download('serverless.yml')

※ 라이브러리 사용해보기 ※


  최신 버전의 CoLab에는 처음부터 TensorFlow 및 PyTorch 등의 라이브러리가 설치되어 있습니다. 원래 PyTorch는 기본적으로 설치가 되어있지 않았지만, 2019년에 들어와서 사용할 수 있게 되었습니다.

import torch
print(torch.__version__)

 

728x90
반응형

728x90
반응형

  지금까지 AWS Lambda를 이용하는 방법에 대해서 알아보았습니다. 다만 단순히 AWS Lambda를 이용하여 코딩하고, 서비스를 개발하면 다양한 어려움에 봉착할 수 있습니다. 특히 AWS Lambda를 이용하면, 프로그램의 크기가 커질 때 직접 웹 사이트에서 코딩을 하는 것이 어려워집니다. 뿐만 아니라 API 게이트웨이 등을 주기적으로 설정해주어야 한다는 점에서 손이 많이 가게 됩니다.

 

  이럴 때 Serverless Framework를 이용하게 되면, AWS Lambda를 보다 손쉽게 이용할 수 있습니다. 직접 수작업으로 설정하던 것과 비교했을 때, 복잡한 작업을 간단한 명령어로 대신 처리할 수 있도록 해주기 때문에 매우 유용합니다.

 

  Serverless Framework를 이용하기 위해서는, IAM 사용자 설정을 해주셔야 합니다. 따라서 AWS 콘솔에 로그인을 한 뒤에 [My Security Credentials] 탭으로 이동합니다.

 

 

  이후에 [IAM Users]를 설정할 수 있도록 합니다.

 

 

  Serverless 프레임워크(Framework)의 실습을 위하여 간단히 하나의 사용자를 추가할 수 있습니다. 따라서 [Add user]를 눌러주세요.

 

 

  이후에 다음과 같이 사용자 이름을 설정한 뒤에 [Programmatic access]에 체크합니다. 그러면 프로그래밍 환경에서 AWS 계정 권한에 접근할 수 있게 됩니다.

 

 

  또한 해당 IAM 사용자에게 권한을 설정해 줄 수 있습니다. 다음과 같이 [AdministratorAccess] 권한을 부여하시면 됩니다. 이 권한은 말 그대로 AWS 계정과 동일한 수준의 권한을 의미합니다. 따라서 향후 만들어 질 IAM 사용자의 Secret Key 값을 다른 사람에게 노출하게 되면, 심각한 문제가 발생할 수 있으므로 반드시 유의하여 Secret Key 값을 관리하셔야 합니다.

 

 

  결과적으로 다음과 같이 사용자를 생성할 수 있습니다.

 

 

  리뷰를 완료하고, 사용자를 최종적으로 생성합니다.

 

 

  사용자가 생성되면 Access Key ID와 Secret Access Key 값이 주어집니다. 이 때 Secret Access Key 값은 반드시 유의하여 저장하셔야 합니다. 이 값을 다른 사람에게 노출하게 되면, 악의적인 의도를 가진 해커가 이를 악용하여 우리의 AWS 계정을 마음대로 다룰 수 있습니다. 예를 들면 무작위로 EC2 인스턴스를 생성해서 하루 만에 1억 가까이 과금이 되도록 할 수도 있겠죠? 따라서 매우 매우 조심하셔야 합니다.

 

 

  이제 Serverless Framework를 위한 AWS IAM 사용자가 만들어졌습니다. 이제 Serverless 프레임워크를 이용해 보겠습니다. 가장 먼저 serverless 모듈을 설치하셔야 합니다. 다음과 같은 명령어로 설치할 수 있습니다.

 

npm install -g serverless

 

 

  Serverless 프레임워크(Framework)는 기본적으로 다양한 템플릿을 제공하고 있습니다. 이러한 템플릿을 이용하면, 자신이 원하는 프로그래밍 언어를 선택하여 빠르게 개발을 진행할 수 있습니다. 다음의 명령어를 입력하여 템플릿(Template) 종류를 확인합시다.

 

serverless create --template

 

 

  이 중에서 가장 기본적인 Node.js 프로젝트 형태를 가지고 있는 aws-nodejs라는 템플릿을 이용해보도록 하겠습니다. 다음의 명령어를 입력하면, 현재 폴더에 aws-nodejs 템플릿의 파일들을 생성하게 됩니다.

 

serverless create --template aws-nodejs

 

 

  실제로 현재 폴더를 확인해 보시면, handler.js와 serverless.yaml 파일이 생성되어 있습니다.

 

  - handler.js: 실제로 API 역할을 수행하는 Node.js 소스코드입니다.

  - serverless.yaml: Serverless 프레임워크의 기본적인 설정 파일입니다.

 

 

  이제 Serverless 프레임워크(Framework)를 사용하기 위하여 AWS 계정 정보를 설정합니다. 아래와 같은 명령어로 AWS 계정 정보를 설정하면, 배포 할 때 해당 AWS 계정으로 배포하게 됩니다.

 

serverless config credentials --provider aws --key {Key ID} --secret {Secret Key}

 

 

  이제 실제로 API를 위한 소스코드를 작성해보도록 하겠습니다. 따라서 handler.js 코드를 수정합니다.

 

'use strict';

module.exports.hello = async (event) => {
  return {
    statusCode: 200,
    body: JSON.stringify({
      message: '성공적으로 배포가 완료되었습니다!',
      input: event,
    }, null, 2),
  };
};

 

  이후에 실질적인 배포 설정을 위하여 serverless.yaml 코드를 수정합니다. 서울(Seoul) 지역(Region)에 Node.js 10 버전으로 배포를 진행하는 것입니다. 또한 handler.js에 있는 hello 함수를 api/hello라는 경로의 GET 방식으로 배포하게 됩니다.

 

service: serverless-nodejs-study

provider:
  name: aws
  runtime: nodejs10.x
  region: ap-northeast-2

functions:
  hello:
    handler: handler.hello
    events:
      -  http:
            path: api/hello
            method: get

 

  이후에 배포를 진행합니다. 배포는 다음과 같은 명령어로 수행할 수 있습니다. deploy 명령어를 수행하면, 현재 폴더에 있는 serverless.yaml 파일에 적혀 있는 설정에 의하여 배포가 진행됩니다.

 

serverless deploy

 

 

  또한 배포가 완료되면, 각 HTTP 메소드(Method) 별로 호출할 수 있는 URL 주소가 나옵니다. 실제로 URL 주소로 접속해 보면 다음과 같이 우리가 작성한 API가 실행되는 것을 확인할 수 있습니다.

 

 

  이후에 AWS 콘솔에 접속하여, 실제로 배포가 완료된 AWS Lambda 함수를 확인할 수 있습니다.

 

 

  뿐만 아니라 작성한 API 소스코드의 길이가 짧기 때문에, AWS Lambda 소스코드를 직접 수정할 수도 있군요.

 

 

728x90
반응형