整数溢出
上界溢出
上界溢出有两种情况,一种是 0x7fff + 1, 另一种是 0xffff + 1
下界溢出
第一种是 sub 0x0000, 1 == 0xffff,对于有符号来说 0 - 1 == -1 没问题,但是对于无符号来说就成了 0 - 1 == 65535。
第二种是 sub 0x8000, 1 == 0x7fff,对于无符号来说是 32768 - 1 == 32767 是正确的,但是对于有符号来说就变成了 -32768 - 1 = 32767。
[OGeek2019]babyrop
先看开了什么保护
可以看到没有canary保护
主函数在fd>0时会读取数据
1v2 = sub_804871F(buf);
来到这个函数里面
发现
12if ( strncmp(buf, s, v1) ) exit(0);
这里有个判断,如果s和buf的长度不一样会退出程序
在开头加上**/x00**进行绕过
1sub_80487D0(v2);
函数会根据buf这个char型数组的buf[7]进行传参
这个函数read的大小更巨buf[7]
所以buf[7]的字符串的值越大越好 取’/xff’
栈溢出这部分完成后就可以用libc构造ROP完成提权
完整exp
1234567891011121314151617181920212223242526272829303132from pwn import *from LibcSearcher import *context(log_level='debug')libc=ELF('./libc-2.23.so')#p=process('./pwn ...
‘ciscn_2019_c_1题解’
先看下开了什么保护
可以看到只开了NX
进入ida看看函数
主函数没有什么
这里有个选择
终于,在这个函数里面找到了gets函数,可以实现栈溢出
注意:这里输入的值会有个加密的转化,会干扰栈溢出后面有效值覆盖,所以要想办xian法去绕过
if判断里有个strlen函数,strlen的作用是得知字符串的长度,但是遇到’\0‘就会停止,所以我们在构造rop的时候可以在字符串前加上’\00‘来绕过加密
因为没有system bin/sh 现成的函数
现在就可以开始构造ROP
因为64位的程序
所以payload=a”偏移量+8”+pop_rid(这是调用的寄存器)+puts_got表的地址+puts_plt地址
所以可以构造下面的脚本
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162from pwn import *from LibcSearcher import *conte ...
数据库
数据库连接基本用法
列出所有可用的数据库:
1SHOW DATABASES;
选择要使用的数据库:
1USE your_database;
列出所选数据库中的所有表:
1SHOW TABLES;
退出 mysql> 命令提示窗口可以使用 exit 命令,如下所示:
12mysql> EXIT;Bye
或者使用:
1mysql> QUIT;
使用 PHP 脚本连接 MySQLPHP 提供了 mysqli_connect() 函数来连接数据库。
该函数有 6 个参数,在成功链接到 MySQL 后返回连接标识,失败返回 FALSE 。
语法
1mysqli_connect(host, username, password, dbname,port, socket);
参数说明:
参数
描述
host
可选。规定主机名或 IP 地址。
username
可选。规定 MySQL 用户名。
password
可选。规定 MySQL 密码。
dbname
可选。规定默认使用的数据库。
port
可选。规定尝试连接到 MySQL 服务器的端口 ...
前端三件套
html基本模式12345678910111213<!DOCTYPE html><html><head> <title>页面标题(w3cschool.cn)</title></head><body> <h1>我是第一个标题</h1> <p>我是第一个段落。</p></body></html
DOCTYPE声明了文档的类型
<html>标签是 HTML 页面的根元素,该标签的结束标志为</html>
<head>标签包含了文档的元数据(meta),如<meta charset="utf-8">定义网页编码格式为utf-8。
<title>标签定义文档的标题
<body>标签定义文档的主体,即网页可见的页面内容,该标签的结束标志为</body>
<h1>标签作为一个标题使用,该标签的结束标志为< ...
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