首页
社区
课程
招聘
[原创]ret2shellcode 浅析
发表于: 2026-8-27 12:00 506

[原创]ret2shellcode 浅析

2026-8-27 12:00
506

学了Ret2Text之后大家肯定有一个问题,就是如果没有BackDoor的时候怎么办呢,那么Ret2Shellcode了解一下

Ret2Text 是指可以直接调用text里的函数,那么Ret2Shellcode就是指,我们可以直接自己构建一个函数。

程序存在缓冲区溢出漏洞,且栈空间可执行(无 NX 保护) ,我们可以将自定义的 shellcode(机器码指令)写入程序栈中,再通过溢出覆盖函数返回地址,让程序执行流跳转至栈上的 shellcode,最终弹出系统 shell。

存在栈缓冲区溢出漏洞;

未开启 NX 保护(栈可执行);

可以泄露/精准计算出栈地址;

写的比存的多,或者说是比预分配的多,这个时候确认栈溢出漏洞存在,rax 分配了0x40个大小,但是read能读取0xc8肯定存在栈溢出。

image

那实际上只要覆盖满0x40+8就能到达ret的位置。可以看一下模拟图

image

由于这里没有可以直接利用的函数,所以我们需要自己创造一个函数出来。我们需要创造的函数是:

在amd64的环境下,它对应的机器码是

这里pwntools提供了一个快速生成shellcode的模块。通过如下的方法就可以直接生成,当然你也可以用上面的进行复制粘贴

现在我们要根据软件的格式进行转换

然后我们知道后面的ret就是跳转地址,在之前的内容,我们这里需要写的是跳转地址,但是在这里我们需要写Shellcode的地址。这里我看在后面多余的跳转位置写。

那么写这个之前就要知道内存地址,在源码里也进行了对应的内存地址打印。如果是本地练习的话,可以关闭地址随机化 ASLR,保证栈地址固定,方便漏洞复现。

运行一下就可以拿到地址

那么我们就知道初始的buf就是0x7fffffffe300​,那么经过0x40+8​的偏移,并且还要算上ret的8​位便宜,所以最终地址就是0x40+16

运行一下最终拿到shell权限

image

ok,以上就是最简单最基础的Ret2Shellcode

远程地址:25cK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3S2T1j5#2)9J5k6h3S2S2L8$3u0S2j5$3S2S2L8X3N6Q4x3X3g2U0L8$3#2Q4x3V1k6K6k6h3g2Q4y4h3k6T1N6h3N6Q4y4h3k6G2L8X3g2Q4x3@1k6A6k6q4)9K6c8o6p5@1x3e0l9`.

之前由于我们关了ASLR,所以每次地址都是固定,所以我们通过硬编码的形式写了exp,但是很多情况在远程主机默认就是开启了ASLR。那么这个时候怎么办。

首先先nc连接一下,多执行几次就知道每次的buf都不一样。

image

image

那么这里我们就需要动态提取一下

持续接收数据,直到读到指定的分隔字节串 delim,然后停止接收;返回【包含 delim 本身】的所有收到的数据。

持续接收数据,直到读到换行符 \n​ 就停止,返回包含末尾 \n 的这一行字节数据。

然后写一下py,运行

这样就能动态的提取buf_addr了

image

ok,现在我们进行分析,看到首先是开辟了一个0x50的空间,然后read可以读取0xc8的内容,那么就可以判断这里是存在栈溢出的。

image

那么我们可以采用之前的方法来写poc,专门增加了注释,大家感兴趣的可以逐行研究。

执行一下,拿到flag

image

如果遇到这样一个场景就是在当后面的缓存区不够用的时候怎么办,举个例子

比如这里,我们知道这里肯定是存在溢出的,首先你需要至少16个字节才能改写ret,Shellcode自己也是要占用内存的,64+16=80,再继续往后写空间是不够的。聪明的你肯定想到,那是不是可以在前面写,然后跳转,这样空间就够了。

现在来写poc,这里咱们先从头写Shellcode

然后算出偏移

最终脚本就是:

执行一下

image

有一道远程的题目,大家可以练习一下:

c33K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3S2T1j5#2)9J5k6h3S2S2L8$3u0S2j5$3S2S2L8X3N6Q4x3X3g2U0L8$3#2Q4x3V1k6K6k6h3g2Q4y4h3k6T1N6h3N6Q4y4h3k6G2L8X3g2Q4x3@1k6A6k6q4)9K6c8o6p5@1x3e0p5`.


传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!!

收藏
免费 0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回