0x00 日常查壳
无壳64位
0x01 分析主函数
考的主要还是正向开发
int __cdecl main(int argc, const char **argv, const char **envp)
{
unsigned __int64 flaglen2; // rbx
__int64 flaglen1; // rax
__int128 *malloc5; // rax
__int64 data; // r11
__int128 *malloc7; // r14
int v8; // edi
__int128 *malloc9; // rsi
char tmp; // r10
int v11; // edx
__int64 v12; // r8
unsigned __int64 datalen; // rcx
__int64 v14; // rcx
unsigned __int64 v15; // rax
unsigned __int64 i; // rax
_BYTE *encodeflag; // rax
size_t v18; // rsi
_BYTE *enflag; // rbx
_BYTE *v20; // r9
int v21; // er11
char *v22; // r8
__int64 v23; // rcx
char v24; // al
__int64 v25; // r9
__int64 v26; // rdx
__int64 v27; // rax
size_t Size; // [rsp+20h] [rbp-48h] BYREF
__int128 malloc30; // [rsp+28h] [rbp-40h] BYREF
int v31; // [rsp+38h] [rbp-30h]
int v32; // [rsp+3Ch] [rbp-2Ch]
int flag[4]; // [rsp+40h] [rbp-28h] BYREF
int v34; // [rsp+50h] [rbp-18h]
*(_OWORD *)flag = 0i64;
v34 = 0;
sub_7FF7D13618C0(std::cin, argv, flag); // 获取flag
flaglen2 = -1i64;
flaglen1 = -1i64;
do
++flaglen1;
while ( *((_BYTE *)flag + flaglen1) );
if ( flaglen1 != 19 ) // flag长度为19
{
sub_7FF7D1361620(std::cout, "error\n");
_exit((int)flag);
}
malloc5 = (__int128 *)operator new(5ui64); // 申请了5字节内存
data = *(_QWORD *)&Code;
malloc7 = malloc5;
v8 = 0;
malloc9 = malloc5;
do
{
tmp = *((_BYTE *)malloc9 + (char *)flag - (char *)malloc5);// 取flag的第一位到tmp中
v11 = 0;
*(_BYTE *)malloc9 = tmp;