http://www.7klian.com

智能合约安详系列文章反汇编·下篇

智能合约安详系列文章反汇编·下篇

媒介

上篇我们具体阐明白智能合约反汇编后的代码内容,包罗多个反汇编指令的寄义,数据在栈中的存储方法,并通过上下文关联干系梳理代码逻辑。本篇我们将继承阐明上篇遗留的反汇编代码,通过上篇进修我们已对反汇编指令在栈和内存存储的有了必然相识,该篇我们将重点来阐明反汇编指令暗示的代码逻辑。

反汇编内容

合约源代码

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)?{ ???????? ????????if?(n?<=?1)?{?return?1;?}

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

上篇文章中,我们对下图中蓝色框中的内容举办了具体阐明,本篇我们阐明赤色框中的内容以及之后的反汇编指令。

智能合约和平系列文章反汇编·下篇

反汇编阐明

我们从label_004E开始阐明,从反汇编上篇文章中可知,执行0x4e是上一步中判定后证明该函数签名是为a()函数,接下来我们来看0x4e中指令的主要寄义:

(CALLVALUE)获取生意业务中的转账金额,(DUP1)复制转账金额值到栈顶,(ISZERO)把栈顶转账金额值出栈,假如该值是0则把1入栈,不然把0入栈。(JUMPI)这里假如转账金额值为0,(PUSH1 0x59)该段指令就会跳转到0x59;假如转账金额不为0,则顺序执行下一行指令。由此可知该段指令主要是为了判定a()函数是否存在转账操纵。

执行完后,今朝栈中就只存在一条数据:转账金额值

这里我们先来看label_004E顺序执行:

智能合约和平系列文章反汇编·下篇

通过上图0055部门可以看出,PUSH1 0x00和DUP1指令在这里均无实际意义,这部门最终功效为遏制执行,回滚状态。

接下来,我们来看跳转后0059指令内容:(pop)把栈顶值出栈,也就是转账金额值;(PUSH1 0x60和PUSH1 0x8a)将0x60和0x8a依次压入栈中;(JUMP)跳转到栈顶0x8a位置。

智能合约和平系列文章反汇编·下篇

如图008a指令处,依次压入0x00,0x94,0x02,0xab,今朝栈中机关如下:

4:0xab 3:0x02 2:0x94 1:0x00 0:0x60

之后JUMP指令将跳转至00AB,如上图。该段指令中:(PUSH1 0x00,PUSH1 0x01)依次将0x00和0x01压入栈;(DUP3)复制当前栈中第三个值0x02放入栈顶;(GT)把栈顶两个值出栈,先出栈的值0x02大于后出栈的值0x01,把1入栈;(ISZERO)把栈顶值1出栈,该值不是0把0入栈;继承(ISZERO)把栈顶值1出栈,该值是0把1入栈;(JUMPI)这里栈顶值为1,(PUSH1 0xbe)跳转到0xbe。

这里留意压入的0x02就是a()函数中挪用self(2)函数传入的值。

接下来我们对a()函数的内部操纵举办一个全面的梳理

下图为a()函数挪用self()函数并赋值后的反汇编指令代码逻辑图:

智能合约和平系列文章反汇编·下篇

上图的反汇编指令操纵数值在栈中的机关如下所示:

智能合约和平系列文章反汇编·下篇

以上两张图中指令执行逻辑均已举办标注,对付每个指令的操纵寄义就纷歧一先容,我们直接来看阐明之后,重点的指令操纵。通过008A段中PUSH1 0x02将2压入栈中;00AB段中DUP3将2复制到栈顶,并操作GT指令将2和1举办了比拟;00BE段中DUP4将2复制到栈顶,并操作SUB指令到达(2-1),最终获得相减的数值后继承跳转到00AB中对该值和1举办比拟;接下来00B7段和00CD段没有实际意义,只是对一些数值举办调解;继承看00C8段中DUP3将复制到栈顶,并操作MUL指令将2和1(也就是2-1的值)举办相乘,,并将所得值压入栈中,之后的0094段和0060段寄义是将栈中数值举办调解,并将计较偏移量最终输出返回值。

故此我们可以得出a()函数的输入值后的代码逻辑为以下:

function?a()?public?returns?(uint256)?{?self(2);?} ?? ??function?self(uint?n)?internal?returns?(uint256)?{ ???????? ????????if?(n?<=?1)?{?return?1;?}

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

由于汇编指令较多,这里就不举办全面阐明,需要深入进修的同学可移步反汇编二:反汇编2

总结

本篇文章我们分享了如何通过反汇编指令阐明获得智能合约源代码逻辑,看似一段简朴的智能合约代码,但反汇编出来的汇编指令却很是多。我们在之前的文章中也分享了通过阐明反编译代码获得智能合约源代码逻辑,所以对付智能合约编译陈设后的opcode,发起各人选择适合本身的逆向方法。

solidity智能合约逆向东西推荐:

https://ethervm.io/decompilehttps://contract-library.com/https://github.com/crytic/ida-evmhttps://github.com/comaeio/porosityhttps://github.com/meyer9/ethdasm

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

相关文章阅读