openzeppelin Ethernaut 해킹 레벨 26: 이중 진입점 OpenZeppelin web3/solidity 기반 게임의 레벨 26입니다. 주어진 계약: player는 CryptoVault에서 버그를 찾아 고갈되는 것을 방지하기 위해 Forta 봇을 만들어야 합니다. 먼저 기본(DET) 토큰을 유출할 수 있는 익스플로잇을 알아봅시다. sweepToken() 메서드를 보면 예상대로 require 검사로 기본 토큰 스윕을 제한하는 것을 볼 수 있습니다. ... ethereumopenzeppelinsoliditysmartcontract ¿El ERC721A es tan bueno como dicen? La coleccion de NFTs de Azuki destaca por su estilo artístico. Pero además de eso trajo a la mesa el ERC721A una una nueva implementación del estándar ERC-721. El objetivo de esta librería es ahorrar gas a los 참가자는 que d... web3azukiopenzeppelin Ethernaut: 0. 안녕 Ethernaut 길지만 엄청나게 교육적인 길이 될 것입니다. help()를 입력하여 시작하십시오! 거기에 표시되는 명령에 익숙해지십시오. 테스트용 에테르도 필요하니 거기에 연결된 수도꼭지를 방문하여 에테르를 얻으십시오! 이것은 모든 퍼즐에 대한 목표 계약이 될 것입니다. 당신은 그것의 소유권을 탈취하고 그것의 균형을 고갈시키는 등 무엇이든 할 것입니다! 나머지 레벨은 contract.info() 를 호출하여... ethereumopenzeppelinsecuritysolidity Ethernaut: 1. 폴백 수신 기능에 결함이 있습니다. 기여를 통해 일부 값을 전송한 다음 수신을 통해 소유자를 변경하기만 하면 됩니다. 기여에는 0.001 이더 미만이 필요하고 수신에는 0보다 큰 것으로 예상됩니다. 계획은 다음과 같습니다. 1위를 기부하겠습니다. 그런 다음 폴백 기능을 통해 컨트랙트 주소로 돈을 보낼 것입니다. 일부 에테르 값으로 계약에 존재하지 않는 함수를 호출하여 이를 수행할 수 있습니다. 이... ethereumopenzeppelinsecuritysolidity Ethernaut: 2. 낙진 constructor 함수 이전에는 컨트랙트와 이름이 같은 함수로 생성자를 사용했습니다. 그러나 만일 생성자 함수의 이름이 다른 경우 공격에 노출될 수 있습니다! 이 경우 이름은 Fallout이지만 함수는 Fal1out로 작성됩니다. 이것은 실제로 에 발생했습니다. 작성자는 처음에 DynamicPyramid를 계약 이름으로 사용했고 따라서 생성자를 사용했습니다. 나중에 그는 계약 이름만 Ru... ethereumopenzeppelinsecuritysolidity Ethernaut: 3. 코인플립 이 공격에서 우리는 계약에서 공격을 호출하여 가정된 "무작위"플립을 추측할 것입니다. 대상 계약은 각 블록에서 동전을 던지도록 프로그래밍되어 있으므로 우리가 추측하는 각 블록은 서로 다른 블록에 있어야 합니다. 계약서에 flip 기능을 복사하여 붙여넣은 다음 결과에 따라 실제 flip 기능을 호출할 수 있습니다. 다음은 항상 정확하게 추측하는 psychicFlip 함수를 사용한 공격 계약입니... ethereumopenzeppelinsecuritysolidity Ethernaut: 4. 전화 tx.origin는 트랜잭션을 생성하는 주소이고 msg.sender는 현재 메시지의 발신자입니다. 따라서 tx.origin == msg.sender는 메시지 발신자가 이더리움 계정이면 참입니다. 또는 메시지 발신자가 계약인 경우 false입니다. 따라서 tx.origin != msg.sender가 대상의 소유자가 되기를 원합니다. 계약을 작성하고 해당 함수를 호출하기만 하면 됩니다.... ethereumopenzeppelinsecuritysolidity Ethernaut: 5. 토큰 이 공격은 정수 오버플로 또는 정수 언더플로 익스플로잇을 사용합니다. 실제로 계산이 부호 없는 정수에서 발생하기 때문에 명령문require(balances[msg.sender] - _value >= 0);은 완전히 잘못되었습니다! 물론 그들은 항상 0보다 크거나 같을 것입니다. 우리는 우리 자신에게 돈을 보내 버그를 악용할 수 없습니다. 왜냐하면 두 줄이 취소되기 때문입니다. 대신, 일부 토... ethereumopenzeppelinsecuritysolidity Ethernaut: 6. 위임 delegatecall는 중요한 함수입니다. 일반적으로 컨트랙트는 을 만들어 기능을 호출합니다. 은 기본적으로 계약의 컨텍스트를 다른 계약으로 전달하고 원하는 대로 수행하도록 하는 보다 전문적인 호출입니다. 이는 스토리지 변수에서 작동할 수 있는 라이브러리를 구현하거나 프록시가 시간이 지남에 따라 다양한 계약에 대리자를 호출하는 업그레이드 가능한 계약이 있는 경우에 유용합니다. delegat... ethereumopenzeppelinsecuritysolidity Ethernaut: 8. 금고 여기서 우리는 황금률을 기억합니다: 블록체인의 모든 것은 모든 사람이 볼 수 있도록 거기에 있으며 항상 거기에 있을 것입니다. 이로써 계약서 작성에 사용된 비밀번호를 알 수 있습니다. 실제로 두 가지 방법이 있습니다. 컨트랙트 생성 트랜잭션을 보고 비밀번호 찾기: 컨트랙트 생성 코드는 컨트랙트 ABI 인코딩과 파라미터로 구성되어 있습니다. 따라서 마지막에 표시되는 일부 숫자는 construc... ethereumopenzeppelinsecuritysolidity Ethernaut: 9. 왕 폰지는 0.001 에테르로 시작합니다. 우리는 더 크거나 동등한 이더를 제공함으로써 게임을 악용할 수 있지만, 이더 수신을 허용하지 않는 계약을 통해 합니다. 이렇게 하면 누군가가 새로운 왕이 될 자격이 있는 경우 상품을 보내려고 할 때 거래가 실패합니다! 계약은 간단합니다. 전달 기능은 보낸 돈을 특정 주소로 전달합니다. 수신 주소는 계약을 msg.sender로 알지만 돈을 돌려 보낼 수는... ethereumopenzeppelinsecuritysolidity Ethernaut: 11. 엘리베이터 이 수준에서는 엘리베이터가 상호 작용하는 계약Builder을 작성할 것입니다. 그러나 동일한 트랜잭션에서 isLastFloor 함수에 대해 반대 부울 결과를 반환합니다. 여기서 문제는 Elevator가 isLastFloor를 view 함수로 지정하지 않았기 때문에 이와 같이 상태를 수정할 수 없다는 것입니다. 또 다른 공격 방식은 via gasLeft() 와 같이 상태를 수정하지 않고 입력 ... ethereumopenzeppelinsecuritysolidity Ethernaut: 10. 재진입 Solidity에는 이라는 패턴이 있습니다. 원래: 1. 잔액 확인과 같은 작업을 수행할 수 있는지 확인합니다. 2. 잔액 업데이트와 같이 계약에 미치는 영향을 적용합니다. 3. 돈을 이체하는 것과 같이 다른 사람과 실제 상호 작용을 체인에서 수행합니다. 이 경우 함수는 withdraw이지만 상호작용이 효과보다 먼저 옵니다. 이것은 우리가 withdraw 내에서 돈을 받을 때 프로그램이 wi... ethereumopenzeppelinsecuritysolidity Ethernaut: 13. 게이트키퍼 원 이전 퍼즐에서 우리는 msg.sender가 계약일 수 있는 트랜잭션의 즉각적인 발신자임을 배웠습니다. 여기서 트랜잭션에 사용되는 가스를 조정해야 합니다. 우리는 에테르 값을 지정하는 방법과 유사하게 전달할 가스를 지정하여 이를 수행할 수 있습니다: foo{gas: ...}() . 그때까지 얼마나 많은 가스를 갖게 될지 정확히 알 수 없기 때문입니다. 우리가 할 수 있는 일은 다음과 같습니다.... ethereumopenzeppelinsecuritysolidity Ethernaut: 12. 프라이버시 EVM은 상태 변수를 32바이트 청크로 저장합니다. 연속 변수가 32바이트 공간을 구성하는 경우(예: 이 경우 8 + 8 + 16 = 32) 동일한 청크에 저장됩니다. await web3.eth.getStorageAt(contract.address, i)의 다음 값에 대해 i의 결과를 확인합니다. 1: 0x000000000000000000000000000000000000000000000000... ethereumopenzeppelinsecuritysolidity Ethernaut: 14. 게이트키퍼 2 통과해야 할 또 다른 게이트 퍼즐이 있습니다! 다시 세 개의 게이트가 있습니다. 심플 msg.sender != tx.origin . 인라인 어셈블리를 통한 귀여운 extcodesize 호출. 일련의 require는 게이트 키가 어떤 것인지 알려줍니다. 이전 퍼즐과 마찬가지로 계약을 중개인으로 사용하십시오. extcodesize는 기본적으로 주어진 주소의 코드 크기를 반환하며 이 경우 호출자입... ethereumopenzeppelinsecuritysolidity Ethernaut: 15. Naught 코인 여기 우리 손에 간단한 ERC-20 계약이 있어 누군가에게 돈을 transfer 주지 않습니다. 그러나 이것은 우리가 approve 그 누군가를 막지 못하고 그들이 transferFrom에 전화하여 우리 돈을 가져가도록 합니다. 그것이 바로 우리가 할 일입니다. 간단한 계약을 생성하고 배포합니다. 그런 다음 이 주소에 대한 모든 토큰을 승인하고 해당 매개변수로 withdrawFrom를 호출합... ethereumopenzeppelinsecuritysolidity Ethernaut: 16. 보존 여기서 우리는 전능자의 손 안에 있습니다delegatecall . 주어진 계약은 실제로 6단계(위임)에서 익스플로잇으로 사용한 버그로 인해 어려움을 겪고 있습니다. setFirstTime를 호출하면 실제로 timeZone1Library 저장 변수의 값을 덮어씁니다! 우리가 하는 일은 다음과 같습니다. 서명이 setTime(uint256)인 기능이 있는 계약을 만듭니다. 이 계약에는 호출자의 ... ethereumopenzeppelinsecuritysolidity Ethernaut: 17. 복구 거기에서 우리는 "잃어버린"계약 주소를 아주 잘 볼 수 있고 거기에서 destroy 함수를 호출할 것입니다. 인수가 있는 함수를 호출하려면 calldata를 제공해야 합니다( 참조). 인수는 32바이트 단위로 제공되지만 calldata의 처음 4바이트는 호출할 함수를 나타냅니다. 여러 가지 방법으로 찾을 수 있습니다. 위의 방법 중 하나를 사용하면 함수 선택기가 0x00f55d9d 임을 알 ... ethereumopenzeppelinsecuritysolidity Ethernaut: 18. 매직 넘버 이 수준에서 우리는 10개의 opcode로 42를 반환하는 계약을 작성해야 합니다. 따라서 어떻게든 거기에 자체 어셈블리를 작성해야 합니다. 계약 생성 코드는 초기화 코드와 런타임 코드의 두 부분으로 구성됩니다. CTRL+F를 눌러 "return"을 검색하고 먼저 opcode: RETURN <offset> <length>를 확인합니다. 따라서 먼저 메모리에 42를 저장해야 합니다. CTRL+... ethereumopenzeppelinsecuritysolidity Ethernaut: 20. 거부 이 수준에서 익스플로잇은 call 기능과 관련이 있습니다: partner.call{value:amountToSend}("") . 여기서 call는 빈 msg.data 및 amountToSend 값으로 파트너 주소에 만들어집니다. call를 사용할 때 전달할 가스의 양을 지정하지 않으면 모든 것을 전달합니다! 주석 라인에서 알 수 있듯이 호출을 되돌려도 실행에 영향을 주지 않지만 해당 호출에서... ethereumopenzeppelinsecuritysolidity Ethernaut: 19. 외계인 코덱스 문제는 계약의 소유자를 변경하기 위해 codex 배열을 어떻게든 사용하도록 암시하고 있습니다. 사실, retract는 의심스러울 정도로 위험하며 실제로 배열 길이를 언더플로할 수 있습니다!. 배열 길이는 uint256 이며 일단 언더플로우되면 기본적으로 전체 계약 스토리지(모든 2 ^ 256 - 1 슬롯)를 배열의 일부로 "가집니다". 결과적으로 해당 배열로 메모리의 모든 항목을 인덱싱할 수... ethereumopenzeppelinsecuritysolidity Ethernaut: 21. 쇼핑하기 우리는 Elevator 레벨에서 비슷한 퍼즐을 겪었습니다. 단일 트랜잭션에서 다른 것을 반환하는 함수가 필요합니다. 가장 기본적인 솔루션은 이를 확인하고gasLeft() 이를 기반으로 다른 결과를 반환하는 것이지만 여기에는 더 깨끗한 솔루션이 있습니다. 위에서 언급했듯이 isSold의 값을 쿼리하고 이를 기반으로 다른 결과를 반환할 수 있습니다. Shop 계약과 구매자 인터페이스를 제공한다고... ethereumopenzeppelinsecuritysolidity Ethernaut: 23. 덱스 2 여기에 이전 수준과 유사한 또 다른 DEX가 있지만 두 토큰이 모두 고갈되어야 합니다. swap 함수에는 미묘하지만 중요한 차이점이 하나 있는데, 토큰 주소의 유효성을 확인하지 않는다는 것입니다! 이전 항목에서는 require 및 from 토큰이 모두 DEX가 담당하는 토큰인지 확인하는 to 문이 있었습니다. 이것은 우리에게 공격에 대한 아이디어를 제공하고, 우리 자신의 토큰을 생성하고 어떻... ethereumopenzeppelinsecuritysolidity Ethernaut: 22. 덱스 원 이 수준에는 탈중앙화 거래소(DEX) 계약이 있습니다. 제 경우에는 DEX의 두 토큰입니다. 토큰 1: 토큰 2: 두 토큰이 모두 있는지 확인할 수 있습니다. 우리는 "계약에서 2개의 토큰 중 적어도 1개를 모두 빼내고 계약이 자산의 나쁜 가격을 보고하도록 허용"하라는 요청을 받았습니다. 그런 다음 스왑 기능에 대해 자세히 살펴보겠습니다. 지금까지 명백한 공격 벡터가 없으므로 스와핑 공식에 ... ethereumopenzeppelinsecuritysolidity Ethernaut: 24. 퍼즐 지갑 은 로직과 메인 컨트랙트 사이의 일종의 중개자로서, 메인 컨트랙트에 해당 로직을 작성하여 업그레이드할 수 없는 대신 다른 컨트랙트에 작성하고 프록시 포인트를 만듭니다. 가장 먼저 알 수 있는 것은 프록시와 논리 사이에 저장소 충돌이 있다는 것입니다. whitelisted (지도) balances (지도) maxBalance를 업데이트하려면 지갑 잔액이 0이어야 하고 msg.sender가 화이... ethereumopenzeppelinsecuritysolidity Ethernaut: 25. 오토바이 여기에 또 다른 프록시 기반 퍼즐이 있습니다. 이번에는 이 사용된 것을 볼 수 있는데, 이는 스토리지 충돌에 대해 안전하다는 것을 의미합니다. 이 표준에 따라 논리 계약은 bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1) 에 저장되며 코드에서도 볼 수 있습니다. Motorbike 컨트랙트를 살펴보면 엔진 컨트랙트의 논리를 가진 ... ethereumopenzeppelinsecuritysolidity Ethernaut 27: 선한 사마리아인 선한 사마리아인 계약의 동전을 고갈하라는 요청을 받았습니다. 선한 사마리아인이 되는 이유는 무엇입니까? 글쎄요, 그것은 수 톤의 동전을 가지고 있고 그것을 기부할 의향이 있습니다. 하지만 한 번에 10개만. 계약의 100만 코인을 모두 소진하려면 한 번에 10개 이상을 가져와야 합니다. 고맙게도 이 수준의 작성자는 문자 그대로 댓글에서 requestDonation 기능 아래에 다음과 같은 단... ethereumopenzeppelinsecuritysolidity Ethernaut 해킹 레벨 25: 오토바이 OpenZeppelin web3/solidity 기반 게임의 레벨 24입니다. Solidity 의 기능 주어진 계약: player 는 Motorbike 를 통해 구현/논리 계약( Engine )을 파기하여 프록시( selfdestruct )를 사용할 수 없도록 해야 합니다. 따라서 현재 구현에서는 selfdestruct를 호출할 수 없습니다. 하지만 프록시 패턴의 로직/구현 컨트랙트이기 때문... smartcontractethereumsolidityopenzeppelin 이전 기사 보기
Ethernaut 해킹 레벨 26: 이중 진입점 OpenZeppelin web3/solidity 기반 게임의 레벨 26입니다. 주어진 계약: player는 CryptoVault에서 버그를 찾아 고갈되는 것을 방지하기 위해 Forta 봇을 만들어야 합니다. 먼저 기본(DET) 토큰을 유출할 수 있는 익스플로잇을 알아봅시다. sweepToken() 메서드를 보면 예상대로 require 검사로 기본 토큰 스윕을 제한하는 것을 볼 수 있습니다. ... ethereumopenzeppelinsoliditysmartcontract ¿El ERC721A es tan bueno como dicen? La coleccion de NFTs de Azuki destaca por su estilo artístico. Pero además de eso trajo a la mesa el ERC721A una una nueva implementación del estándar ERC-721. El objetivo de esta librería es ahorrar gas a los 참가자는 que d... web3azukiopenzeppelin Ethernaut: 0. 안녕 Ethernaut 길지만 엄청나게 교육적인 길이 될 것입니다. help()를 입력하여 시작하십시오! 거기에 표시되는 명령에 익숙해지십시오. 테스트용 에테르도 필요하니 거기에 연결된 수도꼭지를 방문하여 에테르를 얻으십시오! 이것은 모든 퍼즐에 대한 목표 계약이 될 것입니다. 당신은 그것의 소유권을 탈취하고 그것의 균형을 고갈시키는 등 무엇이든 할 것입니다! 나머지 레벨은 contract.info() 를 호출하여... ethereumopenzeppelinsecuritysolidity Ethernaut: 1. 폴백 수신 기능에 결함이 있습니다. 기여를 통해 일부 값을 전송한 다음 수신을 통해 소유자를 변경하기만 하면 됩니다. 기여에는 0.001 이더 미만이 필요하고 수신에는 0보다 큰 것으로 예상됩니다. 계획은 다음과 같습니다. 1위를 기부하겠습니다. 그런 다음 폴백 기능을 통해 컨트랙트 주소로 돈을 보낼 것입니다. 일부 에테르 값으로 계약에 존재하지 않는 함수를 호출하여 이를 수행할 수 있습니다. 이... ethereumopenzeppelinsecuritysolidity Ethernaut: 2. 낙진 constructor 함수 이전에는 컨트랙트와 이름이 같은 함수로 생성자를 사용했습니다. 그러나 만일 생성자 함수의 이름이 다른 경우 공격에 노출될 수 있습니다! 이 경우 이름은 Fallout이지만 함수는 Fal1out로 작성됩니다. 이것은 실제로 에 발생했습니다. 작성자는 처음에 DynamicPyramid를 계약 이름으로 사용했고 따라서 생성자를 사용했습니다. 나중에 그는 계약 이름만 Ru... ethereumopenzeppelinsecuritysolidity Ethernaut: 3. 코인플립 이 공격에서 우리는 계약에서 공격을 호출하여 가정된 "무작위"플립을 추측할 것입니다. 대상 계약은 각 블록에서 동전을 던지도록 프로그래밍되어 있으므로 우리가 추측하는 각 블록은 서로 다른 블록에 있어야 합니다. 계약서에 flip 기능을 복사하여 붙여넣은 다음 결과에 따라 실제 flip 기능을 호출할 수 있습니다. 다음은 항상 정확하게 추측하는 psychicFlip 함수를 사용한 공격 계약입니... ethereumopenzeppelinsecuritysolidity Ethernaut: 4. 전화 tx.origin는 트랜잭션을 생성하는 주소이고 msg.sender는 현재 메시지의 발신자입니다. 따라서 tx.origin == msg.sender는 메시지 발신자가 이더리움 계정이면 참입니다. 또는 메시지 발신자가 계약인 경우 false입니다. 따라서 tx.origin != msg.sender가 대상의 소유자가 되기를 원합니다. 계약을 작성하고 해당 함수를 호출하기만 하면 됩니다.... ethereumopenzeppelinsecuritysolidity Ethernaut: 5. 토큰 이 공격은 정수 오버플로 또는 정수 언더플로 익스플로잇을 사용합니다. 실제로 계산이 부호 없는 정수에서 발생하기 때문에 명령문require(balances[msg.sender] - _value >= 0);은 완전히 잘못되었습니다! 물론 그들은 항상 0보다 크거나 같을 것입니다. 우리는 우리 자신에게 돈을 보내 버그를 악용할 수 없습니다. 왜냐하면 두 줄이 취소되기 때문입니다. 대신, 일부 토... ethereumopenzeppelinsecuritysolidity Ethernaut: 6. 위임 delegatecall는 중요한 함수입니다. 일반적으로 컨트랙트는 을 만들어 기능을 호출합니다. 은 기본적으로 계약의 컨텍스트를 다른 계약으로 전달하고 원하는 대로 수행하도록 하는 보다 전문적인 호출입니다. 이는 스토리지 변수에서 작동할 수 있는 라이브러리를 구현하거나 프록시가 시간이 지남에 따라 다양한 계약에 대리자를 호출하는 업그레이드 가능한 계약이 있는 경우에 유용합니다. delegat... ethereumopenzeppelinsecuritysolidity Ethernaut: 8. 금고 여기서 우리는 황금률을 기억합니다: 블록체인의 모든 것은 모든 사람이 볼 수 있도록 거기에 있으며 항상 거기에 있을 것입니다. 이로써 계약서 작성에 사용된 비밀번호를 알 수 있습니다. 실제로 두 가지 방법이 있습니다. 컨트랙트 생성 트랜잭션을 보고 비밀번호 찾기: 컨트랙트 생성 코드는 컨트랙트 ABI 인코딩과 파라미터로 구성되어 있습니다. 따라서 마지막에 표시되는 일부 숫자는 construc... ethereumopenzeppelinsecuritysolidity Ethernaut: 9. 왕 폰지는 0.001 에테르로 시작합니다. 우리는 더 크거나 동등한 이더를 제공함으로써 게임을 악용할 수 있지만, 이더 수신을 허용하지 않는 계약을 통해 합니다. 이렇게 하면 누군가가 새로운 왕이 될 자격이 있는 경우 상품을 보내려고 할 때 거래가 실패합니다! 계약은 간단합니다. 전달 기능은 보낸 돈을 특정 주소로 전달합니다. 수신 주소는 계약을 msg.sender로 알지만 돈을 돌려 보낼 수는... ethereumopenzeppelinsecuritysolidity Ethernaut: 11. 엘리베이터 이 수준에서는 엘리베이터가 상호 작용하는 계약Builder을 작성할 것입니다. 그러나 동일한 트랜잭션에서 isLastFloor 함수에 대해 반대 부울 결과를 반환합니다. 여기서 문제는 Elevator가 isLastFloor를 view 함수로 지정하지 않았기 때문에 이와 같이 상태를 수정할 수 없다는 것입니다. 또 다른 공격 방식은 via gasLeft() 와 같이 상태를 수정하지 않고 입력 ... ethereumopenzeppelinsecuritysolidity Ethernaut: 10. 재진입 Solidity에는 이라는 패턴이 있습니다. 원래: 1. 잔액 확인과 같은 작업을 수행할 수 있는지 확인합니다. 2. 잔액 업데이트와 같이 계약에 미치는 영향을 적용합니다. 3. 돈을 이체하는 것과 같이 다른 사람과 실제 상호 작용을 체인에서 수행합니다. 이 경우 함수는 withdraw이지만 상호작용이 효과보다 먼저 옵니다. 이것은 우리가 withdraw 내에서 돈을 받을 때 프로그램이 wi... ethereumopenzeppelinsecuritysolidity Ethernaut: 13. 게이트키퍼 원 이전 퍼즐에서 우리는 msg.sender가 계약일 수 있는 트랜잭션의 즉각적인 발신자임을 배웠습니다. 여기서 트랜잭션에 사용되는 가스를 조정해야 합니다. 우리는 에테르 값을 지정하는 방법과 유사하게 전달할 가스를 지정하여 이를 수행할 수 있습니다: foo{gas: ...}() . 그때까지 얼마나 많은 가스를 갖게 될지 정확히 알 수 없기 때문입니다. 우리가 할 수 있는 일은 다음과 같습니다.... ethereumopenzeppelinsecuritysolidity Ethernaut: 12. 프라이버시 EVM은 상태 변수를 32바이트 청크로 저장합니다. 연속 변수가 32바이트 공간을 구성하는 경우(예: 이 경우 8 + 8 + 16 = 32) 동일한 청크에 저장됩니다. await web3.eth.getStorageAt(contract.address, i)의 다음 값에 대해 i의 결과를 확인합니다. 1: 0x000000000000000000000000000000000000000000000000... ethereumopenzeppelinsecuritysolidity Ethernaut: 14. 게이트키퍼 2 통과해야 할 또 다른 게이트 퍼즐이 있습니다! 다시 세 개의 게이트가 있습니다. 심플 msg.sender != tx.origin . 인라인 어셈블리를 통한 귀여운 extcodesize 호출. 일련의 require는 게이트 키가 어떤 것인지 알려줍니다. 이전 퍼즐과 마찬가지로 계약을 중개인으로 사용하십시오. extcodesize는 기본적으로 주어진 주소의 코드 크기를 반환하며 이 경우 호출자입... ethereumopenzeppelinsecuritysolidity Ethernaut: 15. Naught 코인 여기 우리 손에 간단한 ERC-20 계약이 있어 누군가에게 돈을 transfer 주지 않습니다. 그러나 이것은 우리가 approve 그 누군가를 막지 못하고 그들이 transferFrom에 전화하여 우리 돈을 가져가도록 합니다. 그것이 바로 우리가 할 일입니다. 간단한 계약을 생성하고 배포합니다. 그런 다음 이 주소에 대한 모든 토큰을 승인하고 해당 매개변수로 withdrawFrom를 호출합... ethereumopenzeppelinsecuritysolidity Ethernaut: 16. 보존 여기서 우리는 전능자의 손 안에 있습니다delegatecall . 주어진 계약은 실제로 6단계(위임)에서 익스플로잇으로 사용한 버그로 인해 어려움을 겪고 있습니다. setFirstTime를 호출하면 실제로 timeZone1Library 저장 변수의 값을 덮어씁니다! 우리가 하는 일은 다음과 같습니다. 서명이 setTime(uint256)인 기능이 있는 계약을 만듭니다. 이 계약에는 호출자의 ... ethereumopenzeppelinsecuritysolidity Ethernaut: 17. 복구 거기에서 우리는 "잃어버린"계약 주소를 아주 잘 볼 수 있고 거기에서 destroy 함수를 호출할 것입니다. 인수가 있는 함수를 호출하려면 calldata를 제공해야 합니다( 참조). 인수는 32바이트 단위로 제공되지만 calldata의 처음 4바이트는 호출할 함수를 나타냅니다. 여러 가지 방법으로 찾을 수 있습니다. 위의 방법 중 하나를 사용하면 함수 선택기가 0x00f55d9d 임을 알 ... ethereumopenzeppelinsecuritysolidity Ethernaut: 18. 매직 넘버 이 수준에서 우리는 10개의 opcode로 42를 반환하는 계약을 작성해야 합니다. 따라서 어떻게든 거기에 자체 어셈블리를 작성해야 합니다. 계약 생성 코드는 초기화 코드와 런타임 코드의 두 부분으로 구성됩니다. CTRL+F를 눌러 "return"을 검색하고 먼저 opcode: RETURN <offset> <length>를 확인합니다. 따라서 먼저 메모리에 42를 저장해야 합니다. CTRL+... ethereumopenzeppelinsecuritysolidity Ethernaut: 20. 거부 이 수준에서 익스플로잇은 call 기능과 관련이 있습니다: partner.call{value:amountToSend}("") . 여기서 call는 빈 msg.data 및 amountToSend 값으로 파트너 주소에 만들어집니다. call를 사용할 때 전달할 가스의 양을 지정하지 않으면 모든 것을 전달합니다! 주석 라인에서 알 수 있듯이 호출을 되돌려도 실행에 영향을 주지 않지만 해당 호출에서... ethereumopenzeppelinsecuritysolidity Ethernaut: 19. 외계인 코덱스 문제는 계약의 소유자를 변경하기 위해 codex 배열을 어떻게든 사용하도록 암시하고 있습니다. 사실, retract는 의심스러울 정도로 위험하며 실제로 배열 길이를 언더플로할 수 있습니다!. 배열 길이는 uint256 이며 일단 언더플로우되면 기본적으로 전체 계약 스토리지(모든 2 ^ 256 - 1 슬롯)를 배열의 일부로 "가집니다". 결과적으로 해당 배열로 메모리의 모든 항목을 인덱싱할 수... ethereumopenzeppelinsecuritysolidity Ethernaut: 21. 쇼핑하기 우리는 Elevator 레벨에서 비슷한 퍼즐을 겪었습니다. 단일 트랜잭션에서 다른 것을 반환하는 함수가 필요합니다. 가장 기본적인 솔루션은 이를 확인하고gasLeft() 이를 기반으로 다른 결과를 반환하는 것이지만 여기에는 더 깨끗한 솔루션이 있습니다. 위에서 언급했듯이 isSold의 값을 쿼리하고 이를 기반으로 다른 결과를 반환할 수 있습니다. Shop 계약과 구매자 인터페이스를 제공한다고... ethereumopenzeppelinsecuritysolidity Ethernaut: 23. 덱스 2 여기에 이전 수준과 유사한 또 다른 DEX가 있지만 두 토큰이 모두 고갈되어야 합니다. swap 함수에는 미묘하지만 중요한 차이점이 하나 있는데, 토큰 주소의 유효성을 확인하지 않는다는 것입니다! 이전 항목에서는 require 및 from 토큰이 모두 DEX가 담당하는 토큰인지 확인하는 to 문이 있었습니다. 이것은 우리에게 공격에 대한 아이디어를 제공하고, 우리 자신의 토큰을 생성하고 어떻... ethereumopenzeppelinsecuritysolidity Ethernaut: 22. 덱스 원 이 수준에는 탈중앙화 거래소(DEX) 계약이 있습니다. 제 경우에는 DEX의 두 토큰입니다. 토큰 1: 토큰 2: 두 토큰이 모두 있는지 확인할 수 있습니다. 우리는 "계약에서 2개의 토큰 중 적어도 1개를 모두 빼내고 계약이 자산의 나쁜 가격을 보고하도록 허용"하라는 요청을 받았습니다. 그런 다음 스왑 기능에 대해 자세히 살펴보겠습니다. 지금까지 명백한 공격 벡터가 없으므로 스와핑 공식에 ... ethereumopenzeppelinsecuritysolidity Ethernaut: 24. 퍼즐 지갑 은 로직과 메인 컨트랙트 사이의 일종의 중개자로서, 메인 컨트랙트에 해당 로직을 작성하여 업그레이드할 수 없는 대신 다른 컨트랙트에 작성하고 프록시 포인트를 만듭니다. 가장 먼저 알 수 있는 것은 프록시와 논리 사이에 저장소 충돌이 있다는 것입니다. whitelisted (지도) balances (지도) maxBalance를 업데이트하려면 지갑 잔액이 0이어야 하고 msg.sender가 화이... ethereumopenzeppelinsecuritysolidity Ethernaut: 25. 오토바이 여기에 또 다른 프록시 기반 퍼즐이 있습니다. 이번에는 이 사용된 것을 볼 수 있는데, 이는 스토리지 충돌에 대해 안전하다는 것을 의미합니다. 이 표준에 따라 논리 계약은 bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1) 에 저장되며 코드에서도 볼 수 있습니다. Motorbike 컨트랙트를 살펴보면 엔진 컨트랙트의 논리를 가진 ... ethereumopenzeppelinsecuritysolidity Ethernaut 27: 선한 사마리아인 선한 사마리아인 계약의 동전을 고갈하라는 요청을 받았습니다. 선한 사마리아인이 되는 이유는 무엇입니까? 글쎄요, 그것은 수 톤의 동전을 가지고 있고 그것을 기부할 의향이 있습니다. 하지만 한 번에 10개만. 계약의 100만 코인을 모두 소진하려면 한 번에 10개 이상을 가져와야 합니다. 고맙게도 이 수준의 작성자는 문자 그대로 댓글에서 requestDonation 기능 아래에 다음과 같은 단... ethereumopenzeppelinsecuritysolidity Ethernaut 해킹 레벨 25: 오토바이 OpenZeppelin web3/solidity 기반 게임의 레벨 24입니다. Solidity 의 기능 주어진 계약: player 는 Motorbike 를 통해 구현/논리 계약( Engine )을 파기하여 프록시( selfdestruct )를 사용할 수 없도록 해야 합니다. 따라서 현재 구현에서는 selfdestruct를 호출할 수 없습니다. 하지만 프록시 패턴의 로직/구현 컨트랙트이기 때문... smartcontractethereumsolidityopenzeppelin 이전 기사 보기