攻防世界 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
函数通过递归,对字符串进行了操作,所以上面直接分析字符串分析不出来是什么
动态调试出来v12
和v13
分别是kernel32.dll
和AddVectoredExceptionHandler
那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分题 梅津美治郎的主要内容,如果未能解决你的问题,请参考以下文章