【CTF解题】攻防世界逆向篇
2022-10-10 / 0 评论 / 412 阅读 / 67 点赞

【CTF解题】攻防世界逆向篇

发光的神
2022-10-10 / 0 评论 / 412 阅读 / 正在检测是否收录...

Mysterious解题

题目难度:2
题目描述:
自从报名了CTF竞赛后,小明就辗转于各大论坛,但是对于逆向题目仍是一知半解。有一天,一个论坛老鸟给小明发了一个神秘的盒子,里面有开启逆向思维的秘密。小明如获至宝,三天三夜,终于解答出来了,聪明的你能搞定这个神秘盒子么?(答案为flag{XXX}形式)

l92core7.png

1.是个带GUI的程序,提示让我们输入正确的密码,才会有flag吧先用IDA看下。
l92cv53k.png

2.打开后按F5进入伪代码,然后双击进入WinMian函数内。

l92cwgq5.png

3.我看过了在这个函数里,相关函数自行百度哦本文章不细讲。

l92d0ske.png

4.再进一层,就看到主代码了。

l92dhkb7.png

int __stdcall sub_401090(HWND hWnd, int a2, int a3, int a4)
{
  char v5; // [esp+50h] [ebp-310h]
  CHAR Text[4]; // [esp+154h] [ebp-20Ch]
  char v7; // [esp+159h] [ebp-207h]
  __int16 v8; // [esp+255h] [ebp-10Bh]
  char v9; // [esp+257h] [ebp-109h]
  int v10; // [esp+258h] [ebp-108h]
  CHAR String; // [esp+25Ch] [ebp-104h]
  char v12; // [esp+25Fh] [ebp-101h]
  char v13; // [esp+260h] [ebp-100h]
  char v14; // [esp+261h] [ebp-FFh]

  memset(&String, 0, 0x104u);
  v10 = 0;
  if ( a2 == 16 )
  {
    DestroyWindow(hWnd);
    PostQuitMessage(0);
  }
  else if ( a2 == 273 )
  {
    if ( a3 == 1000 )
    {
      GetDlgItemTextA(hWnd, 1002, &String, 260);
      strlen(&String);
      if ( strlen(&String) > 6 )
        ExitProcess(0);
      v10 = atoi(&String) + 1;
      if ( v10 == 123 && v12 == 120 && v14 == 122 && v13 == 121 )
      {
        strcpy(Text, "flag");
        memset(&v7, 0, 0xFCu);
        v8 = 0;
        v9 = 0;
        _itoa(v10, &v5, 10);
        strcat(Text, "{");
        strcat(Text, &v5);
        strcat(Text, "_");
        strcat(Text, "Buff3r_0v3rf|0w");
        strcat(Text, "}");
        MessageBoxA(0, Text, "well done", 0);
      }
      SetTimer(hWnd, 1u, 0x3E8u, TimerFunc);
    }
    if ( a3 == 1001 )
      KillTimer(hWnd, 1u);
  }
  return 0;
}

5.itoa函数的作用是把整数转换成字符串,相当于 v10 给了v5所以等于 123,strcat是字符拼接,所以拼接起来就是了。

flag{123_Buff3r_0v3rf|0w}

insanity解题

题目难度:3
题目描述: 菜鸡觉得前面的题目太难了,来个简单的缓一下

l90z4i9f.png
1.都提示了,肯定不会很难先用记事本看下,搜索flag好家伙直接发现了,还是用IDA看下内部。

l90z25pl.png

2.用IDA打开,先看main函数F5进入伪代码,当然你也可以分析反汇编代码。

l90z9hz3.png

l90zasgm.png

3.直接见flag,提交下看看。

flag:9447{This_is_a_flag}

l90zd0j3.png

l92dla8k.png

Shuffle解题

题目难度:2

l902aeq9.png

1.直接用IDA打开,一般题目都不加壳,能看到main主函数就没壳,题目有说找到字符串在随机化之前,意思就是字符在之前是完整的,之后就会加密打乱什么的。

l902g3jt.png

2.说明flag在之前不会加密,运行初始化之后才会加密,我们先进入main函数分析下,看了会那些字符就是了,通过转ASCII拼接就是完整flag,开始写脚本。

l9031dpi.png

byte = [
  83, 69, 67, 67, 79, 78, 123, 87,
  101, 108, 99, 111, 109, 101, 32,
  116, 111, 32, 116, 104, 101, 32, 
  83, 69, 67, 67, 79, 78, 32, 50,
  48, 49, 52, 32, 67, 84, 70, 33, 125
]
for i in range(len(byte)):
    print(chr(byte[i]) ,end="")
flag:SECCON{Welcome to the SECCON 2014 CTF!}

3.直接在IDA转换char也是可以的,自己拼接上就行。

l9032tpp.png

simple-unpack解题

题目难度:3

l8zz1fo6.png
1.题目有说过加壳了,先查壳是个UPX压缩壳,UPX自带脱壳的参数 -d 就是了,先脱个壳先,从信息看到是个64位ELF文件,用64位IDA(废话)。

l8zz5ovc.png

