攻防世界 Reverse高手进阶区 3分题 梅津美治郎

Posted 思源湖的鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了攻防世界 Reverse高手进阶区 3分题 梅津美治郎相关的知识,希望对你有一定的参考价值。

前言

继续ctf的旅程
攻防世界Reverse高手进阶区的3分题
本篇是梅津美治郎的writeup

攻防世界的题目分数是动态的
就仅以做题时的分数为准了

解题过程

查壳显示无壳

扔进IDA

int __cdecl main(int argc, const char **argv, const char **envp)

  const CHAR *v3; // ebx
  HMODULE v4; // eax
  void (__stdcall *v5)(HMODULE, LPCSTR); // eax
  char Str1[20]; // [esp+1h] [ebp-157h] BYREF
  char Str2[11]; // [esp+15h] [ebp-143h] BYREF
  int v9; // [esp+20h] [ebp-138h] BYREF
  int v10[6]; // [esp+26h] [ebp-132h] BYREF
  __int16 v11; // [esp+3Eh] [ebp-11Ah]
  int v12[7]; // [esp+40h] [ebp-118h] BYREF
  int v13[4]; // [esp+5Ch] [ebp-FCh] BYREF
  int v14[2]; // [esp+6Ch] [ebp-ECh] BYREF
  char v15; // [esp+74h] [ebp-E4h]
  int v16[8]; // [esp+75h] [ebp-E3h] BYREF
  __int16 v17; // [esp+95h] [ebp-C3h]
  int v18[8]; // [esp+97h] [ebp-C1h] BYREF
  char v19; // [esp+B7h] [ebp-A1h]
  int v20; // [esp+B8h] [ebp-A0h] BYREF
  int v21; // [esp+BEh] [ebp-9Ah]
  int v22; // [esp+C2h] [ebp-96h]
  int v23; // [esp+C6h] [ebp-92h]
  int v24; // [esp+CAh] [ebp-8Eh]
  int v25; // [esp+CEh] [ebp-8Ah]
  int v26; // [esp+D2h] [ebp-86h]
  int v27; // [esp+D6h] [ebp-82h]
  int v28; // [esp+DAh] [ebp-7Eh]
  char v29; // [esp+DEh] [ebp-7Ah]
  int v30; // [esp+DFh] [ebp-79h]
  int v31; // [esp+E3h] [ebp-75h]
  int v32; // [esp+E7h] [ebp-71h]
  int v33; // [esp+EBh] [ebp-6Dh]
  int v34; // [esp+EFh] [ebp-69h]
  int v35; // [esp+F3h] [ebp-65h]
  int v36; // [esp+F7h] [ebp-61h]
  int v37; // [esp+FBh] [ebp-5Dh]
  __int16 v38; // [esp+FFh] [ebp-59h]
  int v39; // [esp+101h] [ebp-57h]
  int v40; // [esp+105h] [ebp-53h]
  char v41; // [esp+109h] [ebp-4Fh]
  int v42; // [esp+10Ah] [ebp-4Eh]
  int v43; // [esp+10Eh] [ebp-4Ah]
  int v44; // [esp+112h] [ebp-46h]
  int v45; // [esp+116h] [ebp-42h]
  int v46; // [esp+11Ah] [ebp-3Eh]
  int v47; // [esp+11Eh] [ebp-3Ah]
  int v48; // [esp+122h] [ebp-36h]
  int v49; // [esp+126h] [ebp-32h]
  int v50; // [esp+12Ah] [ebp-2Eh]
  int v51; // [esp+12Eh] [ebp-2Ah]
  int v52; // [esp+132h] [ebp-26h]
  int v53; // [esp+136h] [ebp-22h]
  int v54; // [esp+13Ah] [ebp-1Eh]
  int v55; // [esp+13Eh] [ebp-1Ah]
  int v56; // [esp+142h] [ebp-16h]
  int v57; // [esp+146h] [ebp-12h]
  int v58; // [esp+14Ah] [ebp-Eh]
  __int16 v59; // [esp+14Eh] [ebp-Ah]
  int *v60; // [esp+150h] [ebp-8h]

  v60 = &argc;
  sub_402940();
  puts(
    "            .     \\n"
    "           _|_    ROBOTIC AUTHENTICATION SYSTEM\\n"
    "    /\\\\/\\\\  (. .)  /\\n"
    "    `||'   |#|  \\n"
    "     ||__.-\\"-\\"-.___   \\n"
    "     `---| . . |--.\\\\  \\n"
    "         | : : |  ,||,\\n"
    "         `..-..'  \\\\/\\\\/\\n"
    "          || ||   \\n"
    "          || ||    \\n"
    "         |__|__|  \\n");
  v20 = 1337;
  v21 = 1617194321;
  v22 = 1679910002;
  v23 = 1935963503;
  v24 = 1684632865;
  v25 = 1936221985;
  v26 = 1361147250;
  v27 = 1987211872;
  v28 = 996504430;
  v29 = 1;
  v18[0] = 1617194321;
  v18[1] = 1679910002;
  v18[2] = 1935963503;
  v18[3] = 1684632865;
  v18[4] = 1936221985;
  v18[5] = 1361147250;
  v18[6] = 1987211872;
  v18[7] = 996504430;
  v19 = 1;
  v30 = 1617194321;
  v31 = 1679910002;
  v32 = 1935963503;
  v33 = 1684632865;
  v34 = 1650749985;
  v35 = 560295790;
  v36 = 1920098385;
  v37 = 1702063734;
  v38 = 315;
  v16[0] = 1617194321;
  v16[1] = 1679910002;
  v16[2] = 1935963503;
  v16[3] = 1684632865;
  v16[4] = 1650749985;
  v16[5] = 560295790;
  v16[6] = 1920098385;
  v16[7] = 1702063734;
  v17 = 315;
  v39 = 1869557876;
  v40 = 1718432615;
  v41 = 3;
  v14[0] = 1869557876;
  v14[1] = 1718432615;
  v15 = 3;
  v42 = 1869833322;
  v43 = 858942820;
  v44 = 1835885871;
  v45 = 20906241;
  v13[0] = 1869833322;
  v13[1] = 858942820;
  v13[2] = 1835885871;
  v13[3] = 20906241;
  v46 = 1466262848;
  v47 = 1853186660;
  v48 = 1147495539;
  v49 = 1902404217;
  v50 = 1869506677;
  v51 = 1701797961;
  v52 = 24339565;
  v12[0] = 1466262848;
  v12[1] = 1853186660;
  v12[2] = 1147495539;
  v12[3] = 1902404217;
  v12[4] = 1869506677;
  v12[5] = 1701797961;
  v12[6] = 24339565;
  v53 = 561278552;
  v54 = 795830390;
  v55 = 1869496865;
  v56 = 1969255270;
  v57 = 1969253748;
  v58 = 1919905384;
  v59 = 288;
  v10[0] = 561278552;
  v10[1] = 795830390;
  v10[2] = 1869496865;
  v10[3] = 1969255270;
  v10[4] = 1969253748;
  v10[5] = 1919905384;
  v11 = 288;
  v9 = 1337;
  strcpy(Str2, "r0b0RUlez!");
  dword_40AD94 = (int)&v9;
  dword_40ADA0 = (int)&v20;
  dword_40AD8C = (char *)v18;
  dword_40AD90 = (char *)v16;
  dword_40AD98 = (int)v14;
  lpProcName = (LPCSTR)v12;
  lpModuleName = (LPCSTR)v13;
  Buffer = (char *)v10;
  sub_401500(0);
  v3 = lpProcName;
  v4 = GetModuleHandleA(lpModuleName);
  v5 = (void (__stdcall *)(HMODULE, LPCSTR))GetProcAddress(v4, v3);
  v5((HMODULE)1, (LPCSTR)sub_40157F);
  puts(dword_40AD8C);
  scanf("%20s", Str1);
  if ( !strcmp(Str1, Str2) )
  
    puts("You passed level1!");
    sub_4015EA(0);
  
  return 0;

