echo1是linux64下的溢出题。IDA逆出来的main函数:

echo1函数:

做pwn题的大致思路如下:

  • 找输入点
  • 查看GOT表看是否有可以直接拿来用的系统调用
  • 查找是否有地址固定的全局变量
  • 分析输入点所处函数的堆栈情况并找到溢出点
  • 覆盖rip并构造shellcode

用上述思路来分析这道题:

  1. 对这题而言有三个输入点,一个是main函数中输入name和选择数字,另一个是echo1函数中最长输入128字节。
  2. GOT表中没有system,execv等可以直接拿来用的函数。
  3. o(8bytes),id(4bytes),func(8bytes)是在bss段中未初始化的全局变量。他们的地址固定,o中存放一个malloc出来的指针,在malloc出来的地址中前24bytes存name,接下来是greeting和byebye的函数指针。id中存了name的前2bytes,func中存了echo1,echo2,echo3的函数指针。至此可以发现,o中的8bytes和func中的8bytes无法利用,而id中前两字节即是输入name的前2字节!
  4. main函数中无溢出点,但echo1中可以输入的长度(128bytes)远远超过了安全范围,存在溢出漏洞。

echo1函数堆栈情况如下图:

echo13

最大可输入128bytes,而输入所存的变量s距离rbp只有32bytes,可以覆盖rbp和rip。经过刚才的分析知道,全局变量id地址固定,并且可以存name的前2bytes,那么我们可以将eip覆盖成id的地址,并且在id中存jump rsp的机器码,那么接下来就能跳转到rip上面存着的shellcode,这个过程如下图:

echo14

shell-storm.org/shellcode/这个网站里找现成的64位linux版本的shellcode:

覆盖rip并构造shellcode:

得到shell并查看flag:

echo1

 

观看更多有关 的文章?

*

+
跳转到评论