某一次关于接收puts地址的调试

上一篇有个问题没搞明白,这里做了调试:
(注:以前写的顺序乱了,不知道上一篇是哪一篇了)
问题是在上个题中,调用puts输出puts的got表地址的时候,不知道为什么会有拿不到shell的情况,如下:
file

我的猜想是接收的puts的地址不正确的原因,我发现返回的puts的地址每次都不一样
file
file

这三个都能拿到shell

file

当我这样时,得到了下面这样的结果:
file
应该是对recv()接收,.ljust()补位,返回的puts地址到底是什么格式,占多少字节数的理解不到位,基本问题初步明确了

下面来一步一步看:

1.乱码

注释里加上编码方式:
#__coding:utf-8__
file
这样就可以了

2.函数的问题

int recv( socket s, char FAR *buf, int len, int flags);
s : 指定接收端套接字描述符;
*buf : 指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据;
len : 指明buf的长度,这里接收字符串的话就是字符数,接收地址的话就是字节数,地址的两个数字为一个字节;
flag : 一般置0。

str.ljust(width[, fillchar])
返回一个由原字符串使用指定字符填充至指定长度的新字符串。如果指定的长度小于原字符串的长度则返回原字符串。
参数:
width — 指定字符串长度。
fillchar — 填充字符,默认为空格。

3.调试接收的地址:

接收9个字符时:
file
出错,也没有getshell,这里可以看出来了,只要接收偶数个字符时才能正常回显地址格式,而且后面已经接收到了main函数的返回结果‘te’

接收10个字符时:
file
同样后面接收到了字符,’tel’

接收8字节
file
可以看到8个字节时后面已经出现了\nt,这是换行后加上的‘t’,而且存在\xb6Q 这也是一个错误

当我接收7个字符的时候
file
可以看到出现了错误,第二个 \x 后面有三位。但是还是getshell了

而接收6个字节时:
file
就是工整的地址了,但是依然不能用

如果接受的再小一点,4个字节:
file
地址就已经不完整了,但是这里有个%就迷惑,还是可以去得出结论了:

32位时puts的got表地址是6字节的,而要回显出来的话是需要声明编码格式的,填充到8个字节的原因是64进制的地址是16位的,也就是8字节,所以需要填充后才能解包u64()。
正常的接收地址,再填充并解包是这样的:
这个问题就是这样了,之前都没注意,算个教训。

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据