栈溢出ret2xx系列
0x01预备知识*bss段通常是指用来存放程序中未初始化的全局变量的一块内存区域。**data段通常存放程序中已经初始化的全局变量的一块内存区域。
text段是存放程序执行代码的一块内存区域,称为代码段。
rodata段是存放C中的字符串和#define定义的常量*
*p32 p64:将一个数字转换为字符**u32 u64*:将字符转换为数字或者说p32、p64是打包为二进制,u32、u64是解包为二进制
0x02ret2textret2text就是执行程序中已有的代码。例如程序中写有system等系统的调用函数(这便是已有的代码),我们就可以利用控制已有的gadgets(以ret及结尾的指令序列,通过这些指令序列,可以修改某些地址的内容)控制system函数。
题目解析 jarvisoj_level2个人分析只要是没有调用题目中的函数,返回地址是system的,就没有函数调用过程,后面要接虚拟地址
32位程序中,参数在函数后面
123payload构造:payload = padding + sys_plt + 虚拟地址 + system()参数"/bin/sh" ...
ret2libc
ret2libcret2libc 即控制函数的执行 libc 中的函数,通常是返回至某个函数的 plt 处或者函数的具体位置 (即函数对应的 got 表项的内容)。一般情况下,我们会选择执行 system(“/bin/sh”),故而此时我们需要知道 system 函数的地址。
当程序的NX enable开启,写入shellcode没有执行权限,又或者程序开有ASLR保护(随机地址),每次执行程序想利用的函数地址都是变化的时,我们就可以考虑用libc里的函数动态得到system函数地址与/bin/sh字符串地址
step1 32bit or 64bit?12ret2libc1$ file ret2libc1ret2libc1: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=fb89c86b266de4ff294489da59959a62f7aa1 ...
ret2syscall
ret2syscallret2syscall,即控制程序执行系统调用,获取 shell
step1 32bit or 64bit?12pwn3文件$ file roprop: ELF 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.24, BuildID[sha1]=2bff0285c2706a147e7b150493950de98f182b78, with debug_info, not stripped
step2 checksec源程序为 32 位,开启了 NX 保护
1234567pwn3文件$ checksec rop[*] '/home/pwn/桌面/pwn3文件/rop' Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: ...
ret2shellcode
ret2shellcode在栈溢出的攻击技术中通常是要控制函数的返回地址到自己想要的地方执行自己想要执行的代码。ret2shellcode代表返回到shellcode中即控制函数的返回地址到预先设定好的shellcode区域中去执行shellcode代码,这是非常危险的。
step1 32bit or 64bit?1命令:file <.ELF>
123ROP$ file ret2shellcode ret2shellcode: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=47e6d638fe0f3a3ff4695edb8b6c7e83461df949, with debug_info, not strippedROP$ gdb ./ret2shellcode
step2 checksec1命令:checksec <.ELF& ...
超简单的Stack Overflow
超简单的Stack OverflowIDA12345678910//反编译伪代码int __cdecl main(int argc, const char **argv, const char **envp){ setbuf(stdin, 0); setbuf(stdout, 0); puts("Have you heard of buffer overflow?"); vulnerable(&argc); puts("It seems that you know nothing about it ......"); return 0;}
12345678//双击vulnerable,进入vulnerable函数,发现gets(),调试时可以在此输入数据int vulnerable(){ char s[12]; // [esp+8h] [ebp-10h] BYREF gets(s); return 0;}
由[ebp-10h]可以知道此处距离ebp为0x10个字节,后面用gdb调试 ...
保护机制和编译
内存保护机制ASLR (Address Space Layout Randomization)随机化栈上的地址
•/proc/sys/kernel/randomize_va_space = 0:没有随机化。即关闭 ASLR
•/proc/sys/kernel/randomize_va_space = 1:保留的随机化。共享库、栈、mmap() 以及 VDSO 将被随机化
•/proc/sys/kernel/randomize_va_space = 2:完全的随机化。在randomize_va_space = 1的基础上,通过 brk() 分配的内存空间也将被随机化
123# 在Ubuntu上输入以下命令,可以发现系统开启了ASLRROP$ cat /proc/sys/kernel/randomize_va_space2
PIE (Position-Independent Executable)•随机化ELF文件的映射地址(随机化bss、data、text段地址)
•开启 ASLR 之后,PIE 才会生效
The NX bits (the No-eXecute bits)•通过在内存页的 ...
pwndbg调试
pwndbg调试1.b xx 设置断点(b是breakpoint的缩写)
123b 函数名 # 在指定函数的起始处设置断点b *地址 b 行号
2.r 运行的意思(r是run的缩写),一般用来代码开始运行,或者重新运行(如果调试到一半又想从头开始运行)
1234n(不会进入函数内部)s(会执行到函数内部)cstart(无断点时)
c:继续执行(c是continue的缩写),当执行r运行到某个断点后,后面想继续执行到下一个断点或者把剩下代码执行完毕,就可以使用cn:next的意思,执行当前行代码 (当前行是指源程序里的一行代码,就相当于汇编的多条指令)s:step的意思,当一行代码里有函数调用,那么执行s会跳入函数里执行,如果没有函数调用,那么效果和n相同。看到有想要控制的函数时,就用s,比如ret2text中的vulnerable函数,进入函数内部,再用n运行代码,输入数据调试。
3.info xx12345678info b #查看断点信息(copy)info locals #查看局部变量(copy)info register #查看寄存器(register可 ...
基本linux操作
[TOC]
基本linux操作基本知识科普Ubuntu基于Debian发行版和Gnome桌面环境,而从11.04版起,Ubuntu发行版放弃了Gnome桌面环境,改为Unity。从前人们认为Linux难以安装、难以使用,在Ubuntu出现后这些都成为了历史。
广义的Debian是指一个致力于创建自由操作系统的合作组织及其作品,由于Debian项目众多内核分支中以Linux宏内核为主,而且Debian开发者 所创建的操作系统中绝大部分基础工具来自于GNU工程 ,因此 “Debian” 常指Debian GNU/Linux。
susu命令不能切换root,提示su: Authentication failure,只要你sudo passwd root过一次之后,下次再su的时候只要输入密码就可以成功登录了。
apt命令apt(Advanced Packaging Tool)是一个在 Debian 和 Ubuntu 中的 Shell 前端软件包管理器。apt [options] [command] [package …]options:可选,选项包括 -h(帮助),-y(当安装过程提示选择 ...
OSI模型
OSI七层模型的设计灵感来自哪里?当年制定OSI模型的研究人员,在酒吧喝酒的时候,聊起了白雪公主这部电影,有人就提问了:“要是知道七个小矮人的名字?老子就给谁续杯!“还真有人把七个名字写在了餐巾上,这个时候有位兄弟酒精上头,说这七个小矮人不正好可以拿来作为网络模型吗?于是餐巾都不舍得扔掉。第二天研究人员就闻着这还带有酒味的餐巾开会,一致同意把网络模型划分为7层,这就是折磨人多年的OSI网络参考模型,注意我这里说的是参考,也就是说OSI网络实际中并不使用,我们只是把OSI网络模型作为参考。
在网络出现问题的时候,可以从一个宏观的整体去分析和解决问题,而且搭建网络的时候也并不一定需要划分为7层,但是当今互联网广泛使用的是TCP/IP网络模型,原本只有4层,随着人们的不断实践后发现,其实划分为5层会更加符合实际.
但为什么还老面试官喜欢问OSI模型呢?其实OSI七层的名字并不难记,七层里的知识才是最复杂的,谁能把这里头的知识都关联起来,遇到问题的时候就能快速处理和解决问题。OSI模型的目的其实很简单,就是为了解决主机之间的网络通讯。比方说华为电脑要和苹果电脑互联,但他们是不同的公司,就有点像 ...