火星链 火星链
Ctrl+D收藏火星链
首页 > BTC > 正文

ETH:智能合约安全系列文章反汇编·上篇

作者:

时间:1900/1/1 0:00:00

智能合约安全系列文章反汇编·上篇

前言

通过上一篇反编译文章的学习,我们对智能合于opcode的反编译有了基础的学习,对于初学者来说,要想熟练运用还得多加练习。本篇我们来一块学习智能合约反汇编,同样使用的是OnlineSolidityDecompiler在线网站,智能合约反汇编对于初学者来说,较难理解,但对于智能合约代码来说,只要能读懂智能合约反汇编,就可以非常清晰的了解到合约的代码逻辑,对审计合约和CTF智能合约都有非常大的帮助

反汇编内容

由于solidity智能合约的opcode经过反汇编后,指令较多,我们本篇分析简明要义,以一段简单合约代码来分析其反汇编后的指令内容

合约源码如下:

?pragma?solidity?^0.4.24;

?contract?Tee?{

?????

?????uint256?private?c;

?????function?a()?public?returns?(uint256)?{?self(2);?}

?????

?????function?b()?public?{?c++;?}

?????function?self(uint?n)?internal?returns?(uint256)?{

?????????

Offchain Labs过去7日从币安转出约722万枚ARB:金色财经报道,据Lookonchain监测,过去7日,Offchain Labs通过多个地址从币安转出约722万枚ARB(约718万美元)。[2023/6/18 21:44:53]

?????????if?(n?<=?1)?{?return?1;?}

?????????return?n?*?self(n?-?1);

?????}

?}

合约部署后生成的opcode:

?0x6080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630dbe671f14604e5780634df7e3d0146076575b600080fd5b348015605957600080fd5b506060608a565b6040518082815260200191505060405180910390f35b348015608157600080fd5b5060886098565b005b60006094600260ab565b5090565b6000808154809291906001019190505550565b600060018211151560be576001905060cd565b60c86001830360ab565b820290505b9190505600a165627a7a7230582003f585ad588850fbfba4e8d96684e2c3fa427daf013d4a0f8e78188d4d475ee80029

Robinhood:将积极审查SEC诉讼中提到代币以采取某些行动:6月7日消息,股票和加密货币交易平台Robinhood的代表告诉国会委员会,其平台本周可能会将美国证券交易委员会(SEC)针对币安和Coinbase提起的诉讼中提到的代币退市。 前美国证券交易委员会委员、Robinhood首席法律合规官Dan Gallagher周二向众议院农业委员会作证时表示:“我们正在积极审查SEC的分析,以确定在这方面采取某些行动,如果有的话。”

该公司拥有证券交易的经纪-交易商许可证。尽管如此,Gallagher认为,在这两次执法行动中,该公司无法利用这一点来交易被美国证券交易委员会命名为未注册证券的代币,包括Solana、Polygon和Cardano。但Gallagher作证说,这些项目的其他安全投资缺乏披露标准,这将阻碍它们重新上线。[2023/6/7 21:20:42]

通过在线网站OnlineSolidityDecompiler反汇编后结果如下:

反汇编分析

我们从第一部分指令label_0000开始

??0000????60??PUSH1?0x80

??0002????60??PUSH1?0x40

??0004????52??MSTORE

??0005????60??PUSH1?0x04

美股三大指数集体高开,道指涨0.52%:金色财经报道,美股三大指数集体高开,道指涨0.52%,纳指涨0.07%,标普500指数涨0.32%。[2022/10/11 10:30:16]

??0007????36??CALLDATASIZE

??0008????10??LT

??0009????60??PUSH1?0x49

??000B????57??*JUMPI

push指令是将字节压入栈顶,push1-push32依次代表将1字节-32字节推压入栈顶,这里PUSH10x80和PUSH10x40表示将0x80和0x40压入栈顶,故目前栈的布局如下:

?1:?0x40

?0:?0x80

MSTORE指令表示从栈中依次出栈两个值arg0和arg1,并把arg1存放在内存的arg0处。目前来说栈中已无数据,这里将0x80存放在内存0x40处。

PUSH10x04将0x04压入栈中,CALLDATASIZE指令表示获取msg.data调用数据,目前栈的布局如下:

?1:?calldata

?0:?0x04

LT指令表示将两个栈顶的值取出,如果先出栈的值小于后出栈的值则把1入栈,反之把0入栈。这里如果calldata调用数据小于0x04字节,就将1入栈;如果calldata调用数据大于等于0x04字节,就将0入栈。目前栈的布局为:0:0或0:1。

