안경잡이개발자

728x90
반응형

  OllyDbg는 어셈블리어 수준의 디버깅 도구입니다. 무료로 이용할 수 있으며, 돌아가고 있는 런타임 환경의 프로그램에 붙여서 동적 분석을 진행할 수 있도록 해줍니다. 흔히 프로그램을 분석해야 할 때 단순히 소스코드만 보고, 실행 과정을 파악하기 어려울 수 있는데 그럴 때 쓰기 좋은 도구입니다.

 

  따라서 Dev C++을 이용하여 간단히 Hello World 프로그램을 작성한 뒤에 이를 분석하여, 프로그램을 패치(Patch)하는 실습을 해보겠습니다.

 

#include <stdio.h>

int main(void) {
	printf("Hello World\n");
	return 0;
}

 

  32-bit 프로그램으로 설정한 뒤에 프로그램을 생성하겠습니다.

 

 

  이후에 다음의 경로에 접속하여 OllyDbg를 설치합니다. 아래쪽으로 내려오면 [download] 링크가 있으며, 여기에 들어가서 OllyDbg 1.10 버전을 받으시면 됩니다.

 

  ▶ OllyDbg 홈페이지: http://www.ollydbg.de/ 

 

 

  이후에 다음과 같이 [Download OllyDbg] 버튼을 눌러 OllyDbg를 설치합니다.

 

 

OllyDbg는 기본적으로 [관리자 권한으로 실행] 해주셔야 합니다.

 

 

이후에 [F3]을 눌러서 바로 특정한 프로그램을 열어 디버깅을 진행할 수 있습니다.

 

 

  그럼 다음과 같이 프로그램 창이 실행 되고, 왼쪽 위에 실행 버튼을 눌러서 프로그램을 동작시킬 수 있습니다.

 

 

  실행 버튼을 누른 결과 'Hello World'가 출력됩니다.

 

 

※ 프로그램 디버깅 및 패치 해보기 ※

 

  이제 'Hello World'를 다른 문자열로 바꾸어 출력하도록 해봅시다. 먼저 Ctrl + F2를 눌러서 Restart를 합니다. [Hex dump]를 확인하여 비어 있는 메모리 주소를 클릭한 뒤에 스페이스 바(Space Bar)를 눌러서 DUMP 수정 창을 열 수 있습니다.

 

 

  다음과 같이 정보를 수정 할 수 있습니다. 그냥 바꿀 아스키 코드를 입력하여 [OK]를 누르시면 됩니다.

 

 

  저는 'ABC HELLO!'라고 변경해보았습니다.

 

 

  이후에 "Hello World" 문자열을 참조하는 부분에서 주소 값을 "ABC HELLO!"의 주소 값으로 설정합니다. 저는 주소 값 403310의 위치에 문자열을 넣었으므로 이 주소로 설정했습니다.

  

  

    실행 결과, 정상적으로 변경된 문자열이 출력되었습니다.

  

 

  다른 방법도 존재합니다. 별도의 문자열을 메모리에 기록한 뒤에 그것을 가리켜 출력하도록 하는 것이 아니라,  'Hello World'가 원래 존재하던 메모리 주소에서 값을 변경하는 방법입니다. Hex Dump창에서 [Ctrl + G]를 눌러 "Hello World"의 주소 검색할 수 있습니다.

 

 

  이제 해당 주소 값으로 이동하여 "Hello World"를 "Hell  World"로 변경해보았습니다.

 

 

  이번에 실행해 보시면 마찬가지로 정상적으로 실행됩니다.

 

 

※ 패치된 파일 저장하기 ※

 

  프로그램 패치 후에 저장하는 방법 또한 간단합니다.

 

 

  [Hex Dump]의 내용을 변경한 이후에 바로 우클릭하여 [Copy to executable file]을 누릅니다.

 

 

  이제 열린 창에서 다시 우클릭 하여 [Save File]을 눌러서 저장을 진행하시면 됩니다.

 

 

  저장된 파일을 실행해 본 결과, 정상적으로 변경된 코드 내용으로 출력되는 것을 확인할 수 있습니다.

 

 

728x90
반응형

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