攻防世界逆向高手题之elrond32
继续开启全栈梦想之逆向之旅~
这题是攻防世界逆向高手题的elrond32
下载附件,照例扔入exeinfope中查看信息:
32位ELF文件,无壳,扔入32位IDA中查看伪代码信息,有Main函数看main函数:
.
.
额,看上去好像比较简单,int __cdecl main(int a1, char **a2)中a1是命令行传入参数的个数,起始值为1,a2是命令行传入参数的数组,a2[0]存的是程序名称,所以才有a1的起始1。我们传入的参数从a2[1]开始。
.
.
分析代码:
int __cdecl main(int a1, char **a2)
{
if ( a1 > 1 && sub_8048414(a2[1], 0) ) //这里标识传入一个参数
{
puts("Access granted");
sub_8048538((int)a2[1]);
}
else
{
puts("Access denied");
}
return 0;
}
.
.
跟踪sub_8048414函数:
int __cdecl sub_8048414(_BYTE *input_flag, int a2)
{
int result; // eax
switch ( a2 ) // a2=0
{
case 0:
if ( *input_flag == 'i' )
goto LABEL_19;
result = 0;
break;
case 1:
if ( *input_flag == 'e' )
goto LABEL_19;
result = 0;
break;
case 3:
if ( *input_flag == 'n' )
goto LABEL_19;
result = 0;
break;
case 4:
if ( *input_flag == 'd' )
goto LABEL_19;
result = 0;
break;
case 5:
if ( *input_flag == 'a' )
goto LABEL_19;
result = 0;
break;
case 6:
if ( *input_flag == 'g' )
goto LABEL_19;
result = 0;
break;
case 7:
if ( *input_flag == 's' )
goto LABEL_19;
result = 0;
break;
case 9:
if ( *input_flag == 'r' )
LABEL_19:
result = sub_8048414(input_flag + 1, 7 * (a2 + 1) % 11);// 修改input_flag的地址,a2重新赋值,递归调用。
else
result = 0;
break;
default:
result = 1;
break;
}
return result;
}
这里我们先写脚本逆向这个逻辑先,只要保证每个返回的都是1即可:
a2=0
flag=""
for i in range(32):
a=a2
if a==0:
flag+='i'
elif a==1:
flag+='e'
elif a==3:
flag+='n'
elif a==4:
flag+='d'
elif a==5:
flag+='a'
elif a==6:
flag+='g'
elif a==7:
flag+='s'
elif a==9: #python写c语言的
flag+='r'
else:
break
a2=7 * (a2 + 1) % 11
print(flag)
print(len(flag))
.
.
结果,一个8位的字符串:
.
.
跟踪下一个 sub_8048538((int)a2[1])函数:
int __cdecl sub_8048538(int input_flag)
{
int v2[33]; // [esp+18h] [ebp-A0h] BYREF
int i; // [esp+9Ch] [ebp-1Ch]
qmemcpy(v2, &dword_8048760, sizeof(v2));
for ( i = 0; i <= 32; ++i )
putchar(v2[i] ^ *(char *)(input_flag + i % 8)); //一个简单的异或操作然后输出,%8对得上前面输出的8位字符串
return putchar(10);
}
.
.
写IDA脚本打印dword_8048760数组内容:
addr=0x8048760
list=[]
for i in range(33):
list.append(Dword(addr+4*i))
print(list)
.
.
.
.
复制粘贴数组,重新修改脚本内容:
a2=0
flag=""
v2=[15, 31, 4, 9, 28, 18, 66, 9, 12, 68, 13, 7, 9, 6, 45, 55, 89, 30, 0, 89, 15, 8, 28, 35, 54, 7, 85, 2, 12, 8, 65, 10,20]
flag2=""
for i in range(32):
a=a2
if a==0:
flag+='i'
elif a==1:
flag+='e'
elif a==3:
flag+='n'
elif a==4:
flag+='d'
elif a==5:
flag+='a'
elif a==6:
flag+='g'
elif a==7:
flag+='s'
elif a==9: #python写c语言的
flag+='r'
else:
break
a2=7 * (a2 + 1) % 11
print(flag)
print(len(flag))
for i in range(33):
flag2+=chr(v2[i]^ord(flag[i%8]))
print(flag2)
.
.
结果:
.
.
总结:
唯一要注意的地方就是C语言的switch转python逻辑要用
if
elif
else 才行。
if
if
if
else这样是不行的,因为第一个if不对就会立刻跳到else去,而elif可以解决这个问题
解毕!敬礼!