先拖入exeinfope查壳,发现是简单的 upx壳
所以用upx.exe脱壳:upx-d
脱壳之后拖入ida,f5看main函数
int __cdecl main(int argc, const char **argv, const char **envp)
{
int pipedes[2]; // [esp+18h] [ebp-38h] BYREF
__pid_t v5; // [esp+20h] [ebp-30h]
int v6; // [esp+24h] [ebp-2Ch] BYREF
char buf[30]; // [esp+2Eh] [ebp-22h] BYREF
unsigned int v8; // [esp+4Ch] [ebp-4h]
v8 = __readgsdword(0x14u);
pipe(pipedes); //创建管道,用于父进程和子进程的通信
v5 = fork(); //创建子进程,与父进程同时运行fork后面的所有代码,在父进程中v5的值是 子进程的进程号(pid),在子进程汇总v5的值是0,如果出现错误,v5的值为负数。
if ( !v5 )
{
puts("\nOMG!!!! I forgot kid's id");
write(pipedes[1], "69800876143568214356928753", 29u);
puts("Ready to exit ");
exit(0);
}
read(pipedes[0], buf, 29u); //将pipedes的内容(69...53)复制到buf缓冲区
__isoc99_scanf("%d", &v6);
if ( v6 == v5 )
{
if ( (unsigned __int8)*(_DWORD *)((char *)lol + 3) == 204 )
{
puts(":D");
exit(1);
}
printf("\nYou got the key\n ");
lol(buf); //在这里调用lol函数
}
wait(0);
return 0;
}
打开lol函数:
int __cdecl lol()
{
return printf("flag_is_not_here");
}
发现没什么,但打开汇编:
发现跳转的地方
mov [ebp+var_C], 0
cmp [ebp+var_C], 1
jnz short loc_80486D3
这里会发生永恒跳转
所以将jnz改为jz(hex窗口中将该部分的75改为74)
保留更改:
int __cdecl lol(_BYTE *a1)
{
char v2[7]; // [esp+15h] [ebp-13h] BYREF
int v3; // [esp+1Ch] [ebp-Ch]
v2[0] = 2 * a1[1];
v2[1] = a1[4] + a1[5];
v2[2] = a1[8] + a1[9];
v2[3] = 2 * a1[12];
v2[4] = a1[18] + a1[17];
v2[5] = a1[10] + a1[21];
v2[6] = a1[9] + a1[25];
v3 = 0;
return printf("%s", v2);
}
于是用c语言按照该逻辑解密:
#include
int main()
{
char a1[] = "69800876143568214356928753";
char v2[7]; // [esp+15h] [ebp-13h] BYREF
int v3; // [esp+1Ch] [ebp-Ch]
v2[0] = 2 * (int)a1[1];
v2[1] = a1[4] + a1[5];
v2[2] = a1[8] + a1[9];
v2[3] = 2 * a1[12];
v2[4] = a1[18] + a1[17];
v2[5] = a1[10] + a1[21];
v2[6] = a1[9] + a1[25];
v3 = 0;
printf("%s",v2);
return 0;
}
最后得到flag:rhelheg
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)