l8zz6qam.png

2.脱好壳再查看下,没壳了可以用IDA分析了。

l8zzz900.png

3.不用分析了,直接见flag。
l9003aog.png

4.后面用文本查看也可以见flag。

l901ohd4.png

Game解题

题目难度:3

l8zoy13k.png
1.老规矩查壳,看下木有壳扔IDA分析下。

l8zorcvq.png

2.其实直接运行按顺序输入1-8的数,就出现flag了,目的似乎达到了,但还是想看下内部逆向下先。

l8zp2kuw.png

3.找到主函数 main,搜索下就好了,再按F5生成伪代码。

l8zpd5ud.png

4.双击进入main_0函数看下。

l8zpizqp.png

5.找关键,我看过了在这个函数里sub_457AB4()

l8zpo5qb.png

6.再进一层双击进入sub_45E940()函数里,在这里面。

l8zpsy08.png

l8zpw2c3.png

7.一直往下翻,可以看到关键进行运算代码段,v2,v58进行两次异或处理 v59,v115 进行异或 再与0x13异或,flag 应该是和v2,v58的字符变量有关。

解题代码

byte1 = [
    123,32,18,98,119,108,65,41,124,80,125,38,124,111,74,49,83,108,94,108,84,6,96,83,44,121,104,110,32,95,117,101,99,123,127,119,96,48,107,71,92,29,81,107,90,85,64,12,43,76,86,13,114,1,117,126,0
]
byte2 = [ 
    18, 64, 98, 5, 2, 4, 6, 3, 6, 48, 49, 65,32, 12, 48, 65, 31, 78, 62, 32, 49, 32, 1,57, 96, 3, 21, 9, 4, 62, 3, 5, 4, 1, 2, 3,44, 65, 78, 32, 16,97,54,16,44,52,32,64,89, 45,32,65,15,34,18,16,0
]
for i in range(len(byte1)):
    ch = chr(byte1[i]^byte2[i]^0x13)
    print(ch,end="")
flag:zsctf{T9is_tOpic_1s_v5ry_int7resting_b6t_others_are_n0t}

l8ztrwai.png

Hello CTF解题

题目难度:4

l8zfm839.png

1.老规矩看下有壳没,没壳直接拖入IDA进行分析。

l929dv3f.png

l8zfo7x4.png

2.运行后是要求输入正确的flag,我们肯定是没有的需要逆向出来,这些提示就是突破的关键,用IDA打开发现是个32位程序,直接进main函数分析。

l8zmzzew.png

3.按F5进入伪代码,找关键代码做突破口。

int __cdecl main(int argc, const char **argv, const char **envp)
{
  int i; // ebx
  char v4; // al
  int result; // eax
  int v6; // [esp+0h] [ebp-70h]
  int v7; // [esp+0h] [ebp-70h]
  char Buffer[2]; // [esp+12h] [ebp-5Eh] BYREF
  char v9[20]; // [esp+14h] [ebp-5Ch] BYREF
  char v10[32]; // [esp+28h] [ebp-48h] BYREF
  __int16 v11; // [esp+48h] [ebp-28h]
  char v12; // [esp+4Ah] [ebp-26h]
  char v13[36]; // [esp+4Ch] [ebp-24h] BYREF

  strcpy(v13, "437261636b4d654a757374466f7246756e");
  while ( 1 )
  {
    memset(v10, 0, sizeof(v10)); // 对v10进行了初始化
    v11 = 0;
    v12 = 0;
    sub_40134B(aPleaseInputYou, v6);
    scanf("%s", v9);
    if ( strlen(v9) > 0x11 )
      break;
    for ( i = 0; i < 17; ++i )
    {
      v4 = v9[i];
      if ( !v4 )
        break;
      sprintf(Buffer, "%x", v4);
      strcat(v10, Buffer); // 进行了拼接处理
    }
    if ( !strcmp(v10, v13) )  // 进行了字符串比较,如果v10的值等于v13的值会输出Success
      sub_40134B(aSuccess, v7);
    else
      sub_40134B(aWrong, v7);
  }
  sub_40134B(aWrong, v7);
  result = --Stream._cnt;
  if ( Stream._cnt < 0 )
    return _filbuf(&Stream);
    ++Stream._ptr;
  return result;
}

4.v13的值已经在strcpy这里出现了 437261636b4d654a757374466f7246756e,现在只要知道v10是怎么出来的就行,往上开始分析,分析结果:依次取出用户输入字符串的字符,把字符值的 ASCII 码值转成 16 进制的形式拼接到v10中,v10的值等于v13的值,需将字符串v13中的值两个一组,当作16进制的值,换算成ASCII码并转成对应的字符即可,这样就得到了flag,没有多复杂就看做是把 437261636b4d654a757374466f7246756e 转换成字符串。

l8zo43u3.png

l8znunnj.png

解题代码

str1 = "437261636b4d654a757374466f7246756e"
gather = ""
count = 0
while count < len(str1):
    gather += chr(int(str1[count:count + 2], 16))
    count += 2
print(gather)
flag:CrackMeJustForFun

l8znv2lk.png

