Pwnable.kr 提示之 otp 篇

前前言

本人的个人博客网址:www.QmSharing.space,所有的文章都可以在里面找到,欢迎各位大佬前来参观并留下宝贵的建议,大家一起学习一起成长 :-)

难度分析

本题主要考的是知识面, 它并没有考什么高超的技术, 所以难度来说如果你知道这个知识点, 那么这题简单的不行, 但如果你不知道(和我一样), 那做的就会非常痛苦.

基本检查

  • file
otp: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=f851771b439725c55be4ed4b0e102c2a39f4c196, not stripped

本程序是一个64位动态链接程序, 其他没什么特别

  • checksec
    Arch:     amd64-64-little
    RELRO:    Partial RELRO
    Stack:    Canary found
    NX:       NX enabled
    PIE:      No PIE (0x400000)

我发现 Rookiss 系列中很多题目都是这样又有 Canary 又有栈段不可执行保护的. 这样就导致很多技术都难以被应用, 这种题目通常解题的手段不会很多样.

分析

本题久违的给出了程序源码, 那就直接先审计源码:

int main(int argc, char* argv[]){
        char fname[128];
        unsigned long long otp[2];
        // 必须传入 passcode 参数
        if(argc!=2){
                printf("usage : ./otp [passcode]\n");
                return 0;
        }

        int fd = open("/dev/urandom", O_RDONLY);
        if(fd==-1) exit(-1);
        // 从 /dev/urandom 读取16字节的随机数
        if(read(fd, otp, 16)!=16) exit(-1);
        close(fd);
        // 格式化输出文件名称
        sprintf(fname, "/tmp/%llu", otp[0]);
        FILE* fp = fopen(fname, "w");
        if(fp==NULL){ exit(-1); }
        // 写出至 /tmp/XXX 文件, 写出 8 字节随机数
        fwrite(&otp[1], 8, 1, fp);
        fclose(fp);
        printf("OTP generated.\n");
        // 重新打开 /tmp/XXX 读取刚刚写出的内容
        unsigned long long passcode=0;
        FILE* fp2 = fopen(fname, "r");
        if(fp2==NULL){ exit(-1); }
        fread(&passcode, 8, 1, fp2);
        fclose(fp2);
        // 和我们输入的参数进行比较, 正确就 cat flag
        if(strtoul(argv[1], 0, 16) == passcode){
                printf("Congratz!\n");
                system("/bin/cat flag");
        }
        else{
                printf("OTP mismatch\n");
        }
        // 清理掉临时文件
        unlink(fname);
        return 0;
}
    

整个程序逻辑很简单明了, 我的注释已经在关键位置进行了说明. 官网特别提醒, 本题不是竞争问题, 叫我们不要用暴力算法. 经过基本的审计, 再加上程序自身的限制, 你会发现整个程序基本无懈可击. 但我发现以往的程序读取随机数一般是去找 /dev/random 文件读取, 因此我特地去了解了这两个文件的区别, 以求发现注入点. 刚开始, 我得知 urandom 是非阻塞式的伪随机数生成器, 而 random 是"真"随机生成器, 我还在想有没有办法能让系统的熵值降到 0, 然后生成一样的随机数, 从而破解文件内的随机数.

但是, 这里有两个问题: 1. 随机数的熵值在被消耗达到最低值(目标系统设定是64字节, 通过 cat /proc/sys/kernel/random/read_wakeup_threshold 来查看)会阻塞 random, 这样熵值无法通过任何手段保持稳定. 2. 即使能做到控制熵值, urandom 产生可预测的随机数的条件是要系统刚刚启动, 还没有足够的熵来生成 urandom 的种子这个前提, 但我们是没办法让目标系统重启的, 所以破解 urandom 其实是个"不可能"的任务.

这里我其实有参考了一下网上的一些说法, 才觉得这题脑洞真大. 嗯... 我们是不可以预测随机数, 但如果我们让程序写不出任何内容, 那它再读取一个空文件, passcode 肯定是等于0的. 我不得不承认, 这个想法太特么绝了!!! 因为我是提示性文章, 这里我就提示一个 bash 指令 ulimit (做完这题, 我才觉得这个指令原来这么厉害, 以前真的很少用, 除了为了写出 core file). 如果你直接 man ulimit 是不行的, 会展示 ulimit 函数的说明, 这个指令的说明是整合在 bash 的说明中的, 因此你需要 man bash 然后再搜索 ulimit 这个关键字才行.

<div align=center><font color=red> ========== 进一步剧透分界线 ========== </font></div>

这里涉及下一步的提示, 如果你还没有玩转 ulimit 指令的话, 希望能完成上一步后再看这里.

有些人通过上述方法, 成功限制了程序写出文件大小, 但在服务端执行(或者本地), 会发现报错 "File size limit exceeded (core dumped) ", 然后调试 core 文件, 发现是 SIGXFSZ 信号. 其实, 太过具体的成因我现在也不是很明确, 但是, 如果把它作为子进程执行的话, 并不会触发这个 SIGXFSZ 信号, 这里提示一下 Python 的 subprocess 模块.

答案

解答步骤和 Writeup 可以在我的 Github 中找到: otp writeup

参考链接

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,270评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,489评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,630评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,906评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,928评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,718评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,442评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,345评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,802评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,984评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,117评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,810评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,462评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,011评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,139评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,377评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,060评论 2 355

推荐阅读更多精彩内容