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……