国内网上关于pwn的知识零零散散,pwn门槛高、难入门,而且关于pwn环境的搭建以及IDA的使用更是没有系统的教程,或者是教程老旧过时。此次环境搭建,基于虚拟机上的Ubuntu18.04的32位和64位系统、pwntools,与Windows上的IDA7.0进行远程调试,是根据i春秋Linux pwn入门教程系列进行环境的配置和补漏。这期间踩了许多坑,原本尝试在docker上使用32位和64位系统来进行远程调试,但是IDA远程时出现:The file can‘t be loaded by the debugger plugin,尝试了许多解决方案,未能解决,于是只能使用两个虚拟环境来搭建,如果有大佬知道如何解决,请不吝赐教,感谢!
在IDA所在的文件夹的dbgsrv
文件夹下找到需要的调试服务器linux_server(32位)
和linux_serverx64(64位)
并复制到Ubuntu主目录中。如果没有可执行权限,则需要给这两个文件赋予可执行权限:
chmod 777 ./linux_server
chmod 777 ./linux_serverx64
然后执行命令:
./linux_server
此时我们可以看到Linux_server的版本为1.22、正在监听23946端口。
接着打开32位的ida,载入heapTest_x86,在左侧的Functions window中找到main函数,随便挑一行代码按F2下一个断点。在Debugger中选择Remote Linux debugger,然后通过Debugger->Process options...
打开选项窗口设置远程调试选项。Hostname就是Ubuntu的ip地址:
密码就是Ubuntu的密码,填写完成后点击OK,按F9快捷键运行程序。若连接正常可能提示Input file is missing:xxxxx,一路OK就行,IDA会将被调试的文件复制到服务器所在目录下,然后汇编代码所在窗口背景会变成浅蓝色并且窗口布局发生变化。
F8:单步跨入函数,F7:单步不跨入函数,F4:运行到指定位置。随着程序的调试执行,我们可以看到运行调试服务器的shell窗口会显示出新的内容:
首先我们需要安装pwntools:
sudo pip install pwntools
其官方文档地址:
将heapTest_x86导入到Ubuntu主目录中,然后执行命令:
socat tcp-listen:10001,reuseaddr,fork EXEC:./heapTest_x86,pty,raw,echo=0
将heapTest_x86的IO转发到10001端口上。
然后运行python,使用from pwn import *
导入pwntools库。然后使用io = remote("192.168.112.134", 10001)
与heapTest_x86连接。这个时候我们返回到IDA中设置断点。需要注意的是此时heapTest_x86已经开始运行,我们的目标是附加到其运行的进程上,所以我们需要把断点设置在call ___isoc99_scanf
等等待输入的指令运行顺序之后,否则由于计算机的运行速度,我们的断点将会因为已经目标指令已经执行完而失效,达不到断下来的效果。
选择Debugger->Attach to process...
,附加到./heapTest_x86的进程上
然后IDA进入到调试模式。
这几行指令实际上是执行完sys_read后的指令,此处我们不需要关心它,直接按F9,选中标志会消失。回到python窗口,我们使用pwntools的recv/send函数族来与运行中的heapTest_x86进行交互。首先输入io.recv(),我们发现原先会在shell窗口出现的菜单被读出到python窗口里了。
然后使用io.sendline('1')
选择1,然后回到IDA,我们就发现到了断点处了。
当我们希望结束调试时,应该使用io.close()
关闭掉这个io。否则下一次试图attach时会发现有两个./heapTest_x86
进程。在IDA中按Ctrl+F2
即可退出调试模式。
·如果在IDA中调试时,按下F9,出现Incompatible debugging server:protocol version is 19,expected 22
类似错误,那么就是linux_sever的版本与IDA的版本不相符,可以重新下载一个IDA,然后将其linux_sever放入Ubuntu中运行查看版本,找到对应版本即可。
·pwntools下载到一半出错,检查下pip更新,下载出错多下载几次就可以了,玄学问题,估计就是网络原因。