level3
Posted on
|
In
攻防世界
0x01 寻找漏洞
1 | xfgg@ubuntu:~/Downloads$ checksec level3 |
0x02 思路分析
1 | 构造payload: payload=’A’0x88+’A’4+p32(plt_write)+p32(main_addr)+p32(1)+p32(got_write)+p32(4) |
0x03 攻击
1 | write函数和libc泄露,写入system('/bin/sh') 最好使用dynelf模块 |
exp
1 | from pwn import * |
pwn1
Posted on
|
In
BUUCTF
0x01 寻找漏洞
1 | 很简单的栈溢出 |
0x02 思路分析
1 | 不解释,前面有一样的 |
exp
1 | from pwn import * |
forgot
Posted on
|
In
攻防世界
0x01 寻找漏洞
1 | xfgg@ubuntu:~/Downloads$ checksec forgot |
1 | 发现有两处溢出点 |
1 | 可以观察到箭头处是个函数指针,&v3 是v3在栈上的地址,&v3 + --v14 是根据&v3在栈上移动,上面的for循环是用来改变v14的值,根据溢出点函数指针v3到v12 ,变量v14都可以被我们控制,接下来再找找有没有system函数 |
1 | 发现目标函数 |
0x02 思路分析
1 | 接下来我的想法是利用缓冲区溢出把函数指针v12 覆盖为地址0x080486cc,接下来再控制v14的值为10, 那么 &v3+ --v14 便会指向 |
exp
1 | from pwn import * |
warm up
Posted on
|
In
攻防世界
0x01 寻找漏洞
1 | xfgg@ubuntu:~/Downloads$ checksec warmup |
0x02 思路分析
1 | 利用栈溢出覆盖gets中的v5,写入system函数的地址即可 |
0x03 攻击
1 | 非常简单的64位栈溢出 |
exp
1 | from pwn import * |
dice game
Posted on
|
In
攻防世界
0x01 寻找漏洞
1 | 题目考察的是:rand()生成的随机数和随机种子seed()有关,通过观察题目,可以发现存在溢出漏洞,通过输入可以覆盖到seed(),实现一个可预测的随机数列。 |
1 | buf覆盖0x40位就能覆盖到seed |
1 | sub_A20()如下,就是比较你输入的数是否和产生的随机数相等 |
1 | 当回答正确50次时,会执行sub_B28这个函数,读取flag。 |
0x02 思路分析
1 | 所以我们要做的就是,将seed覆盖掉,并且去预测生成的随机数。 |
exp
1 | from pwn import * |
int_overflow
Posted on
|
In
攻防世界
0x01 寻找漏洞
1 | xfgg@ubuntu:~/Downloads$ checksec int_overflow |
1 | read 函数处可以进行溢出,但是需要经过 check_passwd 函数才能将跳出login。现在再看一下 check_passwd 函数内部, |
1 | v3 = strlen(s);造成整数溢出的一个点,我们再看一下此处的汇编代码。 |
1 | call strlen 之后 返回值放在了al寄存器中,这是一个八位的积存器,也就是说如果 s 字符串的长度 大于255 就会造成 整数溢出。 再加上四字节就可以溢出 |
0x02 思路分析
1 | 我们需要进到else里,将 read 读进来的 s 复制到 dest 中,是一个可以利用的栈溢出。 |
0x03 攻击
1 | 栈溢出漏洞 加一个整数漏洞 |
exp
1 | from pwn import * |
cgpwn2
Posted on
|
In
攻防世界
0x01 寻找漏洞
1 | xfgg@ubuntu:~/Downloads$ checksec cgpwn2 |
0x02 思路分析
1 | 在找关键字符串的时候没有发现 bin/sh 。所以我们需要将bin/sh写到我们可以访问的地址中去。我们可以在输入name的时候把 bin/sh写进去。name位于bss段,bss段保存全局变量,加载地址不会因为地址随机化的开启而有所变化。 |
0x03 攻击
1 | 普通的栈溢出攻击 有system但是没有/bin/sh |
exp
1 | from pwn import * |
格式化字符串漏洞
Posted on
|
In
理论知识
格式化字符串漏洞基本原理
1 | 格式化字符串漏洞在通用漏洞类型库CWE中的编号是134,其解释为“软件使用了格式化字符串作为参数,且该格式化字符串来自外部输入”。会触发该漏洞的函数很有限,主要就是printf、sprintf、fprintf等print家族函数。介绍格式化字符串原理的文章有很多,我这里就以printf函数为例,简单回顾其中的要点。 |
1 | 以上图为例,假设调用printf(str)时的栈是这样的。 |
基本的格式化字符串参数
1 | %c:输出字符,配上%n可用于向指定地址写数据。 |
string
Posted on
|
In
攻防世界
0x01 寻找漏洞
1 | xfgg@ubuntu:~/Downloads$ checksec string |
0x02 思路分析
1 | 现在 地址有了,利用格式化字符串 将 *a1 == a1[1],成功进入脆弱点,写入shellcode。 |
0x03 攻击
1 | 格式化字符串漏洞请看另一篇文章。 |
exp
1 | from pwn import * |