HackPluto's Blog

攻防世界逆向入门writeup

字数统计: 1.1k阅读时长: 4 min
2019/06/13 Share

1.re1

这个题方法挺多的,我主要介绍两种
1 逆向分析法:
拖入IDA后,进入main函数,反汇编看伪C代码
简单的分析下整个函数,输入字符串v9,再比较v5,v9,如果不相等就输出 aFlag,相等就输出 unk_413E90。

分别点进这两个内存查看内容

发现这两个地方都不是flag,所以我认为这个题不是输出flag,而是看我们的输入是不是flag,所以跟踪v5字符串
对 _mm_storeu_si128() 函数进行进一步分析,这个是intel的一个指令,简而言之就是将参数里后面的直接赋值给前面,所以直接查看 xmmword_413E34 找到了flag

2 查找字符串:
因为我们看到这个题没有计算或者加密flag,所以猜测这个题可以直接搜索程序中的字符串,我也发现很多大佬做题也喜欢上来就搜索字符串,通常都可以找到一些线索。
搜索字符串可以使用IDA自带的shift+F12,也可以使用strings工具,这个工具也很简单,直接在CMD中输入strings 加文件名就好了,最后可以找到falg

2.game

进入IDA,进入main函数,反汇编

这个题就是不断的输入v1然后各种判断,各种操作,其实这些不必要深究,继续往下看

这里又是一波判断,然后如果都为真就进入下面的函数,我敏锐的察觉到这个调用的函数不简单
进入这个函数看看
这个地方就是对字符串v2进行修改然后输出,所以我们直接把这一段伪C变成python脚本跑出来就好了

1
2
3
4
5
6
7
8
9
a=[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] 
b=[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]
i=0
c=''
while (i<56):
a[i] = a[i] ^ b[i] ^ 0x13
c += chr(a[i])
i=i+1
print (c)

3.helloctf

进入IDA查看,这个程序不是很长也比较好分析,直接来看这个比较函数,如果v10和v13相等就输出success,否则就是失败。

v13就是题目中给出的那一串字符串,那么v10是怎么出来的呢。通过分析这一段函数

v10是由v8拼起来的,v8是由v4输入的(sprintf),v4是v9不断迭代出来的,v9是我们输入的字符串。
这个sprintf中间还有一个参数,点进去后发现是 %x

所以是按十六进制输出的。所以这个程序就是将我们的输入按十六进制输出到v10中,最后v10要等于v13。
按照题意写出解密脚本

1
2
3
4
5
a = [0x43,0x72,0x61,0x63,0x6b,0x4d,0x65,0x4a,0x75,0x73,0x74,0x46,0x6f,0x72,0x46,0x75,0x6e]
b = ""
for i in a:
b += chr(i)
print(b)

4.open-source

直接看源码
按照题意解密

注意这里需要按16进制输出

5.simple-unpack

题目中有提示文件加了壳,所以先讲文件拖入peid查壳,发现是upx壳,这也是个比较基础的壳,破解的工具很多,我这里选择的是upxshell,脱壳之后拖入IDA,可以看到明文的flag

6.logmein

程序并不难理解,就是 v7和v8相互异或的过程

下面说代码里的两个坑:

  1. ((&v7 + i % v6) 首先&v7就是对v7取地址,后面对加法相当于是指针的偏移,最后对 () 就是取地址中的内容,所以这句代码就是对v7的一个遍历

2.第二个坑就是这个v7


v7在内存中是一个长整型数据,那就涉及到一个存储顺序对问题,这里肯定是小端序,所以我们一定要注意将v7转换成字符之后读取对顺序和显示对顺序是反的,因为指针是从低地址向高地址移动

将题目过程翻译成python脚本

1
2
3
4
5
6
7
8
v7 = 'harambe'
v8 = r':"AL_RT^L*.?+6/46'
s = ""
print(len(v8))
for i in range(len(v8)):
s += chr(ord(v7[i % 7]) ^ ord(v8[i]))

print(s)

CATALOG
  1. 1. 1.re1
  2. 2. 2.game
  3. 3. 3.helloctf
  4. 4. 4.open-source
  5. 5. 5.simple-unpack
  6. 6. 6.logmein