passthis

[src = hackme] passthis

题目描述

You should be able to pass this

WP

直接IDA–>F5,得到一大段代码,仔细查看,有用的就是下面部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
printf("Let me check your flag: ", v9);
fgets(v10, 1023, (FILE *)iob[0]._ptr);
if ( v10[0] > 0xDu )
{
if ( v10[0] == 'F' )
{
v4 = 0;
v5 = 9217;
do
{
v6 = (unsigned __int8)v10[++v4];
if ( (unsigned __int8)v6 <= 0xDu )
{
if ( _bittest(&v5, v6) )
goto LABEL_9;
}
}
while ( ((unsigned __int8)byte_404040[v4] ^ (unsigned __int8)v6) == 0x87u );
}
......(省略)
LABEL_9:
puts("Good flag ;)");
return 0;

其中v10这个数组就是flag,首先判断其首字母是不是‘F’,如果是的话进入循环,我们看到,需要输入的flag满足while的条件,然后才有机会挑战到LABEL_9,(即 goto LABEL_9;) 。所以关键是while里面的循环做了什么操作。其实可以看出,while的条件就是将byte_404040数组里面的每个字节跟flag数组V10的每个字节(在循环中被赋值给v6)进行XOR操作要求结果是0x87u。

所以根据XOR的性质,v6=byte_404040[v4]^0x87u即可,所以从程序的hex-view中把byte_404040数组的内容取出来,然后使用python写下面脚本:

1
2
3
4
5
6
7
8
a=[0xC1,0xCB,0xC6,0xC0,0xFC,0xC9,0xE8,0xAB,0xA7,0xDE,0xE8,0xF2,0xA7,0xF4,0xEF,0xE8,0xF2,0xEB,0xE3,0xA7,0xE9,0xE8,0xF3,0xA7,0xF7,0xE6,0xF4,0xF4,0xA7,0xF3,0xEF,0xE2,0xA7,0xE1,0xEB,0xE6,0xE0,0xFA,0x00]

flag=""

for i in a:
flag+=chr(i^0x87)

print(flag)

运行输出flag。