魏鹏举:金融化并非是数字藏品真正的问题,传统的文化资产、艺术资产就可以金融化:金色财经消息,近日,新京报贝壳财经会客厅——建立数字藏品的正向发展标准和路径,数字藏品行业如何“守正·创新”规范发展研讨会在北京举行,中国艺术科技研究所副所长庹祖海、北京政协委员、北京国际大数据交易所首席专家王臻、文化和旅游部“十四五”规划专家委员会委员、中央财经大学文化经济研究院院长魏鹏举、国家文旅公共文化创新发展研究基地主任、中国传媒大学文化发展研究院副院长卜希霆、中国信通院云计算与大数据研究所区块链负责人张奕卉、金杜律师事务所北京办公室参会代表齐菲参加研讨会。

魏鹏举表示,数字藏品属于新生事物,必须给予一定的包容。金融化并非是数字藏品真正的问题,传统的文化资产、艺术资产就可以金融化,艺术品质押也是金融化,国家还有文化金融的概念,这说明艺术品金融化本身并没有问题,最大的问题是金融价值不能对应实体价值所发生的虚拟化。(新京报)[2022/7/4 1:48:53]

继续分析,PUSH10x49指令将0x49压入栈顶,目前栈的布局为:

?1:0x49

?0:?0?或者?1

下面一条指令JUMPI指令表示从栈中依次出栈两个值arg0和arg1,如果arg1的值为真则跳转到arg0处,否则不跳转。如果arg1值为1,则指令会跳转到0x49处;如果arg1值为0,则会顺序执行下一条指令。具体执行过程如下:

MakerDAO披露stETH持仓详情及stETH清算价格:6月15日消息,MakerDAO披露协议持有stETH的数据详情:stETH抵押品约占所有DAI抵押品的3%,价值约2.6亿美元;WSTETH-A资金库锁定204,661.12WSTETH,价值2.432亿美元,8290万DAI总债务,293.42%的总体抵押;WSTETH-B资金库锁定9,014.31WSTETH,价值1070万美元,250万DAI总债务,424.42%的整体抵押。

Maker表示,对于WSTETH-A资金库,若stETH跌至892美元,价值3330万美元的stETH将被清算;若stETH跌至582美元,价值7460万美元的stETH将被清算。对于WSTETH-B资金库,若stETH跌至903美元,价值64.5万美元的stETH将被清算;若stETH跌至594美元,价值200万美元的stETH将被清算。[2022/6/15 4:27:22]

这里我们先来分析顺序执行的内容label_000C,指令如下

??000C????60??PUSH1?0x00

??000E????35??CALLDATALOAD

??000F????7C??PUSH29?0x0100000000000000000000000000000000000000000000000000000000

??002D????90??SWAP1

??002E????04??DIV

??002F????63??PUSH4?0xffffffff

??0034????16??AND

??0035????80??DUP1

??0036????63??PUSH4?0x0dbe671f

??003B????14??EQ

??003C????60??PUSH1?0x4e

??003E????57??*JUMPI

目前经过上一步运算栈中布局为空,PUSH10x00指令将0压入栈中。CALLDATALOAD指令接受一个参数,该参数可以作为发往智能合约的calldata数据的索引,然后从该索引处再读取32字节数,由于前一个指令传入的索引值为0,所以这一步指令会弹出栈中的0,将calldata32字节压入栈中。PUSH29指令将29个字节压入栈中。目前栈的布局如下:

?1:0x0100000000000000000000000000000000000000000000000000000000

?0:calldata值

SWAP1指令表示将堆栈顶部元素与之后的第一个元素进行交换,也就是0x0100000000000000000000000000000000000000000000000000000000和calldata值进行交换。接下来DIV指令表示取a//b的值,这里也就是calldata的32字节除29字节,由于除法的运算关系,这里进行除法运算后的字节为4位,估计大家也可以想到,这就是函数标识符4字节。那么目前栈的布局如下:

0:函数标识符4字节

PUSH4指令将0xffffffff压入栈中。AND指令表示将取栈中前两个参数进行AND运算,也就是函数标识符前四位0xffffffff进行AND操作,最终得到前四位的函数标识符及后28位为空补0的数值。下一条指令DUP1表示复制当前栈中第一个值到栈顶,目前栈中布局如下:

1:调用参数中的函数标识符?0:调用参数中的函数标识符

下一个指令PUSH4指令继续将函数标识符0x0dbe671f压入栈中,这里的标识符为a()函数,函数标识符我们可以在https://www.4byte.directory/在线网站查看。目前栈中布局如下:

2:0x0dbe671f?1:调用参数中的函数标识符?0:调用参数中的函数标识符

EQ指令表示取两个栈顶值,如果两值相等就将1入栈,反之将0入栈。下一步PUSH1将0x4e压入栈顶。之后JUMPI指令从栈中依次出栈两个值arg0和arg1,如果arg1的值为真则跳转到arg0处,否则不跳转。目前栈中布局如下:

