查壳32位
程序运行
获取关键信息
进来没有发现什么不对,那我们就正常分析
首先肯定是看
BOOL __cdecl sub_401110(int a1, int a2)
{
int v3; // [esp+0h] [ebp-10h]
int v4; // [esp+4h] [ebp-Ch]
int v5; // [esp+8h] [ebp-8h]
int v6; // [esp+Ch] [ebp-4h]
v6 = 0;
v5 = 0;
while ( v6 < 38 )
{
v4 = *(unsigned __int8 *)(v6 + a1);
v3 = *(unsigned __int8 *)(v6 + a2);
++v6;
if ( v4 == v3 )
++v5;
}
return v5 == 38;
}
这就是个简单的cmp函数,改个名
然后就是这两个东西
点进来一看,就发现了“position”
一样的jmp,一样的红色
那我们一样的u和p
nop第一个
重新编译函数
正常了
然后再分析一下,就是数组元素加上后一个,最后那一个不变(利用不变的来解密)
同理第二个函数
这个函数比较有意思
a[i]*16 就是a[i]左移4,后面右移,这两个再进行或操作
就是后面四位跑前面去了,前面四位跑后面四位去了
int __cdecl main(int argc, const char **argv, const char **envp)
{
char v4[100]; // [esp+10h] [ebp-68h] BYREF
puts("I poisoned the program... Can you reverse it?!");
puts("Come on! Give me your flag:");
sub_4012A0("%s", v4);
if ( strlen(v4) == 38 )
{
(sub_401000)(v4);
(sub_401080)(v4);
if ( cmp(v4, &unk_403000) )
puts("\nTTTTTTTTTTQQQQQQQQQQQQQLLLLLLLLL!!!!");
else
puts("\nQwQ, please try again.");
return 0;
}
else
{
puts("\nQwQ, please try again.");
return 0;
}
}
那么整体逻辑就出来了
脚本!启动!
a=[ 205, 77, 140, 125, 173, 30, 190, 74, 138, 125,
188, 124, 252, 46, 42, 121, 157, 106, 26, 204,
61, 74, 248, 60, 121, 105, 57, 217, 221, 157,
169, 105, 76, 140, 221, 89, 233, 215]
c=[]
for i in range(len(a)):
a[i]=((a[i]&0xf)<<4)+((a[i]>>4)&0xf)
c.append(a[i])
for i in range(len(c)-2,-1,-1):
c[i]=c[i]-c[i+1]
for i in c:
print(chr(i),end='')
只能说
EZ,嘿嘿嘿