前言

题目ida查看后发现是浮点数的运算,涉及到精度的问题,本来想的是爆破每一位,但是发现条件由于精度损失的问题不可能相等,且数据越来越大,直到程序inf。后来听说是math有关的知识,看了别人的wp,发现竟是一大堆的数学公式的运算:积分,泰勒公式,辛普森公式。下面就分析一下题目功能和思路。

题目功能

题目逻辑是内置了一个长度为19的数组,输入的数据经过函数sub_13F3运算后,如果相等则输出correct!

  __isoc99_scanf("%39s", s);if ( strlen(s) == 38 ){for ( i = 0; i <= 37; i += 2 ){if ( dbl_4020[i / 2] != sub_13F3(*(unsigned __int16 *)&s[i]) )goto LABEL_2;}puts("correct");result = 0LL;}

sub_13F3函数,功能是从8225到输入数据的大小循环迭代v3,如下:

double __fastcall sub_13F3(int a1)
{int i; // [rsp+8h] [rbp-Ch]double v3; // [rsp+Ch] [rbp-8h]v3 = qword_2010;// 0x3f3fa5e61d8cedfd  0.00048291080524950886for ( i = 0x2021; i < a1; ++i )v3 = 2.718281828459045 - (double)i * v3;    return v3;
}

尝试

经过调试,得到了qword_2010的值0.00048291080524950886,然后按照程序的逻辑仿写了代码,对每个字符进行爆破,但是结果发现,得到的数据一正一负且越来越大最后越界inf。发现爆破不太行,陷入了僵局。到底哪里出了问题?后来发现2.718281828459045 是自然数e,根据题目名字ezmath猜测是和math有关,函数里面是关于v3的递推,发现类似于 I n = e − n ∗ I n − 1 I_n = e-n*I_{n-1} In​=e−n∗In−1​,这就需要数学辨识力了实际上它是积分: ∫ 0 1 x n e x d x ≈ e / n \int_{0}^{1}x^ne^x\text{d}x \approx e/n ∫01​xnexdx≈e/n,下面分析一下如何得到

分析数学算法