2:0x4e?1:1?或?0??0:调用参数中的函数标识符

从前面三个指令可看出,EQ对函数标识符进行判断后,下一步压入0x4e是为了JUMPI进行判断并跳转。也就是说如果EQ判断a()函数标识符相等,JUMPI执行后就会跳转到0x4e的偏移位置;反之如果EQ判断a()函数标识符不相等,JUMPI执行后就会顺序执行下一条语句。目前栈中布局如下:

0:调用参数中的函数标识符

具体执行过程如下:

目前我们对label_0000和label_000C已进行分析,从上图来看,该流程中除了顺序执行外,label_0000处0x49,label_003F处0x76和label_000C处0x4e都有相应的跳转条件。本篇我们继续分析顺序执行部分指令。首先来看第一部分label_003F:

?003F????80??DUP1?0040????63??PUSH4?0x4df7e3d0?0045????14??EQ?0046????60??PUSH1?0x76?0048????57??*JUMPI

由于目前栈中只有一条数据

DUP1指令表示复制栈中第一个值到栈顶。PUSH4指令将0x4df7e3d0函数标识符压入栈顶,这里函数标识符代表b()函数,故目前栈中布局如下:

2:0x4df7e3d0?1:调用参数中的函数标识符?0:调用参数中的函数标识符

接下来三个指令会进行栈中值进行运算和偏移量跳转设置,EQ指令把栈顶的两个值出栈,如果0x4df7e3d0和调用参数中的函数标识符相等则把1入栈,否则把0入栈。PUSH1指令将偏移量0x76压入栈中。JUMPI指令从栈中依次出栈两个值:0x76和EQ指令判断的值,如果EQ指令判断的值为真则跳转到0x76处,否则按顺序执行不跳转。故目前栈中布局如下:

2:0x76?1:1?或?0??0:调用参数中的函数标识符

我们假设EQ指令判断的值为0,那么通过JUMPI指令条件判断后,会按照顺序继续执行下一条指令。执行后,栈中依然只有一条指令。

我们继续进行顺序执行,label_0049:

?0049????5B??JUMPDEST?004A????60??PUSH1?0x00?004C????80??DUP1?004D????FD??*REVERT

JUMPDEST指令在该上下文中表示跳转回来,也就是label_0000处0x49的跳转。之后的两条指令PUSH1和DUP1总体意思为将0压入栈顶并复制,没有实际意义。REVERT指令则表示并未有函数签名匹配,从而停止执行,回滚状态。

总结

由于反汇编内容过多,我们分为两篇分享给大家,本篇我们对反汇编的内容进行了详细讲解,下篇我们将会继续分析并串联所有指令,梳理代码逻辑。

来源:金色财经

标签:USHPUSHTETETHXSUSHIPushswaptether币怎么买Etherean Socks

BTC热门资讯
KLIMA:  大财炒股公司 出货时成交量的形态是什么样的?

  出货时成交量的形态是什么样的?  主力在连续攻击放量、股价经过一波大幅上涨后,就面临着顶部主力出货.

1900/1/1 0:00:00
ENS:Amplio Capital行业观察者第五期:TokenSwap:DeFi去中心化新故事

AmplioCapital行业观察站是AmplioCapital特别推出的嘉宾对话栏目,第五期我们特邀TokenSwap亚太区志愿者负责人MIA参与本次AMA,DeFi进军一级市场.

1900/1/1 0:00:00
比特币:纽约时报畅销书作者:比特币S2F模型有缺陷,数学上并不健全

比特币的交易价格再创新高,而反对者也蜂拥而至。怀疑论者的范围从NourielRoubini到PeterSchiff等等.

1900/1/1 0:00:00
KEN:大财炒股杠杆平台 成交量的形态有哪些?

  成交量的形态有哪些?  成交量是指一个单位时间内某项交易成功的数量。成交必然是由买卖达成的,换言之,一笔成交的背后意味着一个交易商对后市看空,而另一个交易商后市看多,两者意见分歧,各取所需,

1900/1/1 0:00:00
NST:12.15早间大饼止盈400-450点

?昨日晚间大饼操作思路以低多为主在19000-19100附近多单进场,目标看19300-19500附近,凌晨一直处于在19200附近震荡,直至早间大饼终于上涨到19500附近.

1900/1/1 0:00:00
比特币:KP3R如愿突破前高!门头沟14万枚珍贵的比特币或许是你最后的上车机会.12月16日老俞

门头沟的赔付草案已经被延迟了三次,每一次时间节点都让市场产生担忧,毕竟整体是震荡行情,又有潜在利空,一般的投资者都太会在这种行情中重仓梭哈博未来,都等着利空释放一波有一个好位置在抄底.

1900/1/1 0:00:00