动态调试

l929ml0s.png

1.ctrl + G 搜索 401000 跳到这个程序起始的代码段上,往下看。

l929q31u.png

2.找到关键提示,正确和错误肯定就在下面了。

l929vby8.png

3.找到了成功的代码段,和错误的代码段。

l929z99v.png

4.好了再往上滑找到这个地址,401065 看到是个判断,我们在这里下断点。

l92a4po3.png

l92aai6c.png

l92b7asx.png

crackme解题

题目难度:3

l8yfpsgx.png

1.老规矩先查壳,有软件自动脱壳的工具,这里我手动脱下壳。

l8ygq1s1.png

2.可以发现用IDA看下什么都没有,main函数也没有只能脱壳在分析了,其实可以让软件运行起来附加内存,也是能看到脱壳后的代码的。

ESP定律脱壳

l8yg0xsi.png

1.拖入软件因为有壳,我们不能运行,按F8单步到2下call这个地址上。

l8yg8tuq.png

2.右键ESP寄存器,下个硬件访问断点,下好了按F9运行。

l8ygg132.png

3.再按F8运行两次,会跳到这个jump指令指向00401336这个地址上 。

l8ygj8cp.png
4.右键选择分析,从模块中删除分析。

l8yglozq.png

5.再右键选择这个脱壳选项。

l8ygn8gr.png

6.开始脱壳然后保存壳就脱了。

静态分析

l8ygusun.png

1.可以发现这是我脱好壳的程序,能看到main函数了代码也完整了,可以进一步分析了。

l8yhe3nt.png

2.按F5查看伪代码,进入byte_402130这个函数里看下。

l8yhgf0i.png

3.观察while循环可以发现,(&Buf + v4) ^ byte_402130[v4 % 16]),什么和什么异或了进入函就是这些。

解题代码

str1="this_is_not_flag"
byte=[0x12, 4, 8, 0x14, 0x24, 0x5C, 0x4A, 0x3D, 0x56, 0x0A, 0x10, 0x67, 0,
    0x41, 0, 1, 0x46, 0x5A, 0x44, 0x42, 0x6E, 0x0C, 0x44, 0x72, 0x0C, 0x0D,
    0x40, 0x3E, 0x4B, 0x5F, 2, 1, 0x4C, 0x5E, 0x5B, 0x17, 0x6E, 0x0C,
    0x16, 0x68, 0x5B, 0x12]
flag=""
for i in range(len(byte)):
    flag+=chr(byte[i]^ord(str1[i%16]))
print(flag)
flag{59b8ed8f-af22-11e7-bb4a-3cf862d1ee75}

l8yhtv67.png

l8yhuzp1.png

IgniteMe解题

题目难度:2

l8xv8jm6.png

1.让你输入正确的flag,先用IDA静态分析下。

l8xvf72k.png

2.PE查壳工具看下有没有壳,看到是.txt并没有,一般我直接拖入IAD分析,查不查壳都一样,C++ 写的目测是易语言。

l8xvlz7k.png

l8xvm7ur.png
3.百度下就知道是32位的,用32位的IDA打开进行分析。

l8xw97j8.png

4.找到关键成功的地方,发现判断的对象是sub_4011C0(),如果等于真就成立执行成功的代码,我们可以进sub_4011C0()这个函数内看看,写的是什么逻辑。

l8y7gmhq.png

l8y7fiaf.png

5.把数组中大写字母转为小写字母,小写字母转为大写字母。然后把数组与0x55异或后+72,然后再与数组byte_4420B0异或,和GONDPHyGjPEKruv{{pj]X@rF进行比较,判断出执行结果为GONDPHyGjPEKruv{{pj]X@rF,如果相同则正确。

l8y84909.png

bytes = [
    13, 19, 23, 17, 2, 1, 32, 29, 12, 2, 25,
    47, 23, 43, 36, 31, 30, 22, 9, 15, 21, 39,
    19, 38, 10, 47, 30, 26, 45, 12, 34, 4
]
v7 = []
str2 = 'GONDPHyGjPEKruv{{pj]X@rF'
band = ''

for i in range(24):
    v7.append(bytes[i] ^ ord(str2[i]))
    v7[i] = (v7[i] - 72) ^ 0x55
    band = band + chr(v7[i]).lower()

print("EIS{%s}" % band)
flag: EIS{wadx_tdgk_aihc_ihkn_pjlm}

l8y85xaj.png

lucknum解题

题目难度:1

l7umogcv.png

1.没有后缀的文件,直接用IDA打开看看,加载的时候发现是个64位程序,
进入直接F5查看伪代码,直接见flag,解毕!

1000Click解题

题目难度:1
最简单的一个逆向题目,软件运行不破解点1000次也可以获得flag,
但这样太不符合我的习惯,逆向不走常规路。

l7ukrb4x.png

方法1
1.利用cheat engine 修改内存点击次数到999

l7ulhic2.png

方法2
1.利用OD根据错误提示找反汇编代码 push压栈 就是flag
2.也可以用过IDA进行逆向分析,解毕!

67

评论 (0)

取消
0:00