silent_peeper

(来源:暗泉杯)

from Crypto.Util.number import *
from Crypto.Cipher import AES
import binasciiflag = "flag{XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}"
bs = AES.block_size
pad = lambda s: s + (bs - len(s) % bs) * chr(bs - len(s) % bs)p = 174807157365465092731323561678522236549173502913317875393564963123330281052524687450754910240009920154525635325209526987433833785499384204819179549544106498491589834195860008906875039418684191252537604123129659746721614402346449135195832955793815709136053198207712511838753919608894095907732099313139446299843
g = 41899070570517490692126143234857256603477072005476801644745865627893958675820606802876173648371028044404957307185876963051595214534530501331532626624926034521316281025445575243636197258111995884364277423716373007329751928366973332463469104730271236078593527144954324116802080620822212777139186990364810367977
a = getRandomNBitInteger(40)
b = getRandomNBitInteger(40)
A = pow(g, a, p)
B = pow(g, b, p)
assert pow(A, b, p) == pow(B, a, p)
key = pow(A, b ,p)
key = long_to_bytes(key)[:16]
cipher = AES.new(key, AES.MODE_ECB)
ciphertext = cipher.encrypt(pad(flag))with open('cipher', 'w') as f:f.write("A, B = {}\n".format(str((A, B))))f.write("ciphertext = {}\n".format(binascii.hexlify(ciphertext)))f.close()
A, B = (142989488568573584455487421652639325256968267580899511353325709765313839485530879575182195391847106611058986646758739505820350416810754259522949402428485456431884223161690132385605038767582431070875138678612435983425500273038807582069763455994486365993366499478412783220052753597397455113133312907456163112016L, 16631700400183329608792112442038543911563829699195024819408410612490671355739728510944167852170853457830111233224257622677296345757516691802411264928943809622556723315310581871447325139349242754287009766402650270061476954875266747743058962546605854650101122523183742112737784691464177427011570888040416109544L)
ciphertext = ed5c68ebb65aa3a13afb259cf3984ce60bdc54b7ef918b850745df850cf4c450b02216c0c6e67ed501a17e516496cd6c

这里用到了BSGS算法(大步小步算法)

它是用来解决这样一类问题
yx=z(mod p),给定y,z,p>=1求解x
普通的BSGS只能用来解决gcd(y,p)=1的情况
设x=a∗m+b,m=⌈p–√⌉,a∈[0,m),b∈[0,m)
那么ya∗m=z∗y−b(mod p)
怎么求解,为了方便,设x=a∗m−b
那么ya∗m=z∗yb(mod p),a∈(0,m+1]
直接暴力辣,把右边的b枚举[0,m),算出z∗yb(mod p),哈希存起来
然后左边a枚举(0,m+1],算出ya∗m(mod p)查表就行了
然后不知道为什么要用exgcd,只会map…

用sage解

sage: p = 17480715736546509273132356167852223654917350291331787539356496312333028105252468745075491024000992015452563532
....: 520952698743383378549938420481917954954410649849158983419586000890687503941868419125253760412312965974672161440234
....: 6449135195832955793815709136053198207712511838753919608894095907732099313139446299843
....: g = 41899070570517490692126143234857256603477072005476801644745865627893958675820606802876173648371028044404957307
....: 185876963051595214534530501331532626624926034521316281025445575243636197258111995884364277423716373007329751928366
....: 973332463469104730271236078593527144954324116802080620822212777139186990364810367977
....:
sage: bsgs(mod(g,p),mod(A,p),(0,1<<40))
822690494337
sage: bsgs(mod(g,p),mod(B,p),(0,1<<40))
621209248538
sage: key = pow(A, 621209248538 ,p)
sage: key
49490143664250726340234715933627573928019204778410313862054713655398194526581099674219755475997125892095025977920719640048704962181220475413665581922989858463397985369540020911109237604500080688916224884254427061443849735076051958183562833019840975221087968773423237208708556105725003184929141476854095400756

得到key之后转python