可以看到

一个简单的字符串比较,r0b0RUlez!应该是flag一部分

然后,跟踪sub_4015EA

  • 先是一个9次递归打印dword_40AD90数组

  • 再是一个__debugbreak函数,这会抛出int3断点异常,这里贴下查到的分析

    __debugbreak函数相当于一个int 3指令,引发一个中断,把执行权移交给调试器;如果没有调试器,那就移交给其他异常处理回调函数;如果都没有,那么程序就自己断下来。这里就是为了触发回调函数,如果没有调试器附加,那么debugbreak产生的异常会被AddVectoredExceptionHandler添加的回调函数捕获来处理

回过头看main函数
有长串的变量和数字,其中v12和v13构成模块名和变量名

sub_401500函数通过递归,对字符串进行了操作,所以上面直接分析字符串分析不出来是什么

动态调试出来v12v13分别是kernel32.dllAddVectoredExceptionHandler
v5就是:捕抓异常然后给第一个处理函数sub_40157F处理
这就和上面的__debugbreak函数连上了

跟踪sub_40157F函数


发现是个异或2
但是这个字符串看不了

扔进OD动态调试,发现int3直接patch了。。
就调用exit(0),跑到了0x7开头的地址,飞了。。

用IDA调试,下断点

随意输入


然后就看到

这就可以写脚本了

key="u1nnf2lg"
flag2=""
for i in key1:
	flag2+=chr(ord(i)^2)
print(flag2)

得到w3lld0ne

于是flag就是两部分拼起来:flagr0b0RUlez!_w3lld0ne
(这里这个_没有提示,是查wp得来的。。。)

结语

学到了__debugbreak函数

以上是关于攻防世界 Reverse高手进阶区 3分题 梅津美治郎的主要内容,如果未能解决你的问题,请参考以下文章

攻防世界 Reverse高手进阶区 3分题 梅津美治郎

攻防世界 Reverse高手进阶区 3分题 crackme

攻防世界 Reverse高手进阶区 3分题 crackme

攻防世界 Reverse高手进阶区 3分题 crackme

攻防世界 Reverse高手进阶区 3分题 crackme

攻防世界 Reverse高手进阶区 2分题 easyre-153