通过gdb调试,可以看到main函数调用一个函数,这个函数内调用两次myRead进行输入字符串,
通过查看,可以看到输入缓存区的地址,第一个输入缓存区地址为0x804a060,是一个真实地址,

image.png
第二个缓存区是栈中的地址,

image.png
因为第二个缓存区是栈中的地址0xffffcfb0,方便进行与ebp相减,0xffffcfd8-0xffffcfb0得出长度为40个字节。也就是我们需要44个字节才可以把覆盖到ebp,后面的4个字节是ret的地址。
然后需要开始写shellcode,写shellcode的关键就是进入到/bin/sh目录下,需要用到函数execv,我是从网上找了一个最简单的shellcode修改了一下,编译完测试是可以正常执行的。

image.png

image.png
然后获得这个shellcode的字节码

image.png
最后需要把shellcode输入,然后ret处写入shellcode的地址。我把shellcode作为第二次输入,然后用a把剩下的字节补齐,再把第二个输入缓存区的地址写在后面,“a”*19的原因是字节码已经占了25位,一共需要44位,所以剩下的19位用a填充

image.png
但是发现一直无法执行,对进程debug后,发现这个缓存区地址是无法访问的,

image.png
于是想改写shellcode把地址往栈外引,但是发现第一个缓存区地址是真实的地址,于是将shellcode在第一个缓存区写入,第二个缓存区进行溢出,ret处的地址写第一个缓存区的地址,

image.png

image.png
于是可以成功拿到shell