Love My Love

强网杯CTF 2020 区块链题目 IPFS Writeup

2020.08.24

# 题目:Do you know IPFS?

# Writeup

0. Do you know IPFS?

( flag = flag{.*} len(flag) = 0x26 , The form of flag is lowercase)

1. 通过ipfs获取所有资源pic1的资源文件

# pic1.jpg
ipfs get QmZkF524d8HWfF8k2yLrZwFz9PtaYgCwy3UqJP5Ahk5aXH
ipfs get Qme7fkoP2scbqRPaVv6JEiaMjcPZ58NYMnUxKAvb2paey2
ipfs get QmU59LjvcC1ueMdLVFve8je6vBY48vkEYDQZFiAbpgX9mf
ipfs get QmXh6p3DGKfvEVwdvtbiH7SPsmLDfL7LXrowAZtQjkjw73
ipfs get QmXFSNiJ8BdbUKPAsu3oueziyYqeYhi3iyQPXgVSvqTBtN
ipfs get QmfUbHZQ95XKu9vd5XCerhKPsogRdYHkwx8mVFh5pwfNzE

2. 拼图并获得 pic1 的 hash

mv QmXh6p3DGKfvEVwdvtbiH7SPsmLDfL7LXrowAZtQjkjw73 1
mv QmXFSNiJ8BdbUKPAsu3oueziyYqeYhi3iyQPXgVSvqTBtN 6
mv QmZkF524d8HWfF8k2yLrZwFz9PtaYgCwy3UqJP5Ahk5aXH 2
mv Qme7fkoP2scbqRPaVv6JEiaMjcPZ58NYMnUxKAvb2paey2 3
mv QmU59LjvcC1ueMdLVFve8je6vBY48vkEYDQZFiAbpgX9mf 4
mv QmfUbHZQ95XKu9vd5XCerhKPsogRdYHkwx8mVFh5pwfNzE 5
  1. cat 1 2 3 4 5 6 > test.jpg 的方式拼图,1和6的位置是确定的,1可以直观的看到图片头,6可以通过十六进制确定它是文件尾,剩下的 2345 直接拼接可以看到图片的衔接点是不一样的,调整顺序很快可以找到1后面的第一块合适的内容,以此类推,拼出 pic1.jpg
  2. 因为除了结尾,每个图片分片大小是26624,我们需要把 pic1.jpg 通过 ipfs 分片上传,这里是很容易忽视的一个点,你很可能会认为需要的hash值是 sha256 或别的什么,然而,这里要是 ipfs 的hash,每当你上传一个文件,ipfs都会给你返回一个该文件的hash,通过这个唯一hash可以避免ipfs里存储重复文件。执行 ipfs add -s size-26624 pic1.jpg 获得到了pic1.jpg 的hash

3. 获得 pic2 的hash

题目说明已经给出了图片的sha256,我们只需要将这个转换为ipfs的Qm开头的hash即可,在原sha256串的前面加1220的头,然后转换为base58即可得到 pic2.jpg 的 Qm 打头的hash:

python3
Python 3.8.5 (default, Jul 21 2020, 10:48:26)
[Clang 11.0.3 (clang-1103.0.32.62)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import base58
>>> base58.b58encode_int(int("1220659c2a2c3ed5e50f848135eea4d3ead3fa2607e2102ae73fafe8f82378ce1d1e"),16)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '1220659c2a2c3ed5e50f848135eea4d3ead3fa2607e2102ae73fafe8f82378ce1d1e'
>>> base58.b58encode_int(int("1220659c2a2c3ed5e50f848135eea4d3ead3fa2607e2102ae73fafe8f82378ce1d1e", 16))
b'QmVBHzwuchpfHLxEqNrBb3492E73DHE99yFCxx1UYcJ6R3'
>>> base58.b58encode_int(int("659c2a2c3ed5e50f848135eea4d3ead3fa2607e2102ae73fafe8f82378ce1d1e", 16))
b'7qeHqmdC3foiMbRCoysZPyJEbZMgaVbHAtx6KK9J6QM3'
>>> base58.b58encode_int(int("1220659c2a2c3ed5e50f848135eea4d3ead3fa2607e2102ae73fafe8f82378ce1d1e", 16))
b'QmVBHzwuchpfHLxEqNrBb3492E73DHE99yFCxx1UYcJ6R3'

4. 计算获得md5校验和,得到flag

伪代码: md5.sum(Qmcode.pic1.jpg+Qmcode.pic2.jpg)
将获得的md5校验和用flag{}括起来就是flag

EOF

发表评论