스마트컨트랙트에서 코인 훔치기 #2
[요약]
잔고가 일정 범위 이상이어야 인출할 수 있는 스마트컨트랙트가 있다.
현재 스마트컨트랙트의 잔고는 0.5 eth
인출 조건은 잔고가 1.0 eth 이상이 되어야 하는데
이 스마트컨트랙트에는 메타마스크로는 이더리움을 전송할 수 없다.
이 스마트 컨트랙트의 이더를 인출해보자.
타켓 스마트컨트랙트 코드
pragma solidity 0.8.6;
contract Test7 {
constructor() payable {
}
function withdraw() public {
require(address(this).balance >= 1 ether);
payable(msg.sender).transfer(address(this).balance);
}
}
스마트 컨트랙트 Test7 배포
잔고는 500 피니[finney] = 0.5 eth로
리믹스에서 배포.
스마트컨트랙트의 현재 잔고는 0.5 eth
잔고를 1.0 eth 이상으로 만들어야
컨트랙트의 모든 잔고를 가져올 수 있다.
- 시도 01
메타마스크를 이용해 직접 전송!
잔고를 1.0 eth로 만들기 위해
메타마스크로 0.5 eth 전송시도.
전송을 할 수 없다.
스마트컨트랙트 코드에는
fallback 함수가 없으므로
직접 이더를 보낼 수 가 없다.
- 시도 02
또 다른 스마트컨트랙트 Test8를 작성하고
destroy 시켜 강제로 타겟 스마트컨트랙트인 Test7로
이더리움이 전송되게 만든다.
pragma solidity 0.8.6;
contract Test8 {
constructor() payable {
}
function destroy() public {
selfdestruct(payable(msg.sender));
}
}
Test8 스마트컨트랙트에
0.5 이더를 넣고
destroy 함수를 실행 시키면
msg.sender에게 스마트컨트랙트에 있는
0.5 이더가 전송된다.
msg.sender에 Test7의 스마트컨트랙트 주소를 입력하고
Test8을 호출하여 디스트로이 시킨다.
그럼 Test7의 잔고는 0.5 + 0.5 = 1.0 eth가 되고
1.0 eth 이상의 조건을 만족시키므로
인출 할 수 있다.
'블록체인' 카테고리의 다른 글
uint 자료형의 허점을 노린 스마트컨트랙트 해킹 (0) | 2021.07.28 |
---|---|
스마트컨트랙트 홀짝 해킹 #3 (0) | 2021.07.28 |
스마트컨트랙트에서 코인을 훔쳐보자 (0) | 2021.07.27 |
이더리움 기반 ERC20 토큰 만들기 (0) | 2021.07.27 |
스마트컨트랙트 배포 (1) | 2021.07.26 |