lihaohua 发表于 2018-11-28 23:43

安洵杯RE(PE_Debug)

本帖最后由 lihaohua 于 2018-11-28 23:46 编辑

拿到题目名字已给出提示PE结构OD打开查看一下字符串

啥也莫得用PEinfo 查看一下区块发现端倪



参照了一下逆向工程核心原理





用PEditor修改一下大小E00


放OD里跑一下修改了PE区块rdata大小之后 可以看到一下数据
   
这里看到base64的table 猜测后面会用到base64的加密动态调试了一下发现这里的一个bug

感到很奇怪 ,调试了发现执行了int 0x2D 程序直接结束了 ,修改一下保存


发现程序能够正常运行了,继续调试会发现无论如何都不能执行到正确的输出,(也有可能是我太菜了)。
IDA启动!
看一下关键代码int sub_401080()
{

char v0; // ST2B_1@2

int result; // eax@5

signed int v2; // ecx@7

__int16 *v3; // @1

signed int v4; // @6

char v5; // @6

char v6; // @8

__int16 v7; // @1

int v8; // @1

int v9; // @1

int v10; // @1

int v11; // @1

int v12; // @1

int v13; // @1

int v14; // @1

__int16 v15; // @1

int v16; // @1

int v17; // @1

char v18; // @1



v15 = 0;

v16 = 0;

v17 = 0;

v18 = 0;

v7 = 0;

v8 = 0;

v9 = 0;

v10 = 0;

v11 = 0;

v12 = 0;

v13 = 0;

v14 = 0;

sub_401020("first,you need make program run\n");

sub_401020("please input flag:\n");

sub_401050("%s", &v7);                        // input

v3 = &v7;

do

{

    v0 = *(_BYTE *)v3;

    v3 = (__int16 *)((char *)v3 + 1);

}

while ( v0 );

if ( v3 != (__int16 *)((char *)&v7 + 1) && strlen((const char *)&v7) < 0x1E )// flag长度

{

    sub_4013F0(&v15);

    sub_4012A0((const char *)&v7, (int)&v5);    // base64加密

    v4 = 10;

    while ( 1 )

    {

      v2 = v4--;

      if ( !v2 )

      break;

      if ( *((_BYTE *)&v15 + v4) != v6 || *(&v5 + 2 * v4) + 2 != (off_404018 ^ 3) )// v15=v6||v5+2==str1^3

      {

      sub_401020("sry,u are wrong :(\n");

      system("pause");

      return 0;

      }

    }

    sub_401020("Congratulation, flag is:\nD0g3{%s}\n");

    system("pause");

    result = 0;

}

else

{

    sub_401020("sry,u are wrong :(\n");

    system("pause");

    result = 0;

}

return result;

}

大概的运算意思就是

两组数据加密奇偶穿插其中例如 str1:123456   Str2:abcdef   Flag:1a2b3c4d5e6f 拿到数据之后逆运算一下# -*- coding: UTF-8 -*-
import base64
str1 = "LKd8gPYWS["
str2 = "2TVBnx0lnn"
flag= ''
flags = ''
#MFe9bQXRNV
for i in range(len(str1)):
      flag += chr((ord(str1)^3) -2)
print(flag)

for j in range(10):
   if j % 2 ==0:
      flags += flag+str2
      print(flags)
   else:
      flags += flag+str2
      print(flags)
flags = base64.b64decode(flags)
print(flags)
#outM2FTeV9BbnQxX0RlNnVn

yaoyao7 发表于 2018-11-30 10:26

这道题其实考察了很多知识点,当时由于比赛冲突,没仔细看就放弃了,现在看来题目质量不错啊

trombe108 发表于 2018-11-29 00:52

好复杂的说啊

moshanghua 发表于 2018-11-29 01:00

前来学习一下{:1_893:}

voyage1969 发表于 2018-11-29 09:12

核心原理。。。看到这本书突然就好怀念

yssun 发表于 2018-11-29 09:19

不觉明历哦,看不懂;

18780334870 发表于 2018-11-29 09:19


好复杂的说啊

诸葛潇洒 发表于 2018-11-29 10:10

感谢分享

xjun 发表于 2018-11-29 10:57

现在的CTF真多啊, 啥啥杯都来了。。。

wisoft 发表于 2018-11-29 11:48

考察了好几个点啊。感谢分享

0xEASONs 发表于 2018-11-29 14:34

不错的文章
页: [1] 2
查看完整版本: 安洵杯RE(PE_Debug)