>>> from Crypto.Util.number import *
>>> from Crypto.Cipher import AES
>>> ciphertext = 0xed5c68ebb65aa3a13afb259cf3984ce60bdc54b7ef918b850745df850cf4c450b02216c0c6e67ed501a17e516496cd6c
>>> key = 49490143664250726340234715933627573928019204778410313862054713655398194526581099674219755475997125892095025977920719640048704962181220475413665581922989858463397985369540020911109237604500080688916224884254427061443849735076051958183562833019840975221087968773423237208708556105725003184929141476854095400756
>>> key = long_to_bytes(key)[:16]
>>> cipher = AES.new(key, AES.MODE_ECB)
>>> cipher.decrypt(int.to_bytes(ciphertext, ciphertext.bit_length()//8, 'big'))
b'flag{21384433-0dc7-413b-9d09-64cc97c99730}\x06\x06\x06\x06\x06\x06'

代码参考

Decrypt-It-easy

题目来源:攻防世界
题目描述:找到字符串在随机化之前.

先打开txt文件,

不知道要干什么,搜了别的师傅的解题,用IDA 打开rnd

找到main函数,F5查看代码


读a2[1],写a2[2]

根据readme可以推断a2[1]就是那个png文件,a2[2]就是得到的ecrypt1.bin

又要用到png文件格式问题,类似beginners-luck
但也有很多不一样

依旧先根据png文件头进行爆破,其中时间是可以获取的

这里面就有c的函数,所以可以直接用C写就好了(代码参考)

#include <stdio.h>
#include <stdlib.h>int main(int argc, char *argv[]) {FILE *cipher = fopen(argv[1], "rb");FILE *plain = fopen(argv[2], "wb");unsigned int seed = atoi(argv[3]);int c;srand(seed);c = (fgetc(cipher) & 0xff) ^ (rand() & 0xff);while (!feof(cipher)) {fputc(c, plain);c = (fgetc(cipher) & 0xff) ^ (rand() & 0xff);}fclose(plain);fclose(cipher);
}

但是这个并不能直接运行,可以利用虚拟机一些命令来运行
最后得到

由于这是某次比赛的题目,我们还可以知道flag固定开头:SECCON{…}

所以就可以解了

N, B = 0xB86E78C811, 0xFFFEE
for i in range(32, 127):for j in range(32, 127):for k in range(32, 127):M = int(('N{' + chr(i) + chr(j) + chr(k)).encode('hex'), 16)if ((M * (M + B) % N) == 0x5FFA0AC1A2):print 'N{' + chr(i) + chr(j) + chr(k)
N, B = 0x7BD4071E55, 0xFEFEF
for i in range(32, 127):for j in range(32, 127):for k in range(32, 127):for l in range(32, 127):M = int((chr(i) + chr(j) + chr(k) + chr(l) + '}').encode('hex'), 16)if ((M * (M + B) % N) == 0x6008DDF867):print chr(i) + chr(j) + chr(k) + chr(l) + '}'

2022-01-17相关推荐

  1. 洛谷 刷题 深基部分题解(python版)-2022.01.29

    P5703 [深基2.例5]苹果采购(python3实现) https://blog.csdn.net/dllglvzhenfeng/article/details/122690555 P5703 [ ...

  2. 小学奥数 7657 连乘积末尾0的个数-2022.01.26

    http://noi.openjudge.cn/math/7657/ /* 小学奥数 7657 连乘积末尾0的个数-2022.01.26 http://noi.openjudge.cn/math/76 ...

  3. 1168:大整数加法--2022.01.22 AC

    /* 1168:大整数加法--2022.01.22 AC http://ybt.ssoier.cn:8088/problem_show.php?pid=1168c++中 cin.cin.get().c ...

  4. 1.5 编程基础之循环控制 11 整数的个数(2022.01.09)--python

    http://noi.openjudge.cn/ch0105/11/ """ 1.5 编程基础之循环控制 11 整数的个数(2022.01.09) http://noi. ...

  5. 《安富莱嵌入式周报》第251期:2022.01.31--2022.02.06

    往期周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - P ...

  6. 《安富莱嵌入式周报》第249期:2022.01.17--2022.01.23

    往期周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - P ...

  7. 微软发布 Visual Studio 2022 版本 17.3:支持.NET MAUI 正式版,提高 C++ 性能

    微软今天发布了 Visual Studio 2022 版本 17.3.此更新带来了对 .NET 多平台应用程序 UI (.NET MAUI) 支持.为 Microsoft Teams 开发应用程序的能 ...

  8. 2022/07/17 软件设计师错题日志 Day 1

    本次记录中题目来自希赛网2022/01/01软件设计师每日一练 错题1: 10个成员组成的开发小组,若任意两人之间都有沟通路径,则一共有()条沟通路径. A:100  B:90  C:50  D:45 ...

  9. 2022.3.17 关于镜头标称焦距和相机标定的焦距的差异

    2022.3.17 关于镜头标称焦距和相机标定的焦距的差异 来源 https://jah10527.github.io/articles/about_focol_length.html 有些日子没聊点 ...

  10. 《安富莱嵌入式周报》第248期:2022.01.10--2022.01.16

    往期周报汇总地址:链接 目录 本周发布了两期视频教程: 视频版 图文版 1.ARM第一款采用新安全分区架构的Morello评估板现已交付给研究人员 2.三星实现基于MRAM的内存计算设备 3.Qt6. ...

最新文章

  1. (解释)常见的无线路由器采用( A)技术。 A. WiFi B. AP C. UWB D. ZigBee
  2. asp.net中page对象生命周期和各事件执行顺序
  3. C++Binomia distribution二项分布的实现算法(附完整源码)
  4. 201621123028《Java程序设计》第5周学习总结
  5. 丰收互联蓝牙key怎么开机_ublox收购Rigado的蓝牙模块业务,扩大蓝牙低功耗产品组合...
  6. android uber启动动画,模仿Uber的启动画面(上)
  7. BZOJ——2134: 单选错位
  8. 负margin在布局中的运用(*****************************************************************)...
  9. ADN中国团队參加微软的Kinect全国大赛获得三等奖
  10. 超级便宜的鸿蒙开发板环境搭建-编译-烧录
  11. 数据结构与算法:十大排序算法之冒泡排序
  12. win10鼠标不受控制乱动_终于可以一键禁止Win10自动更新了
  13. Manjaro安装scrt8.3 201912
  14. Java-图片处理 Gif转Jpg
  15. 传统图像分割方法详解
  16. linux命令行计算器 bc命令用法
  17. Simpson自适应Simpson
  18. 基于Rust-vmm实现Kubernetes运行时
  19. lzma算法_十款性能最佳的压缩算法
  20. Android通过WebSocket建立一个长连接(带心跳检测)从服务器端接收消息

热门文章

  1. 数据加载很慢_Vaex真香!几秒钟就能处理数十亿行数据,比Pandas、Dask更好用
  2. roobo机器人怎么唱歌_智能机器人都长什么样?提前探秘中国智能机器人大赛
  3. Py之glob: glob库文件名模式匹配+返回所有匹配的文件路径列表库的简介、使用方法之详细攻略
  4. 成功解决:利用编程向数据库插入一条记录,而从数据库中查不到该条记录
  5. pandas:dataframe删除某些不为non的行
  6. 彻底弄懂 HTTP 缓存机制及原理 | 干货
  7. Linux 磁盘与文件系统管理
  8. python 面向对象编程 之 上下文管理协议
  9. 【算法总结】图论相关
  10. 一些个人认为好看的电影