解析
先查一下,是一个64位无壳文件,elf文件,之后拖入ida中进行查看,发现并没什么有什么如约而至的main函数,那么我们只能自己寻找,直接来寻找字符串发现了一个base64加密的,还有base64的密文,过于着急去解密,之后被骗去了看雪https://bbs.pediy.com/thread-254172.htm这个页面,之后重新分析的
![在这里插入图片描述](https://img-blog.csdnimg.cn/f03184a8f8a04a3491a4d342a454b751.png
在这里,从这里跳进去进行反编译。
__int64 sub_400D35()
{
__int64 v0; // rdi
__int64 result; // rax
unsigned __int64 v2; // rt1
unsigned int v3; // [rsp+Ch] [rbp-24h]
signed int i; // [rsp+10h] [rbp-20h]
signed int j; // [rsp+14h] [rbp-1Ch]
unsigned int v6; // [rsp+24h] [rbp-Ch]
unsigned __int64 v7; // [rsp+28h] [rbp-8h]
v7 = __readfsqword(0x28u);
v0 = 0LL;
v3 = sub_43FD20(0LL) - qword_6CEE38;
for ( i = 0; i <= 1233; ++i )
{
v0 = v3;
sub_40F790(v3);
sub_40FE60();
sub_40FE60();
v3 = (unsigned __int64)sub_40FE60() ^ 0x98765432;
}
v6 = v3;
if ( ((unsigned __int8)v3 ^ byte_6CC0A0[0]) == 0x66 && (HIBYTE(v6) ^ (unsigned __int8)byte_6CC0A3) == 0x67 )
{
for ( j = 0; j <= 24; ++j )
{
v0 = (unsigned __int8)(byte_6CC0A0[j] ^ *((_BYTE *)&v6 + j % 4));
sub_410E90(v0);
}
}
v2 = __readfsqword(0x28u);
result = v2 ^ v7;
if ( v2 != v7 )
sub_444020(v0);
return result;
}
发现这里的信息,之后看一下字符,0x66是f,0x67g,那么就是证明这里要是flag,之后写一下脚本进行反推出来v6是多少,之后在继续往下,之后在继续异或,之后可以开始写了。
脚本
开始往下走,先知道v6是多少,要先知道byte_6CC0A0和byte_6CC0A3,之后列出来。
.data:00000000006CC0A0 byte_6CC0A0 db 40h ; DATA XREF: sub_400D35+95↑r
.data:00000000006CC0A0 ; sub_400D35+C1↑r
.data:00000000006CC0A1 db 35h ; 5
.data:00000000006CC0A2 db 20h
.data:00000000006CC0A3 byte_6CC0A3 db 56h ; DATA XREF: sub_400D35+A6↑r
.data:00000000006CC0A4 db 5Dh ; ]
.data:00000000006CC0A5 db 18h
.data:00000000006CC0A6 db 22h ; "
.data:00000000006CC0A7 db 45h ; E
.data:00000000006CC0A8 db 17h
.data:00000000006CC0A9 db 2Fh ; /
.data:00000000006CC0AA db 24h ; $
.data:00000000006CC0AB db 6Eh ; n
.data:00000000006CC0AC db 62h ; b
.data:00000000006CC0AD db 3Ch ; <
.data:00000000006CC0AE db 27h ; '
.data:00000000006CC0AF db 54h ; T
.data:00000000006CC0B0 db 48h ; H
.data:00000000006CC0B1 db 6Ch ; l
.data:00000000006CC0B2 db 24h ; $
.data:00000000006CC0B3 db 6Eh ; n
.data:00000000006CC0B4 db 72h ; r
.data:00000000006CC0B5 db 3Ch ; <
.data:00000000006CC0B6 db 32h ; 2
.data:00000000006CC0B7 db 45h ; E
.data:00000000006CC0B8 db 5Bh ; [
之后一个脚本进行计算,最后获得flag是flag{Act1ve_Defen5e_Test}。
#include<stdio.h>
int byte_6CC0A0_3[4] = { 0x40,0x35 ,0x20 ,0x56};
int byte_6CC0A0[25] = { 0x40,0x35 ,0x20 ,0x56 ,0x5D,0x18,0x22,0x45,0x17,0x2F,0x24,0x6E,0x62,0x3C,0x27,0x54,0x48,0x6C,0x24,0x6E,0x72,0x3C,0x32,0x45,0x5B };
int v1[4] = { 0x66,0x6c,0x61,0x67 };
char v3[4] = { 0 };
char v0[25] = { 0 };
int main() {
for (int i = 0; i < 4; i++) {
v3[i] = byte_6CC0A0_3[i] ^ v1[i];
}
for (int j = 0; j <= 24; j++) {
v0[j] = byte_6CC0A0[j] ^ v3[j % 4];
}
printf("%s", v0);
}