∫ 0 1 x n e x d x ≈ e / n \int_{0}^{1}x^ne^x\text{d}x \approx e/n ∫01​xnexdx≈e/n,时间上是个积分运算,涉及到凑微分,泰勒展开式、极限的运算。
lim ⁡ n → ∞ n ∫ 0 1 x n e x d x ① = lim ⁡ n → ∞ n ∫ 0 1 x n ∑ i = 0 ∞ x i i ! d x ② = lim ⁡ n → ∞ n ∫ 0 1 ∑ i = 0 ∞ x i + n i ! d x = lim ⁡ n → ∞ n ∑ i = 0 ∞ ∫ 0 1 x i + n d x i ! ③ = lim ⁡ n → ∞ n ∑ i = 0 ∞ 1 ( i + n + 1 ) i ! = lim ⁡ n → ∞ ∑ i = 0 ∞ 1 ( i + 1 n + 1 ) i ! = ∑ i = 0 ∞ 1 i ! = e \lim_{n\rightarrow \infty}n\int_0^1x^ne^xdx\\①=\lim_{n\rightarrow \infty}n\int_0^1x^n\sum_{i=0}^{\infty}\frac{x^i}{i!}dx\\②=\lim_{n\rightarrow \infty}n\int_0^1\sum_{i=0}^{\infty}\frac{x^{i+n}}{i!}dx=\lim_{n\rightarrow \infty}n\sum_{i=0}^{\infty}\frac{\int_0^1x^{i+n}dx}{i!}\\ ③ =\lim_{n\rightarrow \infty}n\sum_{i=0}^{\infty}\frac{1}{(i+n+1)i!}=\lim_{n\rightarrow \infty}\sum_{i=0}^{\infty}\frac{1}{(\frac{i+1}{n}+1)i!}\\=\sum_{i=0}^{\infty}\frac{1}{i!}=e limn→∞​n∫01​xnexdx①=limn→∞​n∫01​xn∑i=0∞​i!xi​dx②=limn→∞​n∫01​∑i=0∞​i!xi+n​dx=limn→∞​n∑i=0∞​i!∫01​xi+ndx​③=limn→∞​n∑i=0∞​(i+n+1)i!1​=limn→∞​∑i=0∞​(ni+1​+1)i!1​=∑i=0∞​i!1​=e
到①式 lim ⁡ n → ∞ ∫ 0 1 e x d x = lim ⁡ n → ∞ ∫ 0 1 ∑ i = 0 ∞ x i i ! d x \lim_{n\rightarrow \infty}\int_0^1e^xdx = \lim_{n\rightarrow \infty}\int_0^1\sum_{i=0}^{\infty}\frac{x^i}{i!}dx limn→∞​∫01​exdx=limn→∞​∫01​∑i=0∞​i!xi​dx为 e x e^x ex的泰勒展开
到②式为化简,求和符号提出去
到③式是对 ∫ 0 1 x i + n d x = 1 i + n + 1 ∗ x i + n + 1 ∣ 0 1 = 1 i + n + 1 \int_0^1x^{i+n}dx = \frac{1}{i+n+1}*x^{i+n+1}|_0^1 = \frac{1}{i+n+1} ∫01​xi+ndx=i+n+11​∗xi+n+1∣01​=i+n+11​的积分
最后得到了 ∑ i = 0 ∞ 1 i ! = e \sum_{i=0}^{\infty}\frac{1}{i!}=e ∑i=0∞​i!1​=e
至此可以得到 ∫ 0 1 x n e x d x = x n e x ∣ 0 1 − ∫ 0 1 e x d x n = e − n ∗ ∫ 0 1 x n − 1 e x d x ≈ e / n \int_{0}^{1}x^ne^x\text{d}x = x^ne^x|^1_0-\int_{0}^{1}e^x\text{d}x^n = e-n*\int_{0}^{1}x^{n-1}e^x\text{d}x\approx e/n ∫01​xnexdx=xnex∣01​−∫01​exdxn=e−n∗∫01​xn−1exdx≈e/n
所以要求n,就可以用 e ∫ 0 1 x n e x d x \frac{e}{\int_{0}^{1}x^ne^x\text{d}x} ∫01​xnexdxe​,其中 ∫ 0 1 x n e x d x \int_{0}^{1}x^ne^x\text{d}x ∫01​xnexdx为题目中给的数组数据。这里有精度的问题,所以要适当调整。

exp

import math
import codecs
res = [0.00009794904266317233, 0.00010270456917442, 0.00009194256152777895,
0.0001090322021913372, 0.0001112636336217534, 0.0001007442677411854,
0.0001112636336217534, 0.0001047063607908828, 0.0001112818534005219,0.0001046861985862495, 0.0001112818534005219, 0.000108992856167966,
0.0001112636336217534, 0.0001090234561758122, 0.0001113183108652088,
0.0001006882924839248, 0.0001112590796092291, 0.0001089841164633298,
0.00008468431512187874]
flag = b''
for i in res:flag += codecs.decode(hex(int(math.e/i)-1)[2:],'hex')[::-1]
print flag
print len(flag)

总结

题目让我了解了数学知识在程序中的应用,加深了数学从理论到时间的认识,一切源于数学,我个菜鸡该好好补补数学知识了!!

参考

https://blog.csdn.net/weixin_43363675/article/details/118078787
https://blog.csdn.net/SCP000111/article/details/118033127
https://cdcq.github.io/2021/06/15/20210615a/

