안경잡이개발자

728x90
반응형

  일반적으로 DApp을 개발하기 위해서 사용하는 대표적인 언어는 Solidity입니다. 더불어 Truffle을 이용하면 개발 환경을 매우 쉽게 구축할 수 있습니다. 더불어 메타마스크(MetaMask)는 이더리움 관련 앱을 개발하거나 사용하는 전반적인 과정에 있어서 필요하기 때문에 미리 설치해두시면 좋습니다. 말 나온 김에 MetaMask부터 설치를 진행하겠습니다.

 

  ▶ MetaMask 공식 홈페이지https://metamask.io/

 

 

  Metamask는 Chrome 확장 프로그램의 형태로 이용할 수 있습니다. 다운로드를 받아주세요.

 

 

  Metamask를 처음 시작하면, 곧바로 지갑을 생성하여 관리할 수 있습니다.

 

 

  약관에도 동의를 해주겠습니다.

 

 

  이후에 비밀번호 설정창이 나오고 비밀번호를 입력하여 생성하면 다음과 같이 접속할 수 있습니다.

 

 

  기본적으로 우리의 지갑은 [이더리움 메인넷]으로 설정되어 있습니다. 우리는 개발 목적으로 진행하고자 하므로, 일단 테스트넷으로 설정을 바꿀 필요가 있습니다.

 

 

  [Ropsten 테스트넷]으로 변경합니다. 테스트넷은 말 그대로 개발자가 테스트를 쉽게 하기 위한 목적이므로 무료로 가상 이더를 입금 받을 수 있습니다. 따라서 가상의 이더를 입금 받기 위하여 [입금]를 누릅니다.

 

 

  이후에 [이더 얻기] 버튼을 누릅니다.

 

 

  그러면 Faucet에서 이더를 무료로 송금 받을 수 있습니다.

 

 

  이 때 MetaMask가 동작하여 지갑을 연동하고 Faucet으로부터 이더를 얻게 됩니다.

 

 

  약간의 시간이 흐른 뒤에 성공적으로 이더를 송금 받은 것을 확인할 수 있습니다.

 

 

  이제 MetaMask에 대한 기본적인 사용 방법에 대해서 알아보았으므로, DApp 개발을 위한 개발환경을 구축합시다.

 

※ 사전 요구사항 구축 ※

 

  가장 먼저 파이썬이 필요합니다. 파이썬 설치가 되어 있지 않다면, 공식 홈페이지에 접속하여 파이썬을 설치합니다.

 

https://www.python.org/downloads/

 

Download Python

The official home of the Python Programming Language

www.python.org

 

  [Download] 버튼을 눌러 파이썬을 다운로드 받습니다.

 

 

  [Add Python 3.7 to PATH]에 체크하여 기본 설정 그대로 설치를 진행합니다.

 

 

  이후에 NPM을 설치하기 위해 node.js을 설치합니다. 공식 홈페이지에 접속하여 그대로 다운로드 하시면 됩니다.

 

https://nodejs.org/ko/

 

  마찬가지로 기본 설정 그대로 설치하면 됩니다.

 

 

  또한 테스트넷 이외에도 Private 블록체인 환경을 구축해 놓는 것이 좋습니다. Ganache를 이용하면 손쉽게 우리 컴퓨터에 가상의 이더리움 네트워크가 생성됩니다.

 

https://www.trufflesuite.com/ganache

 

Ganache | Truffle Suite

Deploy contracts, develop your decentralized applications (dapps), and run tests on smart contracts. Available as a desktop application & command-line tool.

www.trufflesuite.com

 

  기본 설정 그대로 설치하시면 됩니다.

 

 

  Ganache는 Microsoft 응용 프로그램 형태로 설치가 가능하군요.

 

 

  다만 앱 설치 과정에서 개발자 모드가 체크되어 있지 않다면 설치가 안 될 수 있습니다. 그럴 때는 개발자 모드 설정을 위하여 [설정]으로 이동할 수 있도록 합니다.

 

 

  [개발자 모드]에 체크한 뒤에 다시 설치를 진행하면 됩니다.

 

 

  Ganache가 설치 완료되면, 곧 바로 [QUICKSTART] 모드로 로컬 이더리움 네트워크 서버를 구동시킬 수 있습니다.

 

 

 

  다음과 같이 10개의 기본적인 이더리움 지갑이 주어지고, 개발 테스트에 충분한 만큼의 이더리움이 미리 들어가 있는 것을 알 수 있습니다. 이제 이를 이용해 테스트 할 수 있습니다.

 

 

