rop
123
ROP原理
在栈缓冲区溢出的基础上,利用程序中已有的小片段(gadgets)来改变某些寄存器或者变量的值,从而控制程序的执行流程
一般gadgets的指令时查找RIP寄存器
syscall原理:(64位)123456syscallrax 0x3brdi "/bin/sh"rsi 0rdx 0syscall_addr
过程:1.首先找到/bin/sh,或者找到sh
2.溢出之后,pop rax rdi rsi rdx
3.找到syscall 的地址(这个要找syscall 后面又retn的)
如果没有/bin/sh的地址
4.先利用syscall 写入/bin/sh\x00
注:不能直接写在栈上,因为栈的位置是随机的
如何写入:
在DATA段写入数据
带align (对齐)的写入完全没有影响
调用read
1read(0 写入的地址 写入的长度)
32位12345eax 0xbebx ...
[第五空间2019 决赛]PWN5题解
先检查开了什么保护
这里有canary 所以不可以直接栈溢出
打开ida查看
可以看到21行
1printf(buf)
这里有格式化字符串的漏洞
函数只需第一个读取的和第二次输入的一致就会执行拿到权限
可以看到,aaaa在第十个被解释成格式化字符串
fmtstr_payload函数:
fmtstr_payload 函数会根据提供的偏移量和写入内容,生成一个用于触发格式化字符串漏洞的 payload。这个 payload 在被输出时会利用格式化字符串的特性,动态地将指定的数据写入到指定的地址上
所以可以将第一个从文件中读取的变成我们写入的内容
接着运行
level0题解
12
先查看这个函数开了什么保护
什么都没有
打开ida看看
主函数没有什么
点进return的那个函数
这里buf只有128,但是读取的不止,可以栈溢出
在pwndbg中调试
在读取前面打个断点
因为buf只有128的位置,这里输入了128个’a‘
可以看到,栈上已经满了
可以知道栈的空间大小为128
返回ida
按住shift 和F12
看到了/bin/sh
点开
找到这个提权函数
找到位置
可以开始写脚本了
运行
解除
pwndbg i386报错解决
注:Ubuntu的版本为18.04
先挂个网址
https://gugesay.com/archives/1598
按照这里的操作先把两个文件并执行
如果还是不行就按下述指令来
1sudo dpkg -i lib64gcc1_10-20200411-0ubuntu1_i386.deb
输入密码后又报错没关系
继续输入
12sudo dpkg -i gcc-10-base_10-20200411-0ubuntu1_i386.debsudo dpkg -i lib64gcc1_10-20200411-0ubuntu1_i386.deb
再输入下面的内容
123sudo apt-get -f instalgit init./setup.sh
这里出现下面的报错不要紧,输入下面的指令
123su //进入管理员模式apt --fix-broken installexit //退出管理员模式
这步完成之后再输入
1./setup.sh
中间可能会有网络问题导致下载失败,多试几次就好了
出现这样就基本上可以了
最后输入gdb测试一遍
成功!!!!!
warmup_csaw_2016题解
先查看开了什么保护,什么都没有
再用ida打开查看
gets函数是危险函数
从gets函数开始栈溢出,因为要返回到拿权限的位置,现在去找拿权限的位置
第一行是引用pwn的函数库
第二行是连接服务器
第三行是数据流,因为gets v5的空间大小是64,又因为是64位的程序,所以要加上8位
计算偏移地址第二种方法:使用gdb-peda
先输入:pattern creat 200
生成200数据
在输入:
contin
把之前生成的数据粘贴上去
找到RBP寄存器
把后面的字符串复制下来
输入:pattern offfset XXXXXXXX
得到了偏移量
构造playload时,直接与系统调用地址相加就可
第四行是发送数据,进行攻击
拿到flag
栈溢出
栈溢出canary保护机制
原理:在函数的入口处,从寄存器中取出一个值存放到栈上,当函数结束时检查这个值是否和存进去的值一致
绕过canary的方法
格式化字符串
canary爆破
stack smashing
劫持_stack_chk_fail
csapp2(第三章)
程序的机器级表示过程
形式:函数,方法,子例程,处理函数等
运行时栈栈帧
当x86-64 过程中需要的储存空间超出寄存器的大小时,就在栈上分配空间
转移控制传递参数的顺序
超过6位的地方就用栈
数组的分配与运用指针数组每个单位的大小都位8位
csapp(第三章)
程序的机器级表示程序编码机器级代码计算机系统利用抽象模型产生细节
1.指令集体系结构或指令级架构(它是软硬件之间的“合同”):定义了处理器状态、指令的格式、指令对状态的影响
2.使用的内存地址是虚拟地址:机器代码将内存看成一个按字节寻址的数组
程序处理器:给出将要执行的下一条指令在内存中的地址
整数寄存器文件包含16个命名的位置,分别储存64位的值。(可以储存地址或者整数数据)
条件码寄存器保存着最近算数或逻辑的指令的状态信息。(可用来实现if while函数)
一组向量寄存器可以储存一个或者多个整数或者浮点数值
操作系统负责管理虚拟地址空间,将虚拟地址翻译成实际处理器中的物理地址
代码具体先创建一个c代码
1touch +“文件名”.c
vim “文件名”.c
123gcc -Og -S ""//预处理代码,可生成.s后缀的文件gcc -Og -c ""//编译并汇编代码,可生成.o后缀的文件objdump -d ""//objdump是一种反汇编程序,反汇编该代码
链接器的任务之一就是为函数找到匹配的可执行代 ...
csapp4
整数运算无符号加法
当 x+y >= 2^w,实际结果为 s = x+y-2^w
x+y,s = (x+y) % 2^w
检验溢出的方式:如果 s<x,说明溢出
无符号数的非~x = 2^w - x (x>0)
~x=x(x=0)
补码加法当 x+y >= 2^(w-1), s = x+y-2^w
当 x+y < -2^(w-1),s = x+y+2^w
正溢出的结果是负数,负溢出的结果是正数。
检验溢出的方式:当 x,y>0 而 s<=0 是正溢出;当 x,y<0 而 s>=0 是负溢出
补码的非当 x = TMin,-x = TMin
当 x ≠ TMin,-x = -x
补码(Two’s Complement)是一种在计算机系统中表示有符号整数的方法。对于一个给定的二进制数,补码是通过以下步骤得到的:
取反:将所有的1变为0,所有的0变为1(除了最高位符号位)。
加一:将取反后 ...