목록전체 글 (71)
Tyojong
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를 이..
문제 설명코드 분석Delegate 컨트랙트는 배포 시 owner가 정해지지만 pwn() 함수를 이용해 owner를 호출한 사용자로 변경할 수 있다. Delegation 컨트랙트는 배포시 호출한 사용자가 owner로 지정된다.fallback() 함수는 컨트랙트에 존재하지 않는 함수를 호출할 경우 실행된다. fallback() 함수에서는 address(delegate)를 통해 위 Delegate 컨트랙트를 불러온다.Delegate컨트랙트의 함수를 delegatecall을 이용해 호출한다.call vs delegatecallCA1에서 CA2의 함수를 call로 호출하면 CA2의 storage를 이용하지만CA1에서 CA2의 함수를 delegatecall로 호출하면 CA1의 storage를 이용하게 된다. del..
