re笔记2

polar逆向PE结构
扔进exeinfo中发现好多问号,根据题目提示可能是PE结构出问题了
PE结构(Portable Executable)是Windows操作系统中可执行文件、目标代码和DLL的标准格式。它告诉系统:如何把文件加载到内存、如何组织代码和数据、如何解析依赖、如何执行入口点。任 何.exe、.dll、.sys(驱动)都符合PE规则。
DOS头 和 NT头 就是 PE 文件中两个重要的文件头
一个 WORD 类型,值是一个常数 0x4D5A,用文本编辑器查看该值位‘MZ’,可执行文件必须都是'MZ'开头
这里是发现是DOS头被调改了
image
改为4D保存运行直接得到flag
image
image
polar逆向拼接
添加后缀.zip解压得到exe
查壳发现没有
拖入ida
在main函数中直接看到两部分flag,拼起来直接得到flag
还是分析一下代码吧
`int __cdecl main_0(int argc, const char **argv, const char **envp)
{
char v4; // [esp+0h] [ebp-160h]
char v5; // [esp+0h] [ebp-160h]
char Str1[60]; // [esp+D0h] [ebp-90h] BYREF
char Destination[60]; // [esp+10Ch] [ebp-54h] BYREF
char *v8; // [esp+148h] [ebp-18h]
char *Source; // [esp+154h] [ebp-Ch]

__CheckForDebuggerJustMyCode(&unk_41B009);
Source = "flag{";
v8 = "03ff6cf238c5cd8e7b4ee1e9567ad5a4}";
j_memset(Destination, 0, 0x32u);
j_memset(Str1, 0, 0x32u);
j_strcpy(Destination, "flag{");
j_strcat(Destination, v8);
sub_411050("please input flag\r\n", v4);
sub_4110AA("%s", (char)Str1);
if ( !j_strcmp(Str1, Destination) )
sub_411050("congratulation\r\n", v5);
else
sub_411050("error\r\n", v5);
return 0;
}`
j_memset(Destination, 0, 0x32u);
j_memset(Str1, 0, 0x32u);这两行是清空缓冲区的意思
接下来strcpy吧内容复制进Des中,此函数有覆盖原内容的效果,strcat则是先寻找Des中的\0然后从\0开始拼接
所以拼接的结果就是flag{03ff6cf238c5cd8e7b4ee1e9567ad5a4}
值得一提的是strcpy和strcat在写入的时候都不会检查长度,所以有可能会产生栈溢出漏洞
下面的检查就很简单了,对比如果输入一样的话就输出祝贺,如果不一样就输出error.

posted @ 2025-11-25 18:23  CLAY666  阅读(6)  评论(0)    收藏  举报