Skip to content

polarctf_reverse-简单题

1.题目:[shell]

考点:

脱壳

题目来源:polarctf-reverse-[shell]

image-20250419100348697

解题:

使用exeinfo工具进行查壳,显示加壳了

屏幕截图2025-04-19100600

使用upx工具进行脱壳

shell
upx [文件]	# 加壳
upx -d [文件]	# 脱壳

image-20250419101019435

脱壳成功

windows 32位可执行文件,使用ida 32bit打开

屏幕截图2025-04-19101532

ctrl+f查找main函数

屏幕截图2025-04-19102008

点击main_0函数,点击f5切换到伪代码视图,得到flag

image-20250419102233229

2.题目:[PE结构]

考点:

PE结构(Dos头部)

题目来源:polarctf-reverse-[PE结构]

image-20250419111338380

解题:

file命令进行文件信息查看:file [文件名]

image-20250419111515430

出现这种情况通常表示该文件可能已损坏、不完整或被加壳/混淆,此处是PE结构存在问题

010打开该文件,发现DOS头部不正确,MZ(Mark Zbikowski)2个字符(即0x4D, 0x5A)开头,被称为DOS签名。

屏幕截图2025-04-19111722

改为正确的DOS头部

image-20250419112215888

保存后运行,得到flag

image-20250419112244392

3.题目:[拼接]

考点:

flag运算操作(拼接)

题目来源:polarctf-reverse-[拼接]

image-20250419113225204

解题:

根据文件名zip联想到压缩包,改后缀解压

image-20250419113317595

exeinfo工具查看文件基本信息,windows 32bit,未加壳文件

image-20250419113413284

使用ida 32bit打开,ctrl+f找到main函数,f5查看源码,调用了main_0函数

image-20250419113635574

打开main_0函数

image-20250419113544244

代码审计

c++
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;
}

定义两个字符串Sourcev8,代码逻辑是将这两个字符串拼接到Destination变量中,然后如果输入的值与这个拼接后的字符串相等,则成功,即flag为flag{03ff6cf238c5cd8e7b4ee1e9567ad5a4}

4.题目:[加加减减]

考点:

flag运算操作(ascii减1)

题目来源:polarctf-reverse-[加加减减]

image-20250419114841493

解题:

解压得到一个可执行文件,使用exeinfo查看文件基本信息,为windows 32bit,未加壳文件

image-20250419115003839

使用ida 32bit打开,ctrl+f搜索main函数,f5查看源码,看到调用了main_0函数,点开main_0函数

image-20250419115143873

代码审计

int __cdecl main_0(int argc, const char **argv, const char **envp)
{
  char v4; // [esp+0h] [ebp-154h]
  char v5; // [esp+0h] [ebp-154h]
  size_t i; // [esp+D0h] [ebp-84h]
  char Str[60]; // [esp+DCh] [ebp-78h] BYREF
  char Str2[39]; // [esp+118h] [ebp-3Ch] BYREF
  int v9; // [esp+13Fh] [ebp-15h]
  int v10; // [esp+143h] [ebp-11h]
  __int16 v11; // [esp+147h] [ebp-Dh]
  char v12; // [esp+149h] [ebp-Bh]

  __CheckForDebuggerJustMyCode(&unk_41C009);
  strcpy(Str2, "ek`fz5123086/ce7ac7/`4a81`6/87b`b28a5|");
  v9 = 0;
  v10 = 0;
  v11 = 0;
  v12 = 0;
  j_memset(Str, 0, 0x32u);
  sub_41104B("input\r\n", v4);
  sub_4110AA("%s", (char)Str);
  for ( i = 0; i < j_strlen(Str); ++i )
    --Str[i];
  if ( !j_strcmp(Str, Str2) )
    sub_41104B("success\r\n", v5);
  else
    sub_41104B("sorry\r\n", v5);
  return 0;
}

数组元素ascii减1

exp

python
Str = "ek`fz5123086/ce7ac7/`4a81`6/87b`b28a5|"
result = ''.join(chr(ord(c)+1) for c in Str)
print(result)

滇ICP备2025057983号-1