-
-
[原创]pwnable.kr collision day2
-
发表于: 2021-1-3 20:45 7083
-
发现 col 用户无 flag 的读权限
我们的目标是运行第 25 行代码,获得 flag 内容。
首先我们需要输入一个 20 字节的 passcode
由 check_password() 可知,20 字节的字符串被转换成 5 组数字,返回值为五组数字的和,所以 passcode 由 5 个和为 0x21DD09EC 的数构成,如四个 0x01010101 与一个 0x1DD905E8。
注:Ubuntu 16。04 是小端字节序,注意数字写法,且此处不能使用四个 0x00000000 因为 0x00 是一个截断字符,程序读入argv[1]时如果遇到了0x00会自动截断,其他只要满足 5 个数和为 0x21DD09EC 即可
由于标准输入中,非字母数字以及符号的ASCII字符并不好输入,可利用 python 生成:
在终端输入
获得flag
char
16
位
2
字节
int
32
位
4
字节
小端字节序:little
-
endian,将低字节存放在内存的起始地址
大端字节序:big
-
endian,将高字节存放在内存的起始地址
Linux系统大小端判断
法一:lscpu | grep Endian
法二:echo
-
n I | hexdump
-
o | awk
'{ print substr($2,6,1); exit}'
返回值为
0
是大端,为
1
是小端
char
16
位
2
字节
int
32
位
4
字节
小端字节序:little
-
endian,将低字节存放在内存的起始地址
大端字节序:big
-
endian,将高字节存放在内存的起始地址
Linux系统大小端判断
法一:lscpu | grep Endian
法二:echo
-
n I | hexdump
-
o | awk
'{ print substr($2,6,1); exit}'
返回值为
0
是大端,为
1
是小端
```
#include <stdio.h>
#include <string.h>
unsigned
long
hashcode
=
0x21DD09EC
;
unsigned
long
check_password(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 bytes\n"
);
return
0
;
}
if
(hashcode
=
=
check_password( argv[
1
] )){
system(
"/bin/cat flag"
);
return
0
;
}
else
printf(
"wrong passcode.\n"
);
return
0
;
}
```
```
#include <stdio.h>
#include <string.h>
unsigned
long
hashcode
=
0x21DD09EC
;
unsigned
long
check_password(const char
*
p){
int
*
ip
=
(
int
*
)p;
int
i;
int
res
=
0
;
for
(i
=
0
; i<
5
; i
+
+
){
res
+
=
ip[i];
}
return
res;
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
他的文章
- [原创]pwnable.kr horcruxes 10754
- [分享] pwnable.kr blukat 9974
- [分享] pwnable.kr unlink 9473
- [分享] pwnable.kr asm 10671
- [分享] pwnable.kr memcpy 10450
看原图
赞赏
雪币:
留言: