首页
论坛
课程
招聘
[分享]pwnable.kr bof day3
2021-1-4 22:43 3690

[分享]pwnable.kr bof day3

2021-1-4 22:43
3690

题目

解题

1 下载 bof 与 bof.c

bof.c 源码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void func(int key){
    char overflowme[32];
    printf("overflow me : ");
    gets(overflowme);    // smash me!
    if(key == 0xcafebabe){
        system("/bin/sh");
    }
    else{
        printf("Nah..\n");
    }
}
int main(int argc, char* argv[]){
    func(0xdeadbeef);
    return 0;
}

我们的目标是执行 system("/bin/sh");
需令 key == 0xcafebabe,key 的初始值为 0xdeadbeef
已知 overflowme 是一个局部数组变量,长度为 32,且通过 gets 获取,没有边界检查,所以可以考虑在执行 gets(overflowme); 把 key 的值覆盖为 0xcafebabe

用 IDA 查看 bof


与源码对照着看
a1 即 key,地址在 ebp + 8h 处
s 即 overflowme[32]; 首地址在 ebp - 2C 处
所以 s 填充 2Ch + 8h = 34h = 52 个字符后,可以覆盖 key 值

构造 payload 并执行


注 cat - 是为了与 shell 保持连接


[看雪官方培训] Unicorn Trace还原Ollvm算法!《安卓高级研修班》2021年6月班开始招生!!

收藏
点赞0
打赏
分享
最新回复 (6)
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
xiaoez 活跃值 2021-1-5 13:01
2
0
小pwn   pwn
雪    币: 2279
活跃值: 活跃值 (2012)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
i乂 活跃值 2021-1-5 20:09
3
0
我慢慢就不那么菜了。。。
雪    币: 233
活跃值: 活跃值 (127)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tfire 活跃值 2021-1-10 22:00
4
0
这题的canary居然只是个摆设。。。我还想了半天。。。
雪    币: 2279
活跃值: 活跃值 (2012)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
i乂 活跃值 2021-1-10 22:10
5
0
tfire 这题的canary居然只是个摆设。。。我还想了半天。。。
源码里没有验证 canary 的语句。。。
雪    币: 233
活跃值: 活跃值 (127)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tfire 活跃值 2021-1-10 23:12
6
0
i乂 源码里没有验证 canary 的语句。。。
readgsdword就是验证canary的,前面是设置,后面ret的时候是验证,而且用checksec也可以看到是有canary的
雪    币: 2279
活跃值: 活跃值 (2012)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
i乂 活跃值 2021-1-12 18:59
7
0
嗷嗷嗷,我做题的步骤有问题,没有考虑 canary
游客
登录 | 注册 方可回帖
返回