CSAW2018_Lowe

I personally prefer Home Depot.

XOR Passes are the easiest way to use numbers to encrypt!

By Kris Kwiatkowski, Cloudflare

题目提供了三个文件:file.enc, key.enc, pubkey.pem 可以在我的GitHub中找到。

TL;DR

运用了RSA公钥中的小公钥指数e,如果明文m的e次方小于n,则用e开方密文m可以得到明文。参考:https://ctftime.org/writeup/11328


关于RSA加密和破解的参考:https://bitsdeep.com

因式分解数据库:http://factordb.com


先查看三个文件的内容,pubkey.pem 明显是RSA的公钥,用openssl的命令解析它:

sunhaiwendeMacBook-Pro:LoweCrypto sun$ openssl rsa -inform PEM -text -noout -pubin < pubkey.pem

Public-Key: (1536 bit)

Modulus:

    00:cf:70:7e:ed:97:90:17:b7:f6:f4:76:ff:3b:a6:

    55:59:ad:b1:82:e0:7c:fa:23:33:b1:ec:05:6b:7f:

    7b:96:12:40:54:f1:f5:74:8b:04:c3:69:4e:90:f0:

    d9:9f:ee:05:84:a8:7a:70:81:75:80:d4:93:93:32:

    1b:b2:08:07:ff:de:25:a4:c8:ab:d4:6d:95:c1:e3:

    74:0d:9e:64:1f:e7:7f:9b:96:ce:ca:e9:18:e6:7a:

    24:89:52:b5:da:81:ae:77:42:bd:ae:51:b1:29:24:

    59:73:41:50:57:ae:75:df:b7:5a:78:e8:24:37:9e:

    52:50:65:92:c3:75:0e:9a:1c:7e:70:1b:ee:8d:df:

    c7:a9:ca:72:53:4c:d3:b0:95:79:f8:7a:4e:b3:76:

    f9:26:7c:d1:a1:6e:1e:57:90:95:c5:b8:6f:4b:8f:

    24:fb:61:3f:08:a7:e0:e4:75:d2:55:56:ae:41:c8:

    ce:e2:48:e9:0d:ac:96:5d:c4:7d:db:b4:c5

Exponent: 3 (0x3)

可以看到这个公钥用了一个很小的指数e,根据Wikipedia对于攻击RSA的描述,我们可以将密文用e开方来得到明文。

文件file.enc内容如下:

kStoynmN5LSniue0nDxli9csSrBgexZ/YOo5e+MUkfJKwvht8hHsYyMGVYzMlOp9sAFBrPCbm4UA4n7oMr2zlg==

用Base64解码:


其内容肯定加密过,将加码后的内容存在file.bin中。

文件key.enc的内容如下:

219135993109607778001201845084150602227376141082195657844762662508084481089986056048532133767792600470123444605795683268047281347474499409679660783370627652563144258284648474807381611694138314352087429271128942786445607462311052442015618558352506502586843660097471748372196048269942588597722623967402749279662913442303983480435926749879440167236197705613657631022920490906911790425443191781646744542562221829319509319404420795146532861393334310385517838840775182

这是一个大整数,可能是RSA中的某个数。

因为公钥指数是3,如果密文c的e次方小于大数n,我们可以对c开e次方来得到明文。尝试对key.enc中的数进行开方。用python的gmpy2库来做大数的开方运算:

>>> import gmpy2

>>> e=gmpy2.mpz(3)

>>> c=gmpy2.mpz(219135993109607778001201845084150602227376141082195657844762662508084481089986056048532133767792600470123444605795683268047281347474499409679660783370627652563144258284648474807381611694138314352087429271128942786445607462311052442015618558352506502586843660097471748372196048269942588597722623967402749279662913442303983480435926749879440167236197705613657631022920490906911790425443191781646744542562221829319509319404420795146532861393334310385517838840775182)

将密文和公钥指数以mpz的格式存储。mpz是Multiple-precision Integers,用来存储任意精度整数。对c进行开方:

>>> gmpy2.iroot(c, e)

(mpz(6028897571524104587358191144119083924650151660953920127739581033174354252210219577997969114849529704172847232120373331804620146706030387812427825026581462), False)

第二个返回值false代表这个结果不是精确的,说明c被e开方不是整数。

回忆RSA加密公式:c=m^e mod n. 如果m^e比n大,那么就会进行mod n的计算。 我们尝试把密文c加上一个n的大小再次开方:

>>> n=gmpy2.mpz(0x00cf707eed979017b7f6f476ff3ba65559adb182e07cfa2333b1ec056b7f7b96124054f1f5748b04c3694e90f0d99fee0584a87a70817580d49393321bb20807ffde25a4c8abd46d95c1e3740d9e641fe77f9b96cecae918e67a248952b5da81ae7742bdae51b129245973415057ae75dfb75a78e824379e52506592c3750e9a1c7e701bee8ddfc7a9ca72534cd3b09579f87a4eb376f9267cd1a16e1e579095c5b86f4b8f24fb613f08a7e0e475d25556ae41c8cee248e90dac965dc47ddbb4c5) #导入公钥中的n

>>> gmpy2.iroot(c+n,e)

(mpz(12950973085835763560175702356704747094371821722999497961023063926142573092871510801730909790343717206777660797494675328809965345887934044682722741193527531), True)

开方得到的结果是整数!说明解密成功!

把整数转换为hex:

>>> plain = int(gmpy2.iroot(c + n, e)[0])

>>> hex(plain)

'0xf74709ad02fe85d8d3f993d5ff5716eabb5829df0d12624a048e0a4bd726a6c428a3cd5ac6248900113733effdf1dc4b8837209c92a9a3e161d0478d04dbd0eb'

但这依然不是flag。

题目中有提示运用XOR运算。尝试将我们得到的结果和file.binXOR:

>>> key = bytes.fromhex(hex(plain)[2:])

>>> data = open("file.bin", "rb").read()

>>> bytes([ k ^ d for (k, d) in zip(key, data) ])

b'flag{saltstacksaltcomit5dd304276ba5745ec21fc1e6686a0b28da29e6fc}'

得到flag!!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容