攻防世界reverse

1.open-source

下载附件后,看到他是.c文件。用相应的软件打开,我这里是用的Geany。打开后如下图

 发现经过三个判断后经过最后的hash便是我们要找的flag,其中的first、second、strlen(argv[3])我们可以通过上面的三个if来写脚本得到

1 first = 0xcafe
2 second = 25
3 th = 'h4cky0u'
4 flag = hex(first * 31337 + (second % 17)*11 + len(th) - 1615810207)
5 print(flag)

得到flag:c0ffee

2.insanity

这是一个比较简单的题了。查壳以后,用ida打开,f5反编译

 最后输出了strs,双击它

发现flag就在里面。flag: 9447{This_is_a_flag}

3.python-trade

这是一个.pyc的文件,我们需要把它先反编译成为.py文件,可以使用在线工具,简单使用。

 这下就比较简单了,我们输入的flag经过encode函数后与correct进行比较,对则通过,所以我们输入correct的内容通过函数得到的就是flag。

所以写脚本

import base64

correct = 'XlNkVmtUI1MgXWBZXCFeKY+AaXNt'
c = base64.b64decode(correct)

flag = ''
for i in c:
    x = (i - 16) ^ 32
    flag += chr(x)
print(flag)

当然,其中用到了base64加密解密的内容,不熟悉的可以去百度一下。

4.Hello, CTF

 先查壳

发现无壳,而且是c++文件,拖进ida后f5

 分析后发现,它有这重要的几步

1.把一串字符赋给v13

2.要求输入的字符不超过17(0x11),

3.以十六进制输出,并赋给v10

4.用v10与v13比较,相同则成功

所以将v13的字符串转化成十六进制得到flag:CrackMeJustForFun

5.simple-unpack

这个题目说是加了壳的,而且是elf文件。没办法手动脱壳,所以我尝试了一下用winHex搜索了一下flag(ctrl+f),发现

 复制粘贴后删掉乱码后flag:flag{Upx_1s_n0t_a_d3liv3r_c0mp4ny}

当然有运气成分,实在是条件不允许。。。

6.logmein

下载附件后先查壳,发现没有壳,而且是elf文件,不管他,直接拖进ida里f5

 分析知道它将输入的字符串与v7[i%v6]^v8[i]进行比较,其中v8是字符串,而v7是一串数字而且是LL型,也就是长长整型,需要转换成十六进制在转换成字符。

 但是这里有点小知识,v7是以小端序储存数据的,即低位字节存入低地址,高位字节存入高地址,所以正确的字符串应该反过来,即v7 = ‘harambe’

分析清楚了就写脚本

v8 = ':\"AL_RT^L*.?+6/46'
v7 = 'harambe'
flag = ''
for i in range(len(v8)):
    c = ord(v7[i%7])^ord(v8[i])
    flag += chr(c)
print(flag)

得到flag:RC3-2016-XORISGUD

7.game

这道题挺有意思的,开始我试着玩了一下,,直接1,2,3,4,5...8就成功了,自己都有点懵。

但还是尝试着用逆向的方法做了下

这道题已经很明显了,输入数字后判断是否为1-8.然后使所有的图形亮起来就可以得到了。

那我们拖入od找到判断图形是否会亮的的语句把跳转直接转到输出flag的地方就可以了。

先智能搜索找到开始输入数字的地方

 双击,开始找何时判断图形是否亮。。在其中看到一个cls清屏的地方,在哪里设置断点,运行后随便输入一个值,然后f8单步进入,一步一步会发现判断是在清屏之前,也就是下面这些jnz

 在上面找到

这句话的地址,然后把上面第一个jnz改成   jmp 这个地址,开始运行,随便输入一个值就会出现flag

 当然,我这里也显示调试错误,但是flag已经出现,无伤大雅。

flag:zsctf{T9is_tOpic_1s_v5ry_int7resting_b6t_others_are_n0t}

8.getit

拖入ida查看代码后发现

首先给v5赋初值,并根据v5与1的与运算给v3赋值,然后计算s[(signed int)v5] + v3的值并存入t[v5+10]中,然后写入flag.txt文件中

要注意关键代码

LODWORD(v5) = 0;
  while ( (signed int)v5 < strlen(s) )
  {
    if ( v5 & 1 )
      v3 = 1;
    else
      v3 = -1;
    *(&t + (signed int)v5 + 10) = s[(signed int)v5] + v3;
    LODWORD(v5) = v5 + 1;
  }

所以我们再看s,t中存放的数据

 s很明确,t这里要注意一下,是0x53+harifCTF{????????????????????????????????}

那么写脚本

s='c61b68366edeb7bdce3c6820314b7498'
t1='SharifCTF{????????????????????????????????}'
t = []
for x in t1:
    t.append(x)
v6=0
for i in range(len(s)):
    if v6&1:
        v3=1
    else:
        v3=-1

    t[v6+10]=chr(ord(s[v6])+v3)
    
    v6=v6+1  
flag=''
for x in t:
    flag+=x
print (flag)

得到flag:SharifCTF{b70c59275fcfa8aebf2d5911223c6589}

9.re1

这道题就比较简单了,拖入od,智能搜索,发现flag就在第一行、

 

 flang:DUTCTF{We1c0met0DUTCTF}

好了今天就到这里了,明天再见!

猜你喜欢

转载自www.cnblogs.com/0ice/p/12520013.html