zoukankan      html  css  js  c++  java
  • pwnable.kr-collision -Writeup

    bof

    pwnable.kr-collision -Writeup

    同第一题fd,
    ssh连接,ls -l查看文件, cat col.c得到代码如下

     1 #include <stdio.h>
     2 #include <string.h>
     3 unsigned long hashcode = 0x21DD09EC;
     4 unsigned long check_password(const char* p){
     5     int* ip = (int*)p;
     6     int i;
     7     int res=0;
     8     for(i=0; i<5; i++){
     9         res += ip[i];
    10     }
    11     return res;
    12 }
    13 
    14 int main(int argc, char* argv[]){
    15     if(argc<2){
    16         printf("usage : %s [passcode]
    ", argv[0]);
    17         return 0;
    18     }
    19     if(strlen(argv[1]) != 20){
    20         printf("passcode length should be 20 bytes
    ");
    21         return 0;
    22     }
    23 
    24     if(hashcode == check_password( argv[1] )){
    25         system("/bin/cat flag");
    26         return 0;
    27     }
    28     else
    29         printf("wrong passcode.
    ");
    30     return 0;
    31 }
    • 分析过程如下:
    • 分析check_password()函数,当strlen(argv[1])==20时,要保证check_password()函数的返回值为0x21DD09EC;

      经分析,check_password()函数的作用为将长度为20的argv[1]分为5段,每段有4个字符,这些字符是以小端的形式存储的,以int *指针的形式每次读取4个字符,将5次读取的值求和

    • 最简单的想法是前16位均为x00,后4位为xECx09xDDx21,但经过测试答案错误,查表得x09为制表符tab,会截断输入,同时x00也会截断输入;
    • 因此构造另一种输入'x01'*16+'xE8x05xD9x1D',分析过程如下:
    • 理解字节序
    • 则可构造语句

      python -c "print 'x01'*16+'xE8x05xD9x1D'"

    x和0x表示16进制的区别:

    • 运行,结果如下,flag为daddy! I just managed to create a hash collision :)

      2017-2-5 0:55;56
  • 相关阅读:
    javascript 获取event
    IE与火狐下兼容(阻止冒泡事件)
    IE和FireFox中JS兼容之event
    不同浏览器中childNodes获取子节点个数
    文档结构和遍历
    爬取拉钩Java招聘数据
    爬取糗事百科的图片
    爬虫框架scrapy安装
    会爬电影神器,是一种什么样的体验,你懂得!!!!!!!
    利用Python的unittest单元测试框架的discover方法批量执行脚本用例
  • 原文地址:https://www.cnblogs.com/WangAoBo/p/6366882.html
Copyright © 2011-2022 走看看