1.Consensys CTF - "以太坊沙盒"
2.ifconfig源码分析
3.go-iptables功能与源码详解
4.失败的码分丢包排查
5.如何培养区块链技能人员?
6.etherscan.io是如何获取区块链详细数据的?
Consensys CTF - "以太坊沙盒"
本文基于samczsun.com/consensys-...的解析文章,分析了Consensys在地址0xcbef5c4a0d0cde9d6fdceeca部署的码分以太坊沙盒合约。合约要求黑客攻破并获取其中的码分所有ETH,但不提供源代码。码分首先,码分借助contract-library.com/网站,码分seata源码注释解析二进制代码,码分得到一个典型的码分solidity源码结构。合约包含4个函数、码分两个uint[]数组全局变量。码分函数包括对array_0的码分赋值、set_array、码分owners以及一个复杂涉及delegatecall的码分函数xf。
函数xf复杂,码分需满足三个条件,码分特别是msg.sender必须是owner数组中的一员。通过分析,发现在没有直接设置owner数组的函数下,可以通过set_array(_key, _value)间接改变owner数组。利用solidity中动态数组在storage的存储方式,计算array[0]和owner[0]对应的storage key差值,通过set_array方法调整owner数组。实现此目的,可部署一个hacker.sol合约。
为满足第三个条件,即构造一个不含特定字节的合约,通过手动编写合约并利用ctf的第四个函数delegatecall该合约,实现清理sandbox中的ETH。使用create2函数创建临时合约,将合约地址作为赠品赠予该临时合约,其初始化代码执行selfdestruct(tx.orgin)函数,转移所有ETH至合约部署人。
通过opcode编写runtime code,部署HackCTF合约,调用ctf的第四个函数,将合约地址作为参数传入,完成清理过程。此方法是在登链社区首发的解析结果,旨在提供对以太坊沙盒合约的深入理解和破解策略。
ifconfig源码分析
在ifconfig源码的main函数中,程序首先处理以 '-' 开始的参数,如 '-a' 和 '-s',并判断其作用。接着,尝试打开内核支持的所有协议的套接字,通过调用sockets_open函数实现,如果失败,会输出错误信息并退出程序。 如果命令行参数为0,意味着显示所有网卡的信息,程序会调用if_print函数。如果用户提供了一个网卡名称,程序会将其复制到ifr.ifr_name中,并处理下一个参数,可能是协议簇名或选项。如果找到协议簇,将其af属性赋值给addr_family,并保存对应的套接字描述符skfd。 接下来,程序进入一个循环,处理剩余的参数。如果是开关参数,调用set_flag或clr_flag函数处理;如果是功能参数,直接通过ioctl函数处理。在处理IP地址时,nft源码交易平台会根据协议簇类型调用相应的ioctl函数,如SIOCSIFADDR,来设置接口的地址信息。扩展资料
ifconfig是linux中用于显示或配置网络设备(网络接口卡)的命令,英文全称是network interfaces configuring。配置网卡的IP地址语法例:ifconfig eth0 ..0.1 netmask ...0go-iptables功能与源码详解
介绍iptables之前我们先搬出他的父亲netfilter,netfilter是基于 Linux 2.4.x或更新的内核,提供了一系列报文处理的能力(过滤+改包+连接跟踪),具体来讲可以包含以下几个功能:
其实说白了,netfilter就是操作系统实现了网络防火墙的能力(连接跟踪+过滤+改包),而iptables就是用户态操作内核中防火墙能力的命令行工具,位于用户空间。快问快答,为啥计算机系统需要内核态和用户态(狗头)。
既然netfilter是对报文进行处理,那么我们就应该先了解一下内核是如何进行收发包的,发生报文大致流程如下:
netfilter框架就是作用于网络层中,在一些关键的报文收发处理路径上,加一些hook点,可以认为是一个个检查点,有的在主机外报文进入的位置(PREROUTING ),有的在经过路由发觉要进入本机用户态处理之前(INPUT ),有的在用户态处理完成后发出的地方(OUTPUT ),有的在报文经过路由并且发觉不是本机决定转发走的位置(FOWARD ),有的在路由转发之后出口的位置(POSTROUTING ),每个检查点有不同的规则集合,这些规则会有一定的优先级顺序,如果报文达到匹配条件(五元组之类的)且优先级最高的规则(序号越小优先级越高),内核会执行规则对应的动作,比如说拒绝,放行,记录日志,丢弃。
最后总结如下图所示,里面包含了netfilter框架中,报文在网络层先后经过的一些hook点:
报文转发视角:
iptables命令行工具管理视角:
规则种类:
流入本机路径:
经过本机路径:
流出本机路径:
由上一章节我们已经知道了iptables是用户态的命令行工具,目的就是为了方便我们在各个检查点增删改查不同种类的规则,命令的格式大致如下,简单理解就是针对具体的哪些流(五元组+某些特定协议还会有更细分的匹配条件,比如说只针对tcp syn报文)进行怎样的动作(端口ip转换或者阻拦放行):
2.1 最基本的增删改查
增删改查的命令,我们以最常用的filter规则为例,就是最基本的防火墙过滤功能,实验环境我先准备了一个centos7的docker跑起来(docker好啊,实验完了直接删掉,不伤害本机),并通过iptables配置一些命令,然后通过主机向该docker发生ping包,测试增删改查的filter规则是否生效。
1.查询
如果有规则会把他的序号显示出来,后面插入或者删除可以用 iptables -nvL -t filter --line
可以看出filter规则可以挂载在INPUT,FORWARD,OUTPUT检查点上,并且兜底的规则都是ACCEPT,也就是没有匹配到其他规则就全部放行,这个兜底规则是可以修改的。 我们通过ifconfig查看出docker的ip,然后主机去ping一波:
然后再去查一下,会发现 packets, bytes ---> 对应规则匹配到的报文的个数/字节数:
2. 新增+删除 新增一条拒绝的报文,我们直接把docker0网关ip给禁了,这样就无法通过主机ping通docker容器了(如果有疑问,下面有解答,会涉及docker的一些小姿势): iptables -I INPUT -s ..0.1 -j DROP (-I不指定序号的话就是头插) iptables -t filter -D INPUT 1
可见已经生效了,拦截了ping包,随后我删除了这条规则,上海手机直播系统源码又能够ping通了
3. 修改 通过-R可以进行规则修改,但能修改的部分比较少,只能改action,所以我的建议是先通过编号删除规则,再在原编号位置添加一条规则。
4. 持久化 当我们对规则进行了修改以后,如果想要修改永久生效,必须使用service iptables save保存规则,当然,如果你误操作了规则,但是并没有保存,那么使用service iptables restart命令重启iptables以后,规则会再次回到上次保存/etc/sysconfig/iptables文件时的模样。
再使用service iptables save命令保存iptables规则
5. 自定义链 我们可以创建自己的规则集,这样统一管理会非常方便,比如说,我现在要创建一系列的web服务相关的规则集,但我查询一波INPUT链一看,妈哎,条规则,这条规则有针对mail服务的,有针对sshd服务的,有针对私网IP的,有针对公网IP的,我这看一遍下来头都大了,所以就产生了一个非常合理的需求,就是我能不能创建自己的规则集,然后让这些检查点引用,答案是可以的: iptables -t filter -N MY_WEB
iptables -t filter -I INPUT -p tcp --dport -j MY_WEB
这就相当于tcp目的端口的报文会被送入到MY_WEB规则集中进行匹配了,后面有陆续新规则进行增删时,完全可以只针对MY_WEB进行维护。 还有不少命令,详见这位大佬的总结:
回过头来,讲一个关于docker的小知识点,就是容器和如何通过主机通讯的?
这就是veth-pair技术,一端连接彼此,一端连接协议栈,evth—pair 充当一个桥梁,连接各种虚拟网络设备的。
我们在容器内和主机敲一下ifconfig:
看到了吧,容器内的eth0和主机的vetha9就是成对出现的,然后各个主机的虚拟网卡通过docker0互联,也实现了容器间的通信,大致如下:
我们抓个包看一哈:
可以看出都是通过docker0网关转发的:
最后引用一波 朱老板总结的常用套路,作为本章结尾:
1、规则的顺序非常重要。
如果报文已经被前面的规则匹配到,IPTABLES则会对报文执行对应的动作,通常是ACCEPT或者REJECT,报文被放行或拒绝以后,即使后面的规则也能匹配到刚才放行或拒绝的报文,也没有机会再对报文执行相应的动作了(前面规则的动作为LOG时除外),所以,针对相同服务的规则,更严格的规则应该放在前面。
2、当规则中有多个匹配条件时,条件之间默认存在“与”的关系。
如果一条规则中包含了多个匹配条件,那么报文必须同时满足这个规则中的所有匹配条件,报文才能被这条规则匹配到。
3、在不考虑1的情况下,应该将更容易被匹配到的抢单源码卡单规则放置在前面。
4、当IPTABLES所在主机作为网络防火墙时,在配置规则时,应着重考虑方向性,双向都要考虑,从外到内,从内到外。
5、在配置IPTABLES白名单时,往往会将链的默认策略设置为ACCEPT,通过在链的最后设置REJECT规则实现白名单机制,而不是将链的默认策略设置为DROP,如果将链的默认策略设置为DROP,当链中的规则被清空时,管理员的请求也将会被DROP掉。
3. go-iptables安装
go-iptables是组件库,直接一波import " github.com/coreos/go-ip...",然后go mod tidy一番,就准备兴致冲冲的跑一波自带的测试用例集,没想到上来就是4个error:
这还了得,我直接去go-iptables的仓库issue上瞅瞅有没有同道中人,果然发现一个类似问题:
虽然都是test failures,但是错的原因是不一样的,但是看他的版本是1.8的,所以我怀疑是我的iptables的版本太老了,一个iptables -v看一眼:
直接用yum update好像不能升级,yum search也没看到最新版本,看来只能下载iptables源码自己编译了,一套连招先打出来:
不出意外的话,那就得出点意外了:
那就继续下载源码安装吧,然后发现libmnl 又依赖libnftnl ,所以直接一波大招,netfilter全家桶全安装:
Finally,再跑一次测试用例就成功了,下面就可以愉快的阅读源码了:
4. 如何使用go-iptables
5. go-iptables源码分析
关键结构体IPTables
初始化函数func New(opts ...option) (*IPTables, error) ,流程如下:
几个重要函数的实现:
其他好像也米有什么,这里面就主要介绍一下,他的命令行执行是怎么实现的:
6. Reference
失败的丢包排查
在测试网络性能时,我们发现即使在小流量下,网络仍有丢包现象。首先,检查实际网卡速率,发现Gbps远大于测试流量,排除速率问题。接着,利用ethtool工具分析丢包原因,发现是ring-buffer不够导致的丢包。这可能是因为测试流量突然增大,超出了预期,临时解决方法是增加rx的ring-buffer大小。环形缓冲区的大小指的是存放帧的数量,而非字节数。
进一步检查发现,丢包原因可能是中断不均衡。如果网络包处理线程未绑定CPU,可能需要关闭系统自带的中断均衡设置。若已将处理网络包的线程绑定到特定CPU,确保中断均衡程序已关闭。绑定CPU的好处是,网络包中断由该线程处理,后续分析也在此线程进行,减少缓存失效问题。查看网卡归属NUMA节点,确保与绑定的java启动器源码CPU对应,使用脚本set_irq_affinity为特定CPU设置中断处理。
在负载均衡方面,设置对称哈希算法的关键值,确保同一双向包流被均衡分配到同一网卡队列中。通过ethtool命令检查实际丢包情况和重传率,发现如果只收包不丢包,需要进一步排查。磁盘IO检查显示并未达到瓶颈,CPU占用情况也较为均衡,内存使用正常。通过查看软中断在各个CPU上的分布,调整不均衡的中断处理。
排查后,如问题仍未解决,应检查驱动程序,确保已安装最新版本。如果问题不在网卡丢包,而是网络丢包,可以参考dropwatch进行排查。经过全面检查,发现磁盘IO、CPU占用、内存使用及中断处理等方面均未发现明显问题,但仍然存在丢包现象,下一步需深入源码或驱动层进行排查。诗词欣赏作为结尾,提供轻松氛围,与技术排查形成对比。
如何培养区块链技能人员?
区块链产业越来越被重视,企业该如何快速进行区块链的学习呢?
企业需要进行一定的调整
最近这段时间,很多人都在讨论关于区块链的相关问题,很多对于这个比较陌生的名词感到非常的好奇,而且最近很多企业也展开了区块链技术的学习以及应用,这也让很多人感到非常的困惑。为了解答相关的问题,我们首先需要知道区块链是什么。区块链是信息技术领域的术语,从本质上讲,它是共享数据库,存储于其中的数据或信息,具有“不可伪造”“全程留痕”“可以追溯”“公开透明”“集体维护”等特征。区块链作为比特币的重要概念,本质上是去中心化的数据库,同时作为比特币的底层技术,是一串使用密码学方法相关联产生的数据块,每一个数据块中包含了一批次比特币网络交易的信息,用于验证其信息的有效性(防伪)和生成下一个区块。企业要想进行更快更有效的区块链技术的学习以及应用,就必须聘请相关专业的人才,并对公司进行一定的整改,因为只有这样才能让区块链技术在企业中得到真正的发挥以及应用。
一:聘请相关专业人才
决定一家公司成败的最关键因素莫过于就是企业拥有的核心人才数量。如果一家企业想进行更多更好的区块链技术的应用,那么就必须聘请足够多的相关技术人员,让专业的人才把区块链技术真真正正的带入企业。只有这样企业才能真正开始掌握区块链技术。
二:进行决策上的改变
区块链是一种全新的概念,也是一种全新的技术,很多人对于未知的事情都是有着本能的恐惧的。作为管理人员,为了更好的发展区块链,为了让企业得到更多的发展,那么进行决策上的改变是非常有必要的。努力确保区块链技术能得到正常发展以及应用。
三:投入一定的资金
区块链作为一种全新的科技手段,对于区块链的研究以及开发是非常重要的,因此,加大企业对于区块链的资金投入是非常有必要的,因为只有更多的资金流入,才能区块链技术得到真正的发展。
科技部原副部长吴忠泽:必须强化区块链的基础理论研究吴忠泽表示,虽然区块链的理论技术已经应用了十多年,但是从全球来看,区块链系统所涉及的核心技术还远远没有达到成熟的阶段,是一个初级阶段。因此中国和美欧等发达国家所处的起跑线之间并没有太大的差距,对中国来说是一次赶超的机遇,可以做到并跑,甚至领跑。像一些核心技术,比如共识机制的问题、可编程合约的问题、分布式存储的问题、数字签名的问题、网络安全的问题等,都是需要下功夫去突破的核心技术,甚至有些是“卡脖子”的问题。
吴忠泽认为,目前我国区块链技术正在持续创新,产业生态已经初步形成:从上游的硬件制造、平台服务、安全服务,到下游的产业技术应用服务,再到保障产业发展的行业投融资、媒体、人才服务等,正协同有序推动区块链产业快速发展。
“目前供应链金融、资产证券化、大宗交易、保险等传统金融领域还存在很多痛点:参与节点多、征信成本高、交易流程长、效率较低等,这些可以靠区块链的应用来解决。”吴忠泽说。
对于如何发展区块链,吴忠泽提出六大建议:
一是区块链技术要与新基建紧密结合。目前区块链的行业应用正在逐步地从数字金融领域延伸到实体和服务领域,包括物联网、智能制造、供应链管理、数字资产交易等多个领域,开始了广泛的探索,而且取得了初步的成效。特别是伴随着新基建快速的推进,区块链将为5G、人工智能、数据中心、工业互联网这样新一代的基础设施融合发展带来新的机遇,而且正在拓展新的应用空间。
二是建立完善区块链创新体系。他认为要建立一种以企业为主体、市场为导向、产学研深度融合的区块链技术创新体系来发挥积极性。
三是加快区块链标准化发展,积极参与国际标准的制定,增强国家在区块链发展中的国际话语权。
四是加强区块链人才建设。吴忠泽表示,到各地区交流时,会发现很多地方的党政领导都很重视区块链技术,都希望有专家去讲解区块链到底是怎么回事。但是因为过去接触的少,另外技术确实比较新,因此在理解上还是存在困难。因此要培养新人才,通过制度创新加强人才队伍建设,建立一个完善的区块链专业人才的培养体系,可以通过院校联合培养、打造培养平台、引进区块链发展急需的领军人才和高水平的创新团队、建立专家咨询机构等的方式,加强区块链专业的指导。
五是要守正创新,建立行业安全保障体系。什么叫守正创新?即注意风险的防范,比如加强行业自律,落实安全责任等。“守正创新非常重要,区块链技术很好,要防止一些浑水摸鱼,借这个机会发大财淘金的事情,把好技术弄坏了。”
六是启动区块链立法进程,从而占据在国际竞赛的制高点。
如何学习区块链技术首先,条件允许的话,尽量选择在一线城市学习,毕竟那里是技术聚集区。其次,再考察其他方面,例如:师资力量、课程体系、教学模式、就业薪资、学费学时等。直接去试听,考察学校的真实情况。
Go全栈+区块链课程为几周?分几个阶段?每个阶段讲多久?学完每个阶段达到什么程度?
一共周,分为5个阶段,
第一阶段4周go语言基础与网络并发,学完入门go语言,
第二阶段4周go语言实战web开发,爬虫开发,密码学,共识算法,实现轻量级公链,学完可以开发golang的网站,爬虫,实现轻量级区块链
第三阶段4周以太坊源码分析与智能合约Dapp开发,学完掌握以太坊核心与开发智能合约,以及区块链,
第四阶段4周超级账本,比特币EOS,源码分析与智能合约实战,学完以后掌握超级账本开发,山寨比特币,分叉EOS,以及智能合约Dapp开发
第五阶段6周项目实战,实战5个企业级项目,学完可以拥有1年区块链项目经验
适合人群:
1.没有编程基础,想学IT技术的人群;
2.发展受限,想要提升的人群;
3.有编程经验,想要转行的人群。
学习目标:
从0开始学习Go语言,通过对Go语言的学习综合培养区块链专项应用型人才。
就业方向:
1.新技术Go语言开发(Web开发、微服务、分布式)。
2.新领域区块链开发(密码学安全、区块链系统、区块链应用)。
如何学习区块链技术?
1、技术语言
Python和Go这两门语言是众多公司招聘都提到的技术语言。需要优先学习。而且这两种语言在区块链之外的技术方向也有很大的应用。比如Go用在大并发系统的后台构筑,Python用于人工智能系统构筑。所以学习这两门语言是优先考虑的问题。
2、技术框架
掌握Bitcoin、ETH和Hyperledger的一种或多种。BTC就不用说了,底层是C++写的,大量的货币类项目,如莱特币,dash,门罗,zcash等都使用比特币的技术进行二次开发。
ETH则是区块链2.0的代表,可以在ETH网络上构建各种各样的应用类Dapp。现在大量的应用类区块链项目都是使用ETH平台开发的。
Hyperledgerfabric则是IBM力推的区块链开发平台,主要用于联盟链的开发,是目前普及度最高的联盟链开发平台。
3、算法
POW(工作量证明算法),POS(权益证明算法),PBFT(拜占庭容错算法)等都是区块链中密码学部分的重要组成,对于这些算法有充分的了解,有利于你参加区块链项目底层开发时能够对密码学的部分有更好的理解。
扩展资料:
区块链技术就是一种分布式记账技术,它的特点就是去中心化、公开透明,让每个人都可以参与数据库建立,而且每个建立的数据又是不可篡改的,大家都参与了,陌生人之间的信任问题也就解决了。
区块链技术出现了,它是个全民参与的记账技术,AB之间的交易信息和数据公布于众,而且是不可篡改的,大家都知道有这个事情的发生,那么这里就不需要什么权威的第三方C了,或者说系统里的每一个都是充当了C的角色,这也叫做去中心化。
如何学习区块链相关技术?学习区块链技术的最佳方法之一是先从实践出发,可以建立一个简单的区块链项目,使用相关技术来解决实际问题。然后可以学习相关的技术,例如比特币、以太坊、Hyperledger、基于共识的分布式系统等。此外,可以学习更高级的概念,例如智能合约,分布式应用程序开发等。学习区块链技术的未来前景非常广阔,有很多行业正在尝试使用区块链技术,例如金融、物流、采购和海关等等。
学习区块链技术需要什么条件?从目前的区块链领域的人才需求来看,大致分为以下几种:
1.搭建基于DLT技术的分布式账本应用,在DLT上实现客户要求的业务需求。这类领域目前比较出名的就是瑞波了。所以DLT是什么意思,看看瑞波在做什么你就懂了。
2.在已有的公链上开发自己的应用,目前大部分的公司都是在做这个。这一类的特点也是门槛低、商业潜力大、风险也较低。
3.公司开发自己的公链,这一类的未来潜力最大,但是风险与技术难度也是最高。
4.区块链生态基础设施类。比如说移动钱包、硬件冷钱包、交易平台、区块链内容平台等等,这一类是目前商业利润最高的区块链产业,相对来说门槛低、风险低,但是竞争者非常多。
如果从技术切入,需要学习哪些语言与知识呢?
对于第一类来说,go语言是必要的,因为DLT基本以go语言为主,同时还需要掌握一定的应用开发的能力,因为交付给客户的必定是一个软件而不是一堆命令行源程序。而对于第二类来讲,目前智能合约的主流还是以太坊智能合约的solidity语言,所以如果想要进入第二类的企业,就需要以以太坊来入手。第三类的公链开发,主流的是c++和go,但也有不少有名项目是以rust实现的,比如说:Facebook的libra、火币公链的nervos等等。第四类实际上则与区块链技术的关系不算太大,因为诸如交易平台这样的开发并不需要区块链技术。
而除了以上的技术硬实力以外,区块链公司更偏爱的人才是“斜杠青年”,也就是同时掌握多领域知识的人才,这里主要也分为三大类:金融与区块链、内容运营与区块链、社区运营与区块链。而在这里面,第三类人才又是最为稀少的,因为大多数技术型人才都不善于沟通与交流,但是区块链由于其分布式的特点,又特别需要社区的共同发力来创建与维护一条链。
最后,很多人误以为区块链是个全新的行业、区块链与传统领域完全不搭,这其实是一个很大的误区,从上述所写来看,你也可以发现区块链说到底最后还是要解决现实中的实际需求,不同的只是解决需求的工具变了,所以不要以为只懂区块链就可以大杀四方,选好要切入的需求领域,具备那个需求领域所需要的基本知识还是非常重要的。
区块链的应用领域有数字货币、通证、金融、防伪溯源、隐私保护、供应链、娱乐等等,区块链、比特币的火爆,不少相关的top域名都被注册,对域名行业产生了比较大的影响。
etherscan.io是如何获取区块链详细数据的?
etherscan.io 等区块链浏览器获取区块链数据的主要方式是通过搭建全节点,调用全节点的 RPC 方法获取所需信息。web3.eth 也采用相似策略。为了获取特定数据,开发者可通过解析全节点源代码或数据库,但此类操作技术难度较高,要求深入了解区块链原理与数据存储结构。
以太坊全节点主要有两种版本:Geth 和 Parity。Parity 拥有更强大的功能,但资源占用更大。
获取合约地址的交易数据时,需注意合约调用产生的结果通常不上链,故 Geth 全节点无法获取内部交易信息。而 Parity 提供了 trace 接口,能够通过以太坊虚拟机(EVM)回放,获取内部交易详情。etherscan.io 则通过 trace 接口获取此类数据。
ERC 合约交易数据可通过 Parity 全节点调用 eth_getFilterLogs 方法筛选并获取,此接口详细说明可见于相关文档。
另外,谷歌 BigQuery 提供了全面的链上数据查询服务,包括比特币、分叉链、以太坊、以太经典等。但服务费用按每次搜索的数据量计费,每 TB 5 美元,成本不菲。BigQuery 并且开源了数据解析代码,用户可根据自身需求搭建自用数据库。
在区块链数据获取方面,etherscan.io 通过搭建全节点或调用高阶接口实现了数据的有效获取。同时,BigQuery 等工具提供了便捷的数据查询途径,尽管存在费用问题,但其提供的链上数据覆盖广泛,为研究与分析提供了宝贵资源。