區(qū)塊鏈安全
Jump Oriented Programming實戰(zhàn)一
實驗目的
學會使用python3的web3模塊
學會分析以太坊智能合約中中Jump Oriented Programming(JOP)問題
深刻理解EVM字節(jié)碼
找到合約漏洞進行分析并形成利用
實驗環(huán)境
Ubuntu18.04操作機
實驗工具
python3
實驗原理
JOP 的思想和 ROP 是相似的:串聯(lián)起一個個小的代碼片段(gadget),達成一定的目的。
涉及到 JOP 的是如下三個字節(jié)碼:0x56 JUMP 0x57 JUMPI 0x5B JUMPDEST,在 EVM 中的無條件跳轉(zhuǎn) JUMP 和條件跳轉(zhuǎn) JUMPI 的目的地都必須是 JUMPDEST,這點和 ROP 可以任選返回地址不同。
通常需要用到 JOP 的合約在編寫時都夾雜著內(nèi)聯(lián)匯編的后門,本實驗通過jop控制程序控制流,實現(xiàn)特定目的。
實驗內(nèi)容
合約中內(nèi)置了簡單的JOP問題,找到合約漏洞并形成利用,觸發(fā)合約的SendFlag(address addr)事件即可
使用python3的web3模塊遠程利用漏洞并獲取flag
實驗地址為nc ip 10015
Jump Oriented Programming實戰(zhàn)一 實驗步驟
獲取合約地址和合約源代碼
nc ip 10015連接到題目,輸入1,獲取部署合約的game account及token
打開http://ip,輸入上述分配的game account,點擊Request獲取eth
nc ip 10015連接到題目,輸入2,獲取部署合約的地址及new token文章來源:http://www.zghlxwxcb.cn/news/detail-752398.html
nc ip 10015連接到題目,輸入4,獲取合約源代碼,或者在題目附件找到合約源代碼文章來源地址http://www.zghlxwxcb.cn/news/detail-752398.html
分析合約源代碼漏洞
pragma solidity ^0.4.23;
contract ETH15 {
address private owner;
bytes4 internal constant SET = bytes4(keccak256('fifth(uint256)'));
event SendFlag(address addr);
struct Func {
function() internal f;
}
constructor() public payable {
owner = msg.sender;
}
modifier onlyOwner {
require(msg.sender == owner);
_;
}
// 0x4b64e492
function execute(address _target) public payable{
require(_target.delegatecall(abi.encodeWithSelector(this.execute.selector)) == false, 'unsafe execution');
bytes4 sel;
uint val;
(sel, val) = getRet();
require(sel == SET);
Func memory func;
func.f = gift;
assembly {
mstore(
到了這里,關(guān)于某60區(qū)塊鏈安全之JOP實戰(zhàn)一學習記錄的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!