목록전체 글 (72)
Tyojong
문제 설명코드 분석Building이라는 인터페이스를 생성해 isLastFloor라는 함수를 가져와 사용한다. goTo함수를 호출한 주소에 대해 인터페이스를 생성한다.해당 인터페이스의 isLastFloor함수가 false를 반환한다면isLastFloor의 반환값을 top변수에 넣는다. 익스플로잇goTo함수를 호출한 대상으로 인터페이스를 생성해 isLastFloor 함수를 가져오기 때문에공격 컨트랙트에 isLastFloor함수를 만들어 공격 컨트랙트에서 문제 컨트랙트의 goTo함수를 호출하게 되면 내가 원하는 기능의 isLastFloor함수를 호출 할 수 있다. 문제를 해결하기 위해서는 top변수가 true가 되어야 하는데 isLastFloor함수가 false를 반환해야 isLastFloor의 반환값을 to..
http://www.wechall.netidemailscore"; $rows = mysqli_query($db,$query); while(($result = mysqli_fetch_array($rows))){ if($result['id'] == "admin") $result['email'] = "**************"; echo "{$result[id]}{$result[email]}{$result[score]}"; } echo "query : {$query}"; $_GET[email] = addslashes($_GET[email]); $query = "select email from prob_evil_wizard where id='admin' and email='{$_GET[e..
idemailscore"; $rows = mysqli_query($db,$query); while(($result = mysqli_fetch_array($rows))){ if($result['id'] == "admin") $result['email'] = "**************"; echo "{$result[id]}{$result[email]}{$result[score]}"; } echo "query : {$query}"; $_GET[email] = addslashes($_GET[email]); $query = "select email from prob_hell_fire where id='admin' and email='{$_GET[email]}'"; $result = @my..
문제 설명코드 분석_to에게 msg.value만큼 잔액을 추가한다.또한 payable을 사용해 msg.value만큼의 이더를 컨트랙트에 저장한다. 인자로 받은 사용자의 잔액을 출력한다. 인출 기능이다. 인자로 받은 _amount값이 잔액보다 작거나 같으면사용자에게 _amount만큼 이더를 전송하고잔액에서 _amount만큼 차감한다. 익스플로잇withdraw코드를 확인해보면잔액을 확인한 후 msg.sender.call을 사용해 이더를 전송한 후 잔액을 차감한다.잔액이 차감되기 전에 다시 한 번 더 withdraw가 호출된다면 계속해서 돈을 인출할 수 있다. 문제 컨트랙트의 이더를 cast balance 명령어를 이용해 확인해보면 0.001 ether가 들어있는 것을 알 수 있다. // SPDX-Licens..
query : {$query}"; $_GET[pw] = addslashes($_GET[pw]); $query = "select pw from prob_dark_eyes where id='admin' and pw='{$_GET[pw]}'"; $result = @mysqli_fetch_array(mysqli_query($db,$query)); if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("dark_eyes"); highlight_file(__FILE__);?> 문제 목표if(preg_match('/col|if|case|when|sleep|benchmark/i', $_GET[pw])) exit("HeHe");if, case 와 같은 조..
query : {$query}"; $_GET[pw] = addslashes($_GET[pw]); $query = "select pw from prob_iron_golem where id='admin' and pw='{$_GET[pw]}'"; $result = @mysqli_fetch_array(mysqli_query($db,$query)); if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("iron_golem"); highlight_file(__FILE__);?> 문제 목표if(preg_match('/sleep|benchmark/i', $_GET[pw])) exit("HeHe");sleep과 benchmark가 필터링되므로 time ..
문제 설명코드 분석초기 owner, prize, king을 설정한다. 컨트랙트가 이더를 받으면 받은 이더가 prize보다 크거나 같은지 비교하고기존 king의 주소로 받은 이더를 보낸다.이후 king은 이더를 보낸 대상으로 설정되고prize도 보낸 이더 크기만큼 다시 설정된다. 익스플로잇문제 설명을 보면 인스턴스 제출 시 왕을 다시 얻는 시도를 한다고 작성되어있다.문제 코드를 보면 새로운 왕이 설정되면 이더를 이전 왕에게 전송한다. 1. 만약 공격 컨트랙트를 이용해 문제 컨트랙트를 이더와 함께 호출하면2. msg.sender로 인해 왕은 공격 컨트랙트로 설정되고3. 다른 사용자가 새로운 왕으로 선정될 때 이더를 공격 컨트랙트로 전송하게 된다.4. 이때 공격 컨트랙트가 이더를 받지 않도록 설정되면 reve..
query : {$query}"; $result = @mysqli_fetch_array(mysqli_query($db,$query)); if($result['id']) echo "Hello {$result[id]}"; if($result['id'] == 'admin') solve("dragon"); highlight_file(__FILE__); ?> 문제 목표$query = "select id from prob_dragon where id='guest'# and pw='{$_GET[pw]}'";where문 id값 뒤에는 주석처리가 된다.if($result['id'] == 'admin') solve("dragon");id가 admin이면 문제가 해결된다. 문제 해결#은 mysql에서 한 줄 주..
문제 설명코드 분석문제 컨트랙트 배포 시 설정된 패스워드와 일치하는 패스워드를 unlock함수 인자로 넣으면 금고의 잠금이 해제된다.익스플로잇password 변수가 private로 선언되어 있지만 private은 단순히 다른 컨트랙트에서 접근을 막을 뿐, 외부에서 직접 스토리지를 조회하는 것은 막지 못한다. cast storage 명령어를 사용해 storage 슬롯을 읽는다. (슬롯0: locked, 슬롯1: password) 알아낸 패스워드를 unlock함수의 인자로 넣고 실행시키면 문제를 해결할 수 있다.
문제 설명코드 분석이번 문제의 컨트랙트 코드를 보면 이더를 받기 위한 함수가 정의되지 않았다. 원래 컨트랙트에서는 이더를 받기 위해 receive() 함수, fallback() 함수, payable 함수를 사용해야한다.해당 함수들을 사용하지 않는 컨트랙트에 이더를 보내면 해당 트랜잭션은 revert된다.Selfdestructselfdestruct는 solidity에서 스마트 컨트랙트를 블록체인에서 제거하고, 남은 이더를 지정된 주소로 강제 전송하는 함수이다.이 함수를 사용하게 되면 컨트랙트의 어떤 코드도 실행하지 않고 강제로 이더를 전송하게 된다. receive나 fallback이 없어도, 이더 수신을 거부하는 로직이 있어도 강제로 받게 된다.익스플로잇공격 컨트랙트를 생성하여 selfdesturct를 이..