※ Truffle 개발환경 구축 ※

 

  이제 본격적으로 Truffle을 이용해 개발환경을 구축합니다. 따라서 가장 먼저 Truffle을 설치합니다.

 

  npm install -g truffle@5.0.2

 

  이 때 python과 npm 모두 기본적으로 설치 되어 있어야 합니다.

 

 

  저는 다음과 같이 truffle이 설치되었습니다.

 

 

  이제 하나의 폴더를 만든 뒤에, 명령 프롬프트에서 해당 폴더로 이동하여 truffle 프로젝트를 초기화합니다.

 

  truffle init

 

 

  이후에 실제로 개발 환경은 JS를 함께 사용하여 진행하게 됩니다. npm init으로 종속성 설정을 하시면 됩니다.

 

 

  이제 package.json 파일을 작성합니다. 일반적으로 DApp을 개발할 때 자주 사용되는 라이브러리가 종속성으로 작성되어 있습니다.

 

{
  "name": "hello-world",
  "version": "1.0.0",
  "description": "",
  "main": "truffle-config.js",
  "directories": {
    "test": "test"
  },
  "scripts": {
    "dev": "lite-server",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "truffle": "5.0.2",
    "truffle-contract": "3.0.6",
    "nodemon": "^1.17.3",
    "bootstrap": "4.1.3",
    "chai": "^4.1.2",
    "chai-bignumber": "^2.0.2",
    "chai-as-promised": "^7.1.1",
    "lite-server": "^2.3.0"
  }
}

 

  Visual Studio Code와 같은 에디터(Editor) 프로그램을 실행하여, 우리의 프로젝트 폴더에 접속합니다. 그리고 npm install을 입력해 필요한 라이브러리를 설치합니다. 

 

 

  이제 contracts 폴더에 HelloWorld.sol 파일을 생성합니다. 다음과 같이 작성합니다.

 

pragma solidity ^0.5.0;

contract HelloWorld {
    uint public hello = 0;
}

 

  hello라는 public 변수에 0이라는 값을 넣어 주었으므로, 누구든지 이 앱에 접근하여 hello라는 변수의 값을 확인할 수 있을 것입니다. 이제 Solidity 소스코드를 컴파일하여 Byte Code 형태로 변환합니다.

 

  truffle compile

 

 

  컴파일 결과 다음과 같이 build/contracts 폴더에 HelloWorld.json 파일이 생성됩니다.

 

 

  truffle-config.js 소스코드를 수정하여 개발 전용 서버를 입력하여 연동합니다. 아까 설치한 Ganache 서버를 입력하면 됩니다. IP로는 로컬 호스트(Local Host)를 의미하는 127.0.0.1과 포트 번호로는 7545를 입력하면 됩니다.

 

module.exports = {
  networks: {
    development: {
      host: "127.0.0.1",
      port: 7545,
      network_id: "*"
    }
  },
  compilers: {
    solc: {
      optimizer: {
        enabled: true,
        runs: 200
      }
    }
  }
}

 

  Ganache 프로그램에서도 기본적인 포트는 7545 포트로 설정된 것을 확인할 수 있으므로, 이를 그대로 넣습니다.

 

 

  이후에 /migrations 폴더에 2_deploy_contracts.js 파일을 생성합니다.

 

const HelloWorld = artifacts.require("HelloWorld");

module.exports = function(deployer) {
  deployer.deploy(HelloWorld);
};

 

  이후에 truffle migrate를 입력하여 Deploy를 진행해보세요.

 

 

  스마트 컨트랙트 배포 결과 그 비용으로 약간의 이더리움이 차감된 것을 확인할 수 있습니다.

 

 

  이제 truffle console 명령을 입력하여 콘솔 환경에서 스마트 컨트랙트 정보를 확인합니다.

 

 

728x90
반응형

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
반응형