목록2026/01/26 (2)
Tyojong
문제 설명코드 설명호출한 사용자의 잔액에서 _.value 만큼 _to에게 토큰을 전송한다.보내는 토큰은 잔액보다 많지 않아야 하고 _value값 만큼 사용자의 잔액에서 차감되며 _to의 잔액이 증가한다.익스플로잇solidity 0.6 버전에서는 언더플로우체크가 존재하지 않는다.balances[msg.sender] (사용자의 잔액) 보다 _value값이 크면 뺄셈 이후 음수가 되어야 하지만 uint의 경우 음수가 불가능하므로 언더플로우가 발생하게 된다. 사용자의 잔액이 20토큰으로 주어졌기 때문에 20보다 큰 값을 _value인자로 전달하면 된다. 문제 컨트랙트 transfer함수에 아무 주소와 21을 인자로 주면 문제가 해결된다.
문제 설명코드 분석이전 블록해시값과 FACTOR를 나눈 몫이 1이면 true값 아니면 false값을 반환하여_guess로 받은 bool값과 일치하면 consecutiveWins값이 1증가하고 틀리면 0으로 초기화된다. 이더리움에서 블록은 12초에 하나씩 생성되는데 하나의 블록에서 12초안에 10번의 트랜잭션을 보내면 모두 맞거나, 모두 틀리거나 50% 확률로 성공할 수 있는 가능성이 있다.때문에 문제에서는 이를 방지하기 위해 이전 트랜잭션에서 사용한 블록 해시와 현재 트랜잭션의 블록 해시를 비교해 일치하면 revert시켜 모두 다른 트랜잭션에서 시도하도록 만들었다.익스플로잇EOA(사용자)가 CA1(공격 컨트랙트)를 실행하고 CA1이 CA2(문제 컨트랙트)를 실행하면 이 과정은 하나의 트랜잭션으로 실행된다..
