buuctf_day1
Buuctf Writeup - Day1
1. test your nc
题目描述:一道简单的nc连接题。
解题步骤:
- 使用nc连接靶机
- 连接后直接执行cat flag即可获取flag
2. rip
题目描述:nc连接后什么都没有。
解题步骤:
- 用checksec发现no canary
- file后发现是64位文件
- 放入IDA后发现有get函数

get函数不会限制输入的字节数,于是我们想到栈溢出,用栈溢出来覆盖我们发现的system("/bin/sh")的地址。

栈溢出后覆盖到该地址即可获得系统权限。于是有exp:

运行后即可获得flag:

3. warmup_csaw_2016_1
解题步骤:
- 前面操作相同不再赘述
- 打开IDA后发现:

有get函数还发现了cat flag:

那我们一样栈溢出后覆盖地址到cat flag前的push地址即可。于是有以下exp:

运行即可得到flag:

4. ciscn_2019_n_1
解题步骤:
- checksec后发现no canary
- file后发现是64位文件
- 放入64位IDA后查看main函数:

发现它先让v2=0.0,有一个条件判断,我们只要让v2=11.28125即可执行cat flag获得flag。于是我们想到栈溢出,栈溢出不仅可以覆盖地址,还可以覆盖变量值,我们可以通过栈溢出覆盖v2,使其变为11.28125即可获得flag。
注:11.28125在64位中为41348000
于是有exp:

运行后即可获得flag:

5. pwn1_sctf_2016
解题步骤:
- 打开IDA后分析:

replace函数将”I”替换为”you”(从1字节变为3字节),通过字符逃逸实现栈溢出。fgets有限制输入字节数,但通过字符替换可以增加字节数目。
查看s的偏移量:

得出偏移量为03c+4=0x40=64个字节。
找到cat flag调用的地址:

构造exp(限制23字节):

运行后即可获得flag:

6. jarvisoj_level0_1
解题步骤:
- 打开IDA后查看callsystem函数:

得到系统调用的地址。
查看main函数:

是一个明显的栈溢出,读取200字节。通过简单栈溢出覆盖到系统调用地址即可,于是有exp:

运行后即可获得flag:

7. 第五空间2019决赛 PWN5
解题步骤:
- checksec后发现与之前截然不同的结果:有canary保护
- 需要想办法绕过canary保护
- 查看main函数:

发现它先生成一个随机数(4字节),如果输入与随机数相同,即可获得flag。可以发现read可以栈溢出,可以通过栈溢出改变随机数从而通过if函数,这就要绕过canary保护。
Canary保护原理:是一种用于防护栈溢出的安全机制。其基本原理是在函数调用时,在栈帧的上方放入一个随机值(称为”Canary”),当函数返回时,系统会检查这个随机值是否被修改。如果随机值被修改,说明可能发生了栈溢出,程序将终止运行,从而防止潜在的缓冲区溢出攻击。
- 找到canary的偏移量:

- 编写exp:

注:特别要注意的是%n这个格式化字符串,它的功能是将%n之前打印出来的字符个数(四字节)写入参数地址处(赋值给一个变量)。
- 运行后即可获得flag:

8. jarvisoj_level2
解题步骤:
- 同样的步骤之后查看main函数:

发现明显栈溢出。但发现system函数调用和/bin/sh是分隔的。于是要把它们连接。
注:32位的分布是:返回地址+下一次的返回地址+参数1+参数2+…,这里返回地址可以随便指定。
- 编写exp:

运行后即可获得flag。