码迷,mamicode.com
首页 > 其他好文 > 详细

pwnable.kr-collision -Writeup

时间:2017-02-05 10:43:21      阅读:1217      评论:0      收藏:0      [点我收藏+]

标签:max   canvas   ica   bof   读取   first   field   parent   repeat-x   

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]\n", argv[0]);
17         return 0;
18     }
19     if(strlen(argv[1]) != 20){
20         printf("passcode length should be 20 bytes\n");
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.\n");
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位为\xEC\x09\xDD\x21,但经过测试答案错误,查表得\x09为制表符tab,会截断输入,同时\x00也会截断输入;
  • 因此构造另一种输入‘\x01‘*16+‘\xE8\x05\xD9\x1D‘,分析过程如下:
    技术分享
  • 则可构造语句

    python -c "print ‘\x01‘*16+‘\xE8\x05\xD9\x1D‘"

\x和0x表示16进制的区别:技术分享

  • 运行shellcode,结果如下,flag为daddy! I just managed to create a hash collision :)
    技术分享
    2017-2-5 0:55;56

 

 

 

pwnable.kr-collision -Writeup

标签:max   canvas   ica   bof   读取   first   field   parent   repeat-x   

原文地址:http://www.cnblogs.com/WangAoBo/p/6366882.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!