Hardhat은 이더리움의 Smart Contract 전문 개발 도구로써, 컨트랙트 작성, 컴파일, 배포 등을 가능하게 해준다. Hardhat을 이용해 Create a basic sample project 로 간단한 프로젝트를 만들고 컨트랙트를 수정해보자.폴더
WavePortal.sol 업데이트 기존 컨트랙트에서 함수 2개가 추가됐다. 누가 컨트랙트를 호출했는지 출력해주는 wave 함수 컨트랙트가 몇 번 실행됐는지 알려주는 getTotalWaves 함수 run.js 업데이트 getSigners 함수를 통해 컨트랙트
이전에 npx hardhat node 명령어로 블록을 생성했던 것은 로컬 네트워크에서 이더리움 노드를 돌리는 방법이었다. 이제 실제 이더리움 테스트넷에서 컨트랙트를 배포하고 프론트엔드 연결까지 해보자. QuickNode https://www.quicknode.com
기존의 컨트랙트는 콘솔만 출력해주는 기능만 수행했었다. 이제 다른 사람이 메세지도 같이 입력하고 상호작용할 수 있도록 컨트랙트를 수정해보자.이해가 가지 않았던 부분이 있어서 검색을 좀 해 봤다. 사진 출처는 빛이 나는 솔플님 블로그다.이더리움에는 4가지 저장공
이더리움에서 송금할 때 3가지 방법이 있다. 각각 어떤 차이점이 있는지 알아보자.이더리움 초기에 만든 방법이다. 전송에 성공하면 true를 리턴하고 실패하면 false를 리턴한다. send의 단점은 에러를 리턴하지 않고, 고정된 gas를 소비한다는 것이다.그
WavePortal.sol 에 선언된 event와 emit은 블록에 특정 값을 기록하고 출력하는 역할을 한다.App.js에서 이벤트 리스너를 추가해 랜더링 될 때마다 event가 출력되도록 해보자.리액트에서 이벤트 리스너를 사용할 때는 useEffect 내에서 등록해야
예제 코드 📚 Openzeppelin Openzeppelin 은 컨트랙트에서 사용할 수 있는 안전하고 검증받은 라이브러리를 제공한다. 예제에서는 NFT 표준인 ERC721과 counter 기능을 제공하는 Counters 라이브러리를 사용했다. Line by li
이더리움에서는 랜덤함수를 제공하지 않는다. 생성되는 블록의 번호나 해시값으로 난수를 생성하면 채굴자는 자신에게 유리한 블록만 채굴하는 경우가 발생할 수 있다. 또한 Don't trust, just verify 라는 말이 있듯이 블록체인에서는 정해진 상태 값과
이 글은 Web3 University의 Road to Web3 튜토리얼을 보고 기록한 글입니다. 🥴eth_getLogs 를 사용하면 블록에 있는 이벤트 및 로그들을 불러올 수 있다. 누가 어떤 NFT를 샀고, 언제 샀는지, 누구에게 전송했는지 등의 정보들을 가져올 수
🚨 오라클 문제 블록체인은 체인 바깥의 정보를 실시간으로 업데이트하기가 어렵다. 예를 들어, 월드컵에서 실시간으로 바뀌는 우리나라 순위를 블록체인 위에 기록한다고 해보자. 매 경기마다 순위는 계속해서 바뀌기 때문에 외부에서 누군가가 체인에 정보를 넣어줘야 한다.
지난 글에 이어 시세에 따라 변하는 NFT를 직접 민팅해보고 bull, bear 상황에 맞게(+랜덤하게) 바뀌도록 코드를 수정하려고 한다. 블록체인 상에서 랜덤 숫자를 만들어내기 어려운 관계로 체인링크의 VRF를 이용할 것이다.
스테이킹은 여러 토큰들이 매도 압력을 덜어내기 위해 주로 사용하는 방식이다. 토큰을 스테이킹한 기간을 기준으로 일정 APY 만큼의 토큰을 분배해주고, 그 기간에는 사용자가 토큰을 팔지 못하도록 한다. 보상 기준은 얼마나 많은 사람들이 스테이킹에 참여했는지, 해
🦄 pinata.js 1. Axios > Axios는 백엔드와 프론트엔드가 서로 통신하기 위한 HTTP 비동기 라이브러리다. 자바스크립트 자체에서 fetch를 쓰기도 하지만 React나 Vue에서 ajax를 구현할 때 Axios를 사용한다. 따로 설치를 해야하는
매우 좋은 글을 작성해주신 코백장(100y)님의 글을 빌리자면 기존에 이더리움 블록 내에서 처리했던 트랜잭션들을 블록 밖으로 가져와서 진행을 하고 결과들은 다시 블록 안에 기록하는 방식이다. 트랜잭션의 타당성은 이더리움 블록 내에서 다시 검증하도록 한다. 이렇게 하면
버튼 연결 함수 중간에 .disabled = false; 부분이 있다.html의 버튼 태그를 보면 앞에 disabled 를 볼 수 있는데 이는 버튼을 비활성화 시키는 것을 기본값으로 가져간다. Id를 가져와서 disabled 값에 true를 넣어주면 버튼이 활
크립토에서는 다양한 방법으로 돈을 번다. 어떤 사람은 NFT flip으로 리빌 전에 팔아서 수익을 챙기고, 어떤 사람은 Defi degen으로 높은 APY를 리스크를 지고 초기에 들어가 다른 사람이 들어오기 전에 이자를 받고 빠진다. 또 다른 사람은 거래소 간의 펀비
테스트 할 가상환경을 만들고 활성화 시킨다.이후 Brownie를 설치 해주고설치 완료 이후 버전체크했을 때 다음과 같이 나오면 성공!위 명령어로 테스트에 사용할 user account를 만들어준다. 정상적으로 완료되면 니모닉 시드 구문과 account 주소가
현재 대부분의 DEX는 유니스왑 V2의 fork 버전이다. 이미 안전성이 입증됐으니 새로운 프로젝트 입장에서는 가져다 쓰지 않을 이유가 없다. 최근의 자체 DEX를 런칭한 Step App만 봐도 유니스왑 V2 코드를 가져다 썼다고 당당하게 홈페이지에 적어놨다.
이제 Brownie 콘솔창에서 벗어나 실제적인 봇을 만들어보자. 코딩하기 전에 전체적으로 어떤 방식으로 봇을 설계할지 생각한 후에 코딩을 하면 많은 도움이 된다.먼저 셋업부분을 살펴보면, 테스트 계정을 가져오고 아발란체 네트워크에 연결한 후 여러 토큰들의 컨트랙트를 가
스마트컨트랙트에서 이더리움 네트워크와 통신하듯이 프론트엔드에서도 Data를 가져오거나 표시할 때 이더리움 네트워크와 통신해야 한다. 이 때 사용하는 것이 Web3.js 또는 Ethers.js다. 둘 다 자바스크립트 라이브러리이며, 여러 모듈로 구성되어 있다.Web3.j
각 토큰 컨트랙트 주소를 불러오고, user가 토큰을 얼마나 가지고 있는지 확인해본다. 이제 user가 router에 어느정도의 규모로 권한을 위임했는지 확인한다. 현재는 어떤 권한도 위임하지 않았기 때문에 기본값인 0으로 나온다. Router를 통해 자동으
Ethernaut을 해보려 하는데 Rinkebey 테스트넷이 3일 뒤에 종료된다.. 따라서 26개의 관문을 3일 안에 통과해야 한다. 안 그러면 언제 또 Ethernaut CTF 를 할 수 있을 지 모른다. 처음 해 보는 CTF라서 시행착오가 많겠지만 이런 저런 과정
ownership 가져오기컨트랙트의 owner를 보니 0x0000000000000000000000000000000000000000다. 해당 주소의 소유자는 없으며 이러한 주소는 보통 소각용 주소라고 알고 있다. 그렇다면 어떻게 ownership을 가져올 수 있을까?co
10번 연속으로 동전의 앞뒷면을 맞추면 된다.먼저 sub(A, B) 함수는 A에서 B를 뺀 결과를 리턴한다. 그런데 인자로 하나만 넣어주면 앞의 종속된 숫자에서 인자를 뺀 결과를 리턴한다. 즉 block.number.sub(1)는 현재 블록넘버에서 1을 뺀 결과를 리턴
ownership 가져오기tx.origin은 msg.sender와 비슷한 의미를 가진다. 하지만 위 설명처럼 연쇠적으로 호출할 때 가장 처음에 호출한 계정을 의미한다. 따라서 tx.orgin은 컨트랙트 계정이 될 수 없다. ownership을 가져오려면 tx.origi
소스코드 해결과제 더 많은 토큰을 얻으면 된다. 해결과정 코드를 처음 봤을 때 드는 생각은 유명한 더 다오 해킹사건이다. 무한 루프를 통해 이더리움을 계속 환전해간 사건. 현재 transfer() 함수는 인출하고자 하는 _value 값을 송금하기 전에 0으로 만
(수정중)ownership 가져오기Delegatecall의 개념은 다음과 같다.현재 Delegation 컨트랙트가 Delegate 컨트랙트를 호출하고 있으니 우리는 Delegation 컨트랙트를 통해 pwn() 함수를 호출하면 ownership을 가져올 수 있지 않을까
컨트랙트의 balance를 올리면 된다.contract의 abi가 비어있는 상황. 그냥 컨트랙트에 이더를 보내면 안 되나? 그런데 컨트랙트가 이더를 받으려면 payable 키워드가 있거나 receive() 또는 fallback() 함수가 있어야 한다. 힌트에서 말한대로
password를 맞춰서 unlock을 실행하면 풀리는 문제인 것 같다. private 으로 선언된 변수를 알 수 있는 방법이 있을까?stackoverflow에서 간단히 찾을 수 있었다.password 변수는 2번째에 있으므로 두 번째 인자에 2를 넣어주면 된다.마지막
prize 보다 많은 이더를 보내고, 인스턴스를 제출할 때 kingship이 reclaim 되는 걸 방지하는 게 최종 목표인 것 같다. 일단 prize가 얼마인지부터 알아내보자.0.001 초과로 보내면 되는 것 확인. 그런데 제출할 때 어떻게 방지해야 할 지 감이 안
컨트랙트의 돈을 모두 탈취하자!유명한 Re-entrancy 문제다. 먼저 돈을 기부하고 내가 보낸 이더만큼 계속 빼내면 될 것 같다.처음에 짠 컨트랙트. donate을 하려고 했더니 다음과 같이 에러가 뜬다.donate 함수를 변경해서 직접 value를 넣어줬다. do
꼭대기 층에 가면 될 것 같지만 어디까지가 끝인지 모른다. Top에 true 값을 주면 되지 않을까? 한 동안 골머리를 앓다가 답을 봐도 이해가 안 됐었다. 먼저 인터페이스에 대한 이해가 필요하다. 인터페이스를 설명할 때 자주 드는 예는 자동차의 브레이크다. 운전할 때
data 값을 알아내면 된다. getStorageAt으로 여러 값들을 뽑았지만 Storage에 대한 근본적인 이해가 필요하다.Storage는 2^256개의 슬롯으로 구성돼있고, 각 슬롯 당 32바이트가 할당된다. 컨트랙트에 선언된 순서대로 슬롯을 채운다고 보면 된다.
락 걸려있는 코인 풀어서 송금하기Timelock 변수를 바꿀 수 있을까? lockTokens의 조건이 msg.sender == player라서 컨트랙트를 사용하면 안 될 것 같다. 그런데 tx.origin을 사용하면 컨트랙트를 사용해도 되지 않을까? --> 잘못된 접근
(수정중)ownership 가져오기delegatecall 은 외부 컨트랙트의 함수를 호출할 때 사용된다. 그냥 call을 사용해도 되지만 delegatecall의 특징은 context 유지에 있다. 위 사진에 잘 나와있듯이, delegatecall을 하면 호출된 컨트랙
이더리움에서 주소를 만드는 2가지 방법 keccack256(RLP_encode(sender, nonce)) CREATE2 keccak256( 0xff ++ senderAddress ++ salt ++ keccak256(init_code
Opcode에 대한 설명이 너무 잘 되어 있어서 사진까지 그대로 가져왔다. 좋은 글을 써주셔서 감사합니다..! 이더리움에서 컨트랙트를 작성하고 컴파일하면 작성된 코드는 컴파일러(solc)에 의해 바이트코드로 변환된다. 그래야 EVM이 알아들을 수 있기 때문이다
먼저 router 컨트랙트에 위임한 MIM 갯수가 현재 보유하고 있는 MIM 갯수보다 적을 때 다시 approve해서 보유한 만큼 권한을 위임하도록 했다. 모니터링하고 있는 MIM -> DAI 의 스왑 비율이 1.006 이상일 때(스왑하면 0.6% 이득), 슬리피지는
snowtrace에 가입해서 api 키를 만들 수 있다. 무료로 초당 5회 요청이 가능하다. .env 파일을 만들어서 api key를 저장해두자.컨트랙트 주소는 바뀔 일이 없으므로 Constant 값으로 넣어주고, env에 저장해놨던 snowtrace api key를
(수정중)ownership 가져오기!값이 false면 에러를 발생시킨다. 내부적 에러 테스트 용도, 불변성 체크 용도로 사용 하는 것이 적합하다.solidity에서 delete로 array 항목을 지우면 그 항목이 완전히 지워지는 게 아니라 default 값으로 돌아간
owner에게 돈을 안 보내면 통과withdraw() 함수를 보면 조금 이상하다는 것을 알 수 있다. 첫 번째는 receipt의 잔고를 먼저 확인하지 않는다. 보통 보내려고 하는 양보다 더 보내지 않으려고 Check Effect Interaction 패턴을 따른다. 두
더 싸게 가져오면 된다! price 함수를 attack 컨트랙트에서 정의할 때 isSold가 두 번 바뀌도록하고, price 설정을 100보다 낮게 하면 되지 않을까? 그래서 첫 번째 attack을 했을 때는 price를 100보다 낮게 하고, 두 번째 attack에서
sSPELL은 SPELL을 스테이킹 해서 받을 수 있다. 현재 보유하고 있는sSPELL 토큰의 갯수에 따라서 사용자가 SPELL fee pool 내 자신의 지분이 어느 정도인지 알 수 있다. 현재 sSPELL과 SPELL의 비율은 1:1.3692다. 일정 비율
컨트랙트에 있는 token1 or token2 탈취하기SwappableToken 컨트랙트를 통해서 Dex 컨트랙트가 Attack 컨트랙트에 approve 하도록 하면 transferFrom으로 토큰을 가져올 수 있지 않을까..?답은 생각보다 간단했다. 내가 너무 복잡하
token1,2 모두 탈취하기일단 swap에서 token1과 token2를 확인하던 require문이 하나 사라졌다. 힌트를 봤을 때 다른 토큰 컨트랙트를 사용해서 문제를 풀 수 있는 것 같다. 설마 이전에 복잡하게 생각했던 방법을 사용할 수 있는건가?하지만 이번 문제
소스코드 해결과제 admin은 컨트랙트 로직을 업데이트할 수 있는 권한을 가지고 있고, owner는 컨트랙트를 사용할 수 있는 whitelist를 관리할 수 있다. admin 권한을 탈취해라! 해결과정 Proxy pattern 블록체인의 특성 상 컨트랙트는 한
(수정중)엔진을 부시자!먼저 컨트랙트를 이해하기 위한 요소들부터 알아보자. Motorbike가 Proxy 컨트랙트고, Engine이 Implementation 컨트랙트이다. Engine에서 constructor를 사용할 수 없기 때문에 initializer modifi
지난 번에 만들었던 helper function을 활용했다.위 예제에서 바다코끼리 연산자(:=)가 사용됐다. 함수 리턴값을 변수에 할당해서 재사용할 수 있다! sSPELL과 SPELL 토큰을 교환할 때 계산식을 살펴볼 필요가 있다.base_staking_rate은 고정
Challenge #1 There's a lending pool with a million DVT tokens in balance, offering flash loans for free. If only there was a way to attack and stop
Challenge #2 There's a lending pool offering quite expensive flash loans of Ether, which has 1000 ETH in balance. You also see that a user has deplo
(수정중)More and more lending pools are offering flash loans. In this case, a new pool has launched that is offering flash loans of DVT tokens for free.C
A surprisingly simple lending pool allows anyone to deposit ETH, and withdraw it at any point in time.This very simple lending pool has 1000 ETH in ba
There's a pool offering rewards in tokens every 5 days for those who deposit their DVT tokens into it.Alice, Bob, Charlie and David have already depos
Secureum은 컨트랙트 오딧 관련 부트캠프다. 해당 substack에 들어가면 잘 정리된 여러 글을 볼 수 있고 유튜브에도 설명 영상이 있어서 컨트랙트 오딧을 처음 배우는 나 같은 사람들에게는 매우 좋은 자료다. 디스코드 또한 잘 되어있고 활발하기 때문에 관심있으면
실제 Audit을 시행한 보고서를 읽는 것은 가장 많이 배울 수 있는 방법이다. 이번 글은 Secureum에서 작성한 글에 나온 사례들을 살펴보고 정리한 글이다. 3. Tokens with more than 18 decimal points will cause issu
sSPELL과 SPELL의 LP 풀을 가져왔다.trader Joe LP 풀의 컨트랙트에는 getReserves()라는 함수가 있는데 유니스왑V2에서 가져온 것 같다.time을 import하고 가장 마지막 리턴 값을 빼면 풀이 변동 되고나서 얼마나 지났는지 알 수 있다.
55. Use of undefined behavior in equality check outputAmt_가 동일한지 확인하는 과정에서 좌측과 우측 모두 동일한 변수를 두고 비교를 하고 있다. 이 때 문제가 되는 점은 계산 순서가 명확하게 정의되지 않았다는 것이다. 어
현재 Code4rena에서 5일 정도 남은 프로젝트에 참가해보려 한다. 시간이 얼마나 걸릴지 모르지만 일단 도전해보는걸로!코드를 보기 전에 공식 홈페이지와 독스를 보면서 프로젝트의 목적과 핵심 컨셉을 먼저 파악하면 코드를 읽을 때 좀 더 편하게 이해할 수 있을 것이다.
중간 점검 🤯 그 동안 짧막한 코드만 보다가 하나의 프로젝트 코드를 전부 보려고 하니 어려움이 있었다. LOC가 그렇게 많지 않음에도 코드를 읽는 것만 해도 거의 이틀 정도 걸린 것 같다. 심지어 가장 코드가 많은 LiquidStakingManager.sol은 아직
해당 글은 Foundry Book의 코드를 정리하고 요약한 글입니다. 요약 글이기 때문에 빠진 부분이 있으며, 책을 먼저 읽고 오시면 이해가 더 잘 될거예요 :)솔리디티로 컨트랙트 개발을 하다보면 여러 기능들이 필요하다. 자신이 작성한 함수가 정상적으로 돌아
브라우니에서는 각 체인별로 네트워크를 지원한다.
🚨 주의: 검증된 컨트랙트가 아닌 ABI와 상호작용하는 것은 매우 위험합니다. 절대 추천하지 않으며 항상 DYOR 하시기 바랍니다.Brownie에서 Contract.from_explorer() 컨트랙트를 불러올 때 가끔 안 될 때가 있다. 원인은 explorer에 컨
9월 20일 컨테스트 시작11월 1일 리포트(https://code4rena.com/reports/2022-09-vtvlHigh Risk Findings (2)Medium Risk Findings (10)Low Risk and Non-Critical Issue
여러 토큰들이나 풀을 모니터링 할 때 일일이 코드를 만들어주는 것은 시간도 많이 들고 비효율적이다. 따라서 토큰같은 경우 ERC20 Class를 만들어서 토큰 주소만 입력해주면 봇을 만들 수 있도록 짜놓는 것이 좋다.\_\_init\_\_은 constructor와 같은
컨트랙트를 테스트할 때 매번 메인넷 혹은 테스트넷을 사용하려면 생각보다 번거로울 수 있다. 이럴 때 ganache를 통해 local로 노드를 돌리고 메인넷을 fork 해오면 부담 없이 테스트할 수 있다.터미널을 열어서 아래 명령어를 통해 ganache를 설치해주자.도커
PSM은 1:1 비율로 바로 교환할 수 있도록 해주는 시스템을 말한다. 다오메이커에서 운영하는 USDC PSM의 경우, 사용자는 USDC와 DAI를 1:1로 교환 가능하다. 이번 레포트 scope에 포함되어 있는 SimpleFeiDaiPSM은 Fei와 Dai를 1:1로
한 고래가 모종의 이유로 들고 있던 WAVAX를 MIM으로 스왑하려고 한다. 스시스왑에서 MIM/WAVAX 풀이 있다고 하자. 고래는 해당 풀에 아발란체를 덤핑하고 MIM을 가져갔다고 하면, 현재 풀에는 MIM 대비 아발란체의 개수가 훨씬 많아진다. 따라서 가격 변화는
솔리디티에 대해 더 잘 알고싶은 마음에 기본 개념들을 더 자세히 보려고 한다. 구글링을 하다가 좋은 미디엄을 발견해서 해당 글들을 읽고 정리할 생각이다. 미디엄에 Member-only로 되어 있어서 통번역을 하기엔 조심스럽다. 한 달에 $5만 내면 양질의 글들을 읽을
ParaSpace는 NFT 랜딩플랫폼이다. 백커로 세콰이어 등 유명 VC들이 있고 현재 ape 스테이킹으로 하잎을 가져가고 있는 프로젝트다. 자세한 설명은 블로그 글을 참고하자. Scope 그 동안 읽었던 레포트 및 참가했던 콘테스트에 비해서 LOC와 Scope
📚 Library 라이브러리는 코드의 재사용성을 높여주는 장치라고 할 수 있다. 라이브러리의 코드를 한 번 디플로이하면 다시 디플로이할 필요 없이 여러 컨트랙트에서 가져다 쓸 수 있다. 또한 중복되는 기능이나 함수를 따로 라이브러리에 모아두면 컨트랙트가 가벼워지고
Scope |Files|SLOC")|Coverage")| |:-|:-:|:-:| |Kernel Contracts (2)| |src/Kernel.sol Σ|262")|100.00%")| |src/utils/KernelUtils.sol [🖥](#nowhere "Uses
Escher is a decentralized curated marketplace for editioned artwork|File|SLOC(|:-|:-:|:-|:-||Contracts (12)||src/uris/Unique.sol|9(|src/uris/Base.sol|
Assembly or Assembler language indicates a low-level programming language that can be converted to machine code by using assembler. Assembly language
Blur는 최근 에어드랍으로 핫한 패러다임의 NFT 마켓플레이스 프로젝트다. 오딧 리포트를 잠깐 봤더니 High 1개, Medium 1개 있어서 간단하게 정리해보려 한다.전체적인 구조를 살펴보면, 3가지 메인 컴포넌트로 구성된 프록시 형태다. MatchingPolicy
We want to raffle away a single NFT (token) based off of another NFT collection (or drawingToken) in a fair and trustless manner.체인링크를 활용해서 NFT 라플을 돌리
Caviar is a fully on-chain NFT AMM that allows you to trade every NFT in a collection (from floors to superrares). You can also trade fractional amoun
Papr facilitates NFT-backed loans. Borrowers deposit allowlisted NFT collateral and mint papr, which can then be exchanged on Uniswap for some other a
Code4rena 콘테스트에 참여하거나 리포트를 보다보면 assembly를 종종 볼 수 있다. 볼 때마다 아직도 정확하게 돌아가는 메커니즘을 이해하지 못해서 제대로 배워보려고 한다. 저번에 All about Assembly 글을 쓰면서 기초는 배웠지만 아직 그 이상을
Tigris is a leveraged trading platform that utilizes price data signed by oracles off-chain to provide atomic trades and real-time pair prices.
_returnDust()는 남은 이더를 msg.sender에게 보내는 함수다. 여기서 문제가 되는 부분은 중간에 있는 call이다. opcode로 실행되는 call의 결과는 callStatus에 저장된다. 그런데 해당 결과의 성공이나 실패 확인 절차 없이 무조건 실행된
legenderay gobler를 민팅하려면 일반 gobler를 소각시켜야 한다. 위의 burn logic을 보면 address(0)으로 transfer 함으로써 소각시킨다. 그런데 transferFrom 함수를 보면 require문에서 msg.sender == get
This is a contest to evaluate the entirety of the GoGoPool Protocol, a decentralized liquid staking protocol on Avalanche. Our mission is to be the ea
Overview Biconomy Smart Account is a smart contract wallet that builds on core concepts of Gnosis / Argent safes and implements an interface to supp
balance를 계산하는 식에서 불필요한 부분이 있다. 아래 ratePerSecond() 함수를 실행하게 되면balance 계산식은 아래처럼 바꿀 수 있다. 이 때 RATE_DECIMALS_MULTIPLIER이 중복되므로 불필요한 계산이 추가되면서 가스비 소모로 이어진
오딧 콘테스트에 참여하다 보면 자신이 생각하는 취약점에 대한 근거를 같이 제출해야 할 때가 있다. 이러한 근거를 PoC(Proof of Concept)라고 말하고 이를 통해 해당 취약점이 유효하다는 것을 증명한다. 지금까지 콘테스트에 참여하면서 PoC를 작성하는 부분이
오딧 콘테스트에 참여하는 것은 코드의 취약점을 찾는 실력을 길러준다. 이와 반대로 이미 해킹이 발생한 프로젝트의 사례를 재구현 해보는 것도 많은 도움이 된다. 결국 오딧 자체가 해킹을 사전에 방지하기 위함이고, 이를 위해서는 과거에 어떤 사례들이 있었는지 알고 있어야
Build space 예제를 처음 접했던 것이 벌써 1년 전이다. 그 때는 단지 취미로 시작했었다. 이후 예제도 따라해보고 매우 간단한 dApp도 만들어보면서 흥미를 키워갔다. 러스트와 golang 찍먹도 해보고 내가 생각보다 코딩과 잘 맞다는 느낌도 받으면서 한편으로
그렇다면 현재 내 부족한 실력을 늘리기 위해 어떤걸 해야 할까? 객관적인 피드백은 어렵겠지만 현재 내가 부족하다고 느끼는 것들은 다음과 같다.내가 지금까지 읽었던 레포트의 수는 얼마 안 된다. 따라서 당연히 취약점이 어떤 게 있는지 모르는 것들이 많다. 단순히 레포트를
주요 결함들 [H-01] TRANSFERING FUNDS TO YOURSELF INCREASES YOUR BALANCE _transfer 함수는 단순히 from 주소에서 to 주소로 토큰을 이동시키고 있다. 주소에 대한 확인이 없기 때문에 자기 자신에게 토큰을 전송
Tx Hash : 0xae8ca9dc8258ae32899fe641985739c3fa53ab1f603973ac74b424e165c66ccfHacker Address : 0xde78112ff006f166e4ccfe1dfe4181c9619d3b5dAttack Contract
주요 취약점 [M-01] AN ATTACKER CAN MAKE USERS UNABLE TO CANCEL THEIR L1 CALLS ON ETHEREUM TO ARBITRUM 일단 취약점을 보기 전에 이더리움(L1)에서 아비트럼(L2)으로 어떻게 메세지를 전달하는지
Code4rena에서 열리는 대회에 참여하면 보통 1달 정도 뒤에 결과가 나온다. 오늘은 그 동안 여러 대회에 참여하면서 얻은 결과를 정리해보려 한다. 결론부터 말하면 High 1개, Medium 3개 총합 4개의 취약점을 발견했다. 지난 6개월간 노력해서 얻은 성과라
혼자서 리포트를 읽으며 컨트랙트 오딧을 공부하는 것도 좋지만 영상으로 정리된 강의가 있으면 좋겠다고 생각했었다. Coursera 또는 Udemy에 블록체인 강의는 있지만 스마트컨트랙트 보안 관련 강의는 없다. 그러던 어느 날 한 트윗을 발견하게 되는데..!twitter
토큰 컨트랙트 만드는 건 Openzepplin wizard를 이용하면 쉽게 만들 수 있다. 토큰 이름과 심볼을 적어주고 입맛에 맞게 Mintable, Burnerble, Ownable에 체크하고 복붙해주면 끝.제공되는 기본 틀의 빈 공간을 채워보자.이제 npm run
일반적인 토큰을 만드는 과제다. 빈 공간을 채워보자.onlyOwner를 사용하기 위해 openzeppelin에서 Ownable을 import 했다. constructor에서 받아오는 \_underlyingToken을 변수에 저장해주고 Ownable를 적용한 mint()
3agle이라는 분이 foundry로 수정된 예제들을 올려줬다. foundry에 목말라 있었는데 너무 잘 됐다는 생각에 감사를 표했다. 가보자고!요런 식으로 작성했다. 다 작성하고 보니 누구나 민팅할 수 있지만 address를 파라미터로 넘겨야 하는 불편함이 있었다.
NFT 마켓플레이스 컨트랙트를 만드는 과제다. 빈 공간을 채워보자!몇 번 삽질 끝에 아래와 같이 컨트랙트를 만들었다.당연한 얘기지만 struct를 만들고 빈 struct를 새로 만들어줘야 사용가능하다.다시 보니까 listedsItems을 전혀 활용하지 않았음. 모범답안
위 컨트랙트 자금을 탈취하면 된다. 숫자를 맞추면 이더를 받을 수 있다. 그런데 block.timestamp, block.number, block.difficulty만 알면 숫자를 맞출 수 있다.이제 공격 컨트랙트를 만들어보자.사실 특별한 건 없고 단지 game 컨트랙
이전과 마찬가지로 컨트랙트를 공격해서 자금을 탈취하면 된다. 대상 컨트랙트는 다음과 같다.이전 블록의 해시값이 짝수인지 홀수인지 5번 연속으로 맞추면 된다.아래는 내가 작성한 컨트랙트다.아래는 모범 답안이다.msg.sender를 설정할 때 payable을 사용했다.나는
아래 컨트랙트의 취약점을 찾아 victim 계정의 이더를 탈취하면 된다. 0.8 버전 이하라서 Over/Underflow 공격이 가능하다.친절하게 중간에 주석으로 힌트가 있다. 예치 기간을 맥시멈으로 늘려서 overflow 공격을 하면 될 것 같다. 바로 테스트 코드를
Task1 아래 컨트랙트 취약점을 찾아서 토큰을 더 많이 가져가면 된다. transfer를 내 주소로 계속 호출하면 될 듯? 테스트코드를 작성해보자. 테스트 코드 작성
attack 컨트랙트를 만들어서 donate() 함수 또는 fallback 함수가 transfer()를 호출할 수 있게 하면 될 것 같다.donate() 함수로 유도해서 0.1이더를 컨트랙트에 받아오면 fallback() 함수가 호출돼서 모든 이더리움을 가져오도록 했다
가장 기본적인 ReEntrancy 공격이 가능한 컨트랙트다.함수 호출 한 번에 예치, 인출 모두 하도록 만들고 이후 이더를 받아오면 계속 인출 함수를 호출하도록 만들었다.attacker에게 5이더를 주고 1이더를 예치시켜서 기존에 예치된 10이더를 빼오도록 만들었다.결
Task1 NFT를 독식해보자. 공격 컨트랙트 짜기 safeMint()의 checkOnERC721Received -> IERC721Receiver(to).onERC721Received() 콜백을 이용해서 ReEntrancy 공격을 하면 될 것 같다.
디파이 컨트랙트에 있는 USDC를 탈취해보자.그런데 현재 checks-effects-interactions 패턴이 아닌 함수는 deposit과 repay 뿐이다. 정작 토큰을 받아서 재호출을 한다고 해도 공격 컨트랙트에서 토큰만 계속 빠져나갈 뿐, 탈취할 수 없다.그렇
onERC1155Received hook을 이용해서 스테이킹 했던 NFT를 언스테이킹할 때 unstake() 함수를 계속 호출하면 같은 id의 NFT를 다 가져올 수 있지 않을까?총 20개의 nft를 반복해서 unstake 하도록 했다. 이후 모든 nft를 가져오면 a
아래 컨트랙트의 이더를 탈취하면 된다.그냥 \_sendETH를 호출하면 되니 패스.토큰을 민팅해보자.onlyOwner modifier를 잘 살펴보면 require문이 없다..! 따라서 modifier는 의미가 없는 수준.통과!이더를 탈취해보자.그냥 withdraw를 호
🦄 Uniswap V2 빈칸들을 채우기 위해서 DEX의 교과서인 유니스왑 V2 컨트랙트를 참고해보자. Figma를 사용해 간단한 다이어그램을 만들어봤다. 유니스왑V2 컨트랙트는 크게 두 가지로 나뉜다. 코어(Core)는 Pair 부분을 담당하고, 주변
유니스왑V2 컨트랙트를 참고해서 빈칸들을 채워보자.문제에서 Router 주소를 제공해줘서 인터페이스를 적용해서 가져온 것 외에 특이한 점은 없다.우선 주석이 나눠져있는지 알았는데 하나였었고, ERC20을 상속했기 때문에 \_transfer와 \_approve를 바로 사
요즘 같은 밈코인 장에 아주 적절한 예제를 만나서 너무 반갑다. 실제 스나이핑 봇에 비하면 허술하겠지만 그래도 만들다보면 얻는 게 많을 것 같다. 유니스왑 코드를 참고해서 아래 빈칸들을 채워보자. snipe() 내가 쓴 답 중간에 amount0Out, amou
나는 내가 재밌어 하는 걸 하고 싶었다. 재미로 시작했던 챌린지도 의무감으로 변해서 결국 중단했고, 어느 순간 목표를 잃은 것 같다는 생각이 들었다. 무언가를 하고 있는 것 같으면서도 결과물은 없는 상황이 반복됐다. 결과물이 없으니 어느 순간 아무것도 하지 않는 나를
!twitternumencyber/status/1664132985883615235Pre-attack tx: https://bscscan.com/tx/0xe2d496ccc3c5fd65a55048391662b8d40ddb5952dc26c715c702ba392915