<보안 study>/리버싱

스마트컨트랙트 분석환경 구성하기

gosoeungduk 2022. 2. 21. 04:11
반응형

최근에 Hayyim CTF 하면서 EVMatrix 라고 스마트컨트랙트를 소재로한 문제를 접할 기회가 있었는데, 블록체인&코인&스마트컨트랙트에 문외한이었던 나는 그 문제를 포기할 수 밖에 없었다 ;;

WriteUp:하임이 흑화하면? 초코하임 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ

해당 Write Up 을 보면서 내가 몰랐던 지식들을 가지고 분석을 할 수 있었구나 하는 생각이 들어서 한 번 스마트 컨트랙트 분석환경을 직접 구축해보기로 하였다.

스마트 컨트랙트에 대해서는 글이 널려있기에 설명을 짧게 하자면, '이더리움 거래' 를 비롯한 여러 계약(무역계약, 금융계약, 부동산 계약 등등) 에 있어서 해당 계약이 체결 되는 시점에 이행할 행동을 정의한 script 를 스마트 컨트랙트라고 이해하면 될 듯하다. 이를 통해 dApp 이나 여러가지 탈중앙화 어플리케이션을 구현할 수 있다고(?) 한다...

일단 내 Ethereum 지갑을 만드는게 우선이었다. 지갑 만드는게 굉장히 어려운 일인줄 알았는데 그냥 마우스 클릭 몇 번으로 지갑이 만들어지는 것을 보고 놀랐다.

지갑은 MetaMask 서비스를 이용한다.

1. MetaMask 설치 및 지갑생성

일단 크롬 확장에서 MetaMask 를 검색하면 크롬 브라우저에 설치해놓고 내 지갑과 이체 기록들을 확인할 수 있다.

오른쪽의 지갑생성에서 지갑을 만들 수 있다.

그리고 MetaMask 소개 영상과 함께 복구구문을 소개한다. 이 복구구문은 내 지갑을 열람하는 비밀번호를 설정하고 지갑에 접속하는 등의 여러 행위에서 필요한 구문으로 잃어버리면 복구가 어려울 수도 있다. 혹은 다른 사람에게 함부로 알려주면 내 지갑의 돈을 털어가주시죠~ 하는 것과 같다.

아무튼 그래서 이 복구구문은 어딘가에 잘 저장해두자.

그리고 우리는 이더리움이 실제로 거래되는 메인 네트워크가 아닌 스마트 컨트랙트 개발용으로 이용할 Ropsten Test 네트워크에서 작업들을 진행할 건데, 고급 -> Show Test Network 를 On 으로 설정해두자.

설정까지 마치면 MetaMask 확장에서 Ropsten Test Network 를 사용할 수 있다.

https://faucet.metamask.io/

그리고 위 링크에서 내 Test 네트워크 지갑에 이더리움을 입금시킬 수 있다.

저 초록버튼을 막 누르면 누른만큼 Ethereum 이 들어온다. 사실 우리가 이더리움을 발급 받는 이유는 우리가 개발할 컨트랙트 를 배포하는데에 이더리움이 어느정도 들기 때문이다.

지금은 물론 떡락장의 이더리움이지만 그래도 고가의 코인을 컨트랙트를 배포할 때마다 구매할 수는 없는 노릇이기에 테스트 서버에 대한 테스트 이더리움을 발급받을 수 있는 것이다.

2. Remix - Solidity 언어를 이용한 컨트랙트 개발 및 배포

스마트 컨트랙트는 Solidity 언어를 이용해서 빌드를 하고 이더리움 네트워크 상에 해당 컨트랙트를 올려놓을 수 있다.

그러한 과정을 손쉽게 할 수 있도록 웹 컴파일러를 구현해놓은 것이 Remix 서비스이다.

이런 깔끔한 UI 구성이 되어있다. IDE 같기도 하다.

특정 ~~~.sol 파일에 내가 원하는 컨트랙트 코드를 넣고 Solidity Compiler 탭에서 컴파일 돌려보고 이상이 없으면, Deploy & Run transaction 탭에서 내 컨트랙트 코드를 네트워크에 배포 할 수 있다.

이 때, Enviornment 를 Injected Web3 로 해두어야 내 MetaMask 지갑 주소 노드에 연결이 되어 배포 수수료(Gas Fee) 를 결제할 수 있다.

배포한 컨트랙트 함수는 밑에서 바로 테스트 해볼 수 있다.

추가로, 만약 ABI JSON 데이터가 필요하다면 Solidity Compiler -> Compilation Details -> ABI 탭에서 복사해갈 수 있다.

ABI(Application Binary Interface) 에 대해 간단히만 설명하면, 내가 쓴 컨트랙트 코드에서 이용되는 함수, 인자 정보, 리턴 값들에 대해 정의해놓은 JSON 데이터라고 이해하면 될 것 같다. (나는 일반적인 바이너리 파일에서 strip 이 되어있는 것이 단순 solidity 바이트 코드이고, ABI 가 해당 바이트코드에 대한 심볼 정보라고 이해했다.) 이 ABI 를 통해 우리는 이후에 컨트랙트 바이트코드를 동작시키는데에 보조적인 역할을 한다.

3. MyEtherWallet - 이미 만들어진 solidity binary 배포 하기

스마트 컨트랙트를 이용하는 문제들은 종종 binary 파일을 abi 와 주기도 한다. 이 때, 이걸 디컴파일 툴을 이용해서 디컴파일 할 수도 있지만, MyEtherWallet 을 통해 직접 배포하여 실행을 시켜볼 수도 있다고 한다.

https://www.myetherwallet.com/ 에 접속하고 AccessMyWalletWeb3 Extension Wallet 을 선택하면 내가 생성한 MetaMask 지갑에 접근할 수 있다.

그리고 여기 바이트 코드와 ABI 정보를 같이 주면, 컨트랙트가 생성되고 etherscan 링크에서 컨트랙트 주소를 따올 수 있다.

그 따온 주소를 Interact with Contract 탭에 ABI 정보와 함께 입력하면 우리가 올려놓은 컨트랙트 코드를 실행해볼 수 있다.

전문적으로 블록체인을 공부하는 입장이 아니어서 약간 겉핥기 식으로 정리해두었다. 그래도 이쪽 분야에 문외한이었던 것에 비해 어느정도 유용한 지식을 얻을 수 있었던 것 같아서 좋다.

스마트 컨트랙트 관련한 해킹 사고에 대해서도 더 알아볼 여지가 생긴 것 같다. 굿.

반응형