2021强网杯 ezmath writeup相关推荐

  1. 2019强网杯crypto writeup

    本次write包含以下题目 copperstudy randomstudy 强网先锋-辅助 copperstudy 题目描述 nc 119.3.245.36 12345 连上去返回 [+]proof: ...

  2. 2021 强网杯 pwn notebook

    kernal pwn 给了几个文件,然后来看看启动文件 #!/bin/sh stty intr ^] exec timeout 300 qemu-system-x86_64 -m 64M -kerne ...

  3. 2021强网杯 Web赌徒 WP

    文章目录 源代码: 分析 __invoke __get _tostring EXP 调用流程: 总结 源代码: <meta charset="utf-8"> <? ...

  4. 强强联手:2021强网杯LongTimeAgo复盘分析

    花指令 查看main函数能看出有异常跳转. 查看汇编,将此处c为代码. 之后再依次去除花指令,再反汇编得到main函数伪代码. 主函数不短,先根据参数大概还原函数名,可以看出是常规的对输入加密再che ...

  5. 第二届全国强网杯Web 题three hit学习心得(伪write up)

    前言:本人CTF-WEB入门,有参赛,赛后参考了很多write up想解出此题,无奈理解能力有限,看不懂很多大佬的思路,最后看 酷辣虫上的一篇大佬write up才弄明白. 现将学习心得总结如下,说得 ...

  6. 强网杯2021 ctf线上赛ezmath wp(#超详细,带逆向新手走过一个又一个小坑)

    文章目录 引言 一.分析文件类型 二.初步分析 1 运行情况 2 IDA初步分析 三.详细分析 1 sub_13F3函数分析 2 查找蛛丝马迹 (1)mprotect (2)重写unk_2010 3 ...

  7. php upload ctf,强网杯CTF防御赛ez_upload Writeup

    这是强网杯拟态防御线下赛遇到的web题目,本来是不打算分享Writeup的,但是由于问的人很多,于是这里分享给大家. ez_upload这题算是非常经典的堆叠black trick的题目,算是比较典型 ...

  8. 强网杯2018 - nextrsa - Writeup

    强网杯2018 - nextrsa - Writeup 原文地址:M4x@10.0.0.55 所有代码均已上传至我的github 俄罗斯套娃一样的rsa题目,基本把我见过的rsa套路出了一遍,值得记录 ...

  9. [网络安全提高篇] 一一〇.强网杯CTF的Web Write-Up(上) 寻宝、赌徒、EasyWeb、pop_master

    强网杯作为国内最好的CTF比赛之一,搞安全的博友和初学者都可以去尝试下.首先,让我们观摩下这些大神队伍,包括0x300R.eee.0ops.AAA.NeSE.Nu1L等,真的值得我们去学习.其次,非常 ...

最新文章

  1. 当YOLOv5遇见OpenVINO
  2. Swif基础语法01
  3. 英文Ubantu系统安装中文输入法
  4. Nginx 502 Bad Gateway 错误的原因及解决方法
  5. PyQt5代码触发QTreeWidget的列表中某个item点击信号
  6. extjs展示列表,显示来很多空白行,但是数据没显示
  7. __declspec(novtable)有什么作用
  8. 力扣-面试题 16.10. 生存人数
  9. HTML5制作诗歌锦集,【热门】诗歌作文锦集六篇
  10. 手撸springmvc乞丐版
  11. 建设银行安徽分行副行长王文兵:金融科技赋能银行数字化转型
  12. 微信悄悄新出了个野心很大的App
  13. Android应用开发——记事本
  14. 按字母顺序排列c语言,C语言有n个国家名,要求按字母先后顺序排列,并按升序输出。(要求:尽量使用标准字符串函数)...
  15. Vue实现树形菜单组件
  16. Delphi历史版本介绍(二)从Delphi8到DelphiXE3
  17. swing可视化编程-使用label添加图片
  18. vue 校验表单报错:model is required for validate to wor
  19. pair类型 C++
  20. 微观经济学论文选题怎么选?

热门文章

  1. jmeter输出请求和响应数据到文件
  2. 广东省教育局 计算机,广东省教育厅关于公布第十七届广东省中小学电脑制作活动获奖结果的通知...
  3. 在写CSDN的文章时,如何插入表格并进行简单的配置
  4. 阿克曼转向几何的设计原理及解决的问题
  5. 中国移动大数据推进“精准扶贫”
  6. 美国计算机基础课课程教学,美国大学计算机基础课程设置
  7. 苹果手机删除的视频怎么找回
  8. 微信支付API v3签名与验签-APP支付问题
  9. 嵌入式开发-浅谈嵌入式MCU开发中的三个常见误区
  10. 原生微信小程序使用class 三元运算符实现多选案例