-
-
[原创]简单分析南邮实训平台pwn方向第二题 - Stack Overflow
-
-
[原创]简单分析南邮实训平台pwn方向第二题 - Stack Overflow
系统 : Windows xp / ubuntu 32bit
程序 : cgpwna
要求 : 缓冲区溢出执行cat命令
使用工具 :IDA
在linux系统中,使用file命令查看文件的信息:
发现是32位的可执行程序,我们可以先运行一下,了解其输出:
直接用ida载入该程序,按下Shift
+F12
查看字符串列表:
双击字符串bye
查看具体信息,这里通过交叉参考功能定位到main函数,按下F5
查看其伪c代码:
其中的两个函数内容如下:
这里,接收用户输入的函数的fgets函数:
该函数指定了buf的大小,看上去没有什么问题,我们再检查下缓冲区:

这里,缓冲区只有40字节的大小,却指定可以接受60个字节大小的数据呢。我们双击'A'查看详细信息:
我们可以给予缓冲区A超过40字节的数据来替换掉n的值,这样就能溢出缓冲区s的值了:
双击n查看函数栈视图:
此处我们知道,要溢出覆盖n的值,需要40+4个字节的数据填充;而要溢出覆盖函数返回地址,则需要30h+8h=38h(56)个字节的数据。
在ida的函数列表视图中,很轻松的找到了pwnme函数:
我们需要修改函数的参数,然后调用system函数执行cat命令查看flag文件。
再来仔细看看函数的汇编代码:
函数将command字符串的地址放入esp寄存器指向的栈空间,然后调用了system函数。
我们要做的事,就是将要执行的命令放入缓冲区A中(地址固定),然后将缓冲区A的地址,放入esp寄存器指向的栈空间中,最后直接跳转到地址0804852A
调用system函数。
也就是说,我们想要利用漏洞执行cat命令,有两个条件:
我们知道,执行ret时会弹栈,esp会指向函数返回地址的下一格栈单元:

所以不妨填充函数返回地址下方的栈单元为offest A,当ret 指令跳转执行call system命令时,esp也指向了缓冲区A的地址。
按照以上推理,用python编写shellcode如下:
连接服务器,用生成的文件作为输入:
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2019-3-1 13:55
被顾言庭编辑
,原因: