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

pwnable练习之collision

时间:2019-10-21 11:15:11      阅读:94      评论:0      收藏:0      [点我收藏+]

标签:不能   指针   get   log   length   ret   signed   main   模拟   

col.c代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <string.h>
unsigned long hashcode = 0x21DD09EC;
unsigned long (const char* p){
int* ip = (int*)p;
int i;
int res=0;
for(i=0; i<5; i++){
res += ip[i];
}
return res;
}
int main(int argc, char* argv[]){
if(argc<2){
printf("usage : %s [passcode]n", argv[0]);
return 0;
}
if(strlen(argv[1]) != 20){
printf("passcode length should be 20 bytesn");
return 0;
}
if(hashcode == check_password( argv[1] )){
system("/bin/cat flag");
大专栏  pwnable练习之collisionan class="keyword">return 0;
}
else
printf("wrong passcode.n");
return 0;
}

观察代码,可知代码逻辑过程是:
1.先输入一个不少于20字节长度的值
2.对输入的前五位整数求和(int类型,一个int等于4字节,5位int类型,恰好20字节)
3.求得的和与0x21DD09EC比较,若相等则通过

重点1:

1
int* ip = (int*)p;

这里将输入的char类型的指针强制转换为了int指针,从而ip指针一次能够指向4个字节大小的内存区域。画个图模拟一下内存布局:
技术图片

思路1:将0x21DD09EC除以5变为4字节为一组,分别输入,最后以4字节为一组进行求和即可。
比如:

1
2
3
4
>>> 0x21DD09EC/5
113626824
>>> hex(0x21DD09EC/5)
'0x6c5cec8'

哦,稍等。好像不能被5整除哦。换个方式:4 x 0x01010101 + 0x1dd905e8

1
2
3
>>> hex(0x21DD09EC-4*0x01010101)
'0x1dd905e8'
>>>

接下我们把刚刚的值输入:

1
2
3
col@ubuntu:~$ ./col `python -c "print 16*'x01'+'xe8x05xd9x1d'"`
daddy! I just managed to create a hash collision :)
col@ubuntu:~$

YES,GET FLAG!

pwnable练习之collision

标签:不能   指针   get   log   length   ret   signed   main   模拟   

原文地址:https://www.cnblogs.com/wangziqiang123/p/11712238.html

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