mini blockchain

题目 :

某银行利用区块链技术,发明了DiDiCoins记账系统。某宝石商店采用了这一方式来完成钻石的销售与清算过程。不幸的是,该银行被黑客入侵,私钥被窃取,维持区块链正常运转的矿机也全部宕机。现在,你能追回所有DDCoins,并且从商店购买2颗钻石么? 注意事项:区块链是存在cookie里的,可能会因为区块链太长,浏览器不接受服务器返回的set-cookie字段而导致区块链无法更新,因此强烈推荐写脚本发请求 题目入口: http://116.85.48.107:5000/b942f830cf97e

解答 :

拿到题目,内心是拒绝的。因为虽然说区块链这么火,但是自己还是没怎么了解过。

第一反应是。药丸,没戏了。但是,搞信息安全的孩子怎么可以轻言放弃呢!

时间辣么长,还不信看不明白个区块链。最后肛了两天多,才大概明白了题目

首先,题目给了源码,这个很棒棒。

建议大家分析题目时将代码也多读几遍,然后再结合参考资料进行理解。

在这里不做太多的理解源码的讲解。

最初我是将重心代码的一些逻辑上,以及加密是否可逆。(发现自己太年轻,看不懂)

然后慢慢的开始了解区块链,最后发现这种手段。

这道题目中,利用了区块链一个很神奇的东西。

因为区块链是一个链表,而且还是一个谁都可以增加的,此时,人们达成了一种默认,以最长的那条链为主链(正版),其他的分支都是盗版。

如下图,就是此时该题目的区块链。

那么我们可以再构造一条链,只要比主链长,那这条链就是我们说了算。

此时虽然说区块链1是正规的链,但是区块链2要比1长,此时区块链2即为正规链。

但是,说的轻巧,我们该如何构造呢?

首先,我们分析路由可以发现,题目预留了一个创建交易的接口。此时可以生成新块。

只要我们可以挖到一个DDcoin,就可以创建一次新块,然后会判断商店的余额。最终给予砖石奖励。

然而DDcoin是什么呢。

在这道题里,其实就是这个东西,这就是一个区块。对他进行分析一下。

nonce:自定义字符串prev:上一个区块的地址hash:这个区块的hashheight:当前处于第几个节点transactions:交易信息

再分析transactions

input与signature好像是一个凭证,验证这个区块主人身份。
output,收款人信息
amount,收款数额
addr,收款地址

hash这里的话,不是太明白。
但是看代码。发现都有现成的可以生成。只要利用这三个函数,即可创建一个新的区块。

create_output_utxo(addr_to, amount) // 新建一个output信息create_tx(input_utxo_ids, output_utxo, privkey_from=None) // 新建一个transactions信息create_block(prev_block_hash, nonce_str, transactions) // 新建一个区块

首先新建output,此时参数很简单,收货人地址(商店),数量(全款)

然后创建tx,此时output_utxo就是刚刚咱创建好的那个。然而问题来了,私钥和id咱是没有的。此时分析代码可以发现,这一步做的主要就是创建一个sig签名。还有就是生成一个hash

此时,邪恶的想到,既然是要创建第二条链,那么可不可以借用一下第一条链的第一块的信息。

也就是直接忽略掉sig的生成,伪造tx,直接重写一下create_tx

然后此时tx也有了,进行下一步create_block

此时他的三个参数也好写,上一个区块的hash,自定义字符串,刚刚做好的tx

此时,我们要通过爆破nonce的方式,来使create_block生成的块的hash为00000开头,

这样,我们才能添加。

然后向那个添加块的地址post由create_block即可成功添加第一个块。

记得改请求头中的content-type为json。还有就是cookie自己手动更新

第二个块的时候,问题又来了。

这条链中,我们之前的tx已经使用过一次,无法使用了。怎么办?

此时可以注意到题目中init中给的hint。

凭啥他可以不写tx就生成块!不开心,你都能那样,我也要!

于是。。。。。通过这个方式,在后面添加几个空区块就好。

成功伪造主链!获取一颗砖石。

再次重复以上做法,完成第三条链即可获取到flag

切记,手动更新cookie……

本文章首发在 网安wangan.com 网站上。

上一篇 下一篇
讨论数量: 0
只看当前版本


暂无话题~