PWN入门-ret2libc-1
什么是ret2libc
ret2libc是一种常见的缓冲区溢出攻击技术。 通过这种方法,利用程序中的漏洞来执行已存在于内存中的代码,通常是 libc 库中的函数,而不是插入自定义的恶意代码。 这种攻击方法的优势在于,攻击者不需要将恶意代码注入程序中,只需利用已有的库函数来执行恶意操作。
解题
本题出处为NSSCTF上的[2021 鹤城杯]babyof checksec
使用checksec分析二进制文件
IDA
打开IDA进行反编译
发现main函数指向了一个sub_400632()函数,打开此函数
发现存在read()栈溢出危险函数
检索文件中存在的函数
并没有发现存在后门函数
猜测使用ret2libc获取flag
编写exp
接收并解析 puts 地址
GOT和PLT是和动态链接相关的。 1.GOT中的地址是动态的,程序运行时会根据实际情况进行更新。 2.PLT表本身的内容在程序运行过程中是不变的,但是它依赖于GOT中的动态地址来完成跳转。 所以每次运行都需要重新获取它们。 如何获取RDI和REX的地址
payload的解释
- 将 rdi gadget 的地址压入 payload: 这个gadget用于控制rdi寄存器,也就是puts函数的第一个参数。
- 将 puts_got 地址压入 payload: 这个地址作为 puts 的参数,目的是让puts函数输出GOT表中存储的puts函数的实际地址,以泄露libc中的函数地址。
- 将 puts_plt 地址压入 payload: 通过 PLT 调用 puts 函数。
- 将 sub_400632 压入 payload: 调用完 puts后,跳转到一个已知的安全位置。
继续编写exp
payload的解释
- p64(ret): 一般是一个 ret指令,用于对齐栈空间(有些系统在调用 system 时需要对齐栈指针)。
- p64(rdi): 用于将 /bin/sh的地址传递给system函数,rdi是传递第一个参数的寄存器。
- p64(bin_sh): /bin/sh的地址,作为参数传递给 system 函数。
- p64(system): system函数的地址,用来执行 system(“/bin/sh”),从而获得一个shell。
注意
一般来说exp就写到这里就可以获取到flag,但是此题目LibcSearcher查询不到libc文件 解决办法
寻找libc文件,并查看偏移量量,自己书写上去。
通过libc database search网站查询libc文件
之前执行exp时已经得到了puts的地址为0x7f7b86b92aa0,通过此地址查询libc文件
此题使用的libc文件是libc6_2.27-3ubuntu1.4_amd64
查看偏移量
修改exp
获取flag