五一小结

五一总结
又是一个被同龄人拉开差距的假期

fango

又是一个go语言
这道题是最近的*ctf的水题。。。
*ctf不适合我这种萌新。。。最简单的题目就这么恶心了
一开始还真没想出来
以为香农范诺编码啥的,还有什么数据结构还没学。。。
但事实上这题和什么香农编码啊数据结构啊没有太大关系
主要操作其实就是一个解码操作
1
可以看到他符号表都没有删
有个fano解码的操作
然后再与内存中的一大串字符串比较
其实输入就是内存中那一大串字符串再来个fano编码了
再看看他的函数列表
2
可以看到还有一个加密的函数
这个函数没有被引用到其实是出题人写好了给你的
具体解法呢就是输入那一串字符串

1
If you cannot read all your books...fondle them---peer into them, let them fall open where they will, read from the first sentence that arrests the eye, set them back on the shelves with your own hands, arrange them on your own plan so that you at least know where they are. Let them be your friends; let them, at any rate, be your acquaintances.

然后在call decode进去后set eip在encode处
然后下断点后f9直接看回显,可以看到是不可打印字符,没事,用pwntools提交一下就完事了
有几个注意点就是在输入字符串后他会把回车也读进去,在内存中patch一下就行
还有就是encode和decode操作不可以跟进去不知道为什么
一跟进去程序就直接跑飞了

1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/env python2

from pwn import *

a = remote('34.92.37.22',10001)
b = [0x2B, 0x60, 0xC3, 0xBE, 0xC2, 0xB7, 0xC2, 0x82, 0xC2, 0x89, 0xC3, 0x95, 0x5B, 0xC2, 0x87, 0x2A, 0x69, 0x13, 0xC2, 0x96, 0x51, 0xC3, 0xBD, 0x6F, 0x32, 0x28, 0x5A, 0xC3, 0x92, 0x74, 0xC2, 0x94, 0xC2, 0x94, 0xC2, 0x95, 0xC2, 0x96, 0xC2, 0xA4, 0xC3, 0x8A, 0xC2, 0xA3, 0xC3, 0x8E, 0xC2, 0xB3, 0x24, 0x24, 0x24, 0xC2, 0xBA, 0xC2, 0xAE, 0x46, 0x2B, 0xC2, 0xAC, 0x3C, 0xC3, 0xAB, 0x32, 0x23, 0x2A, 0xC3, 0xB0, 0xC3, 0xB3, 0xC2, 0xAC, 0xC3, 0x85, 0xC2, 0x87, 0x2C, 0xC2, 0xA3, 0x6B, 0xC2, 0xAD, 0x0F, 0xC3, 0x87, 0x5C, 0xC2, 0xA8, 0xC3, 0xB3, 0xC2, 0xAF, 0xC3, 0xA1, 0xC3, 0xB9, 0x12, 0xC3, 0x8A, 0x44, 0x72, 0xC2, 0xA6, 0xC2, 0x91, 0x66, 0x6D, 0x31, 0xC3, 0xA7, 0x51, 0x64, 0x67, 0x78, 0x75, 0x6B, 0xC2, 0x96, 0xC2, 0x91, 0x51, 0xC3, 0xA7, 0x3E, 0x13, 0xC3, 0x8E, 0x57, 0x7B, 0x47, 0xC2, 0x9D, 0x45, 0x7F, 0x29, 0x11, 0xC3, 0x95, 0xC3, 0xA1, 0xC3, 0xA7, 0x59, 0xC2, 0x8A, 0x06, 0xC2, 0x8C, 0xC2, 0x91, 0xC2, 0xB5, 0x0F, 0x3A, 0xC2, 0x8E, 0xC2, 0xBA, 0xC3, 0x8B, 0xC3, 0xAA, 0xC3, 0xA8, 0xC3, 0xBC, 0xC2, 0x8E, 0x71, 0xC3, 0xBD, 0x6F, 0x32, 0x36, 0xC3, 0xB9, 0x42, 0xC3, 0xA7, 0x49, 0xC3, 0x92, 0x22, 0x79, 0xC3, 0x89, 0xC3, 0x93, 0x54, 0x79, 0xC3, 0x96, 0x63, 0x6A, 0x1F, 0xC3, 0x96, 0xC3, 0xB3, 0x23, 0x6F, 0xC2, 0x94, 0x37, 0xC2, 0x94, 0xC3, 0xA8, 0x76, 0xC3, 0x83, 0xC3, 0x8E, 0x7C, 0x3F, 0xC2, 0xAD, 0xC3, 0xA0, 0xC2, 0x9F, 0x0C, 0xC2, 0xAA, 0x7B, 0xC3, 0x83, 0x26, 0xC2, 0xAD, 0xC3, 0xB0, 0x7E, 0x3A, 0xC3, 0xA5, 0x47, 0xC2, 0x9D, 0x7F, 0x09, 0xC3, 0xA5, 0x49, 0x44, 0xC2, 0xB0, 0xC2, 0xAF, 0x0F, 0x3A, 0xC3, 0x8C, 0x50, 0x51, 0xC3, 0xBD, 0x6F, 0x32, 0x2C, 0xC3, 0x8C, 0x2D, 0x27, 0x49, 0xC3, 0xA3, 0x2A, 0xC3, 0xB0, 0xC3, 0xB3, 0xC2, 0xAC, 0xC3, 0x88, 0xC2, 0x89, 0xC3, 0xB0, 0xC2, 0x9D, 0x7E, 0x1C, 0xC2, 0x9F, 0x29, 0x11, 0x41, 0x47, 0xC3, 0xB5, 0xC2, 0xBC, 0xC3, 0x88, 0xC2, 0x9A, 0x38, 0xC3, 0xB0, 0xC3, 0xA2, 0xC2, 0xB8, 0xC3, 0xA9, 0x15, 0xC3, 0x92, 0x50]
f = ''
for i in range(len(b)):
f += chr(b[i])
a.send(f)
a.interactive()

长见识了。。。
原来还有这种操作

iscc re2

iscc就是个辣鸡比赛
上分全靠py
题目出的和什么一样
re1出成脑洞题
re2 300分就是一个明文比较
唯一的看点就是他是rust写的了

1
2
3
4
5
6
7
a = [0x5f,0x6a,0x75,0x73,0x74,0x5f,0x6e,0x65,0x65,0x64,0x5f,0x74,0x6f
,0x5f,0x67,0x65,0x74,0x5f,0x77,0x68,0x61,0x74,0x5f,0x69,0x73,
0x5f,0x6e,0x65,0x65,0x64,0x65,0x64,0x5f,0x2e]
flag = ''
for i in range(len(a)):
flag += chr(a[i])
print flag

写法就是直接怼汇编
程序把内存中一段加密好的数据解密了再与明文比较

tank game

拿到题目惊了,真让我逆一个坦克大战吗???
结合棒子国网站的那个cs的逆向
总结一下,对于这种"大型"游戏逆向
直接拖进ida,一通乱找,配合第六感来找flag
找到奇怪的代码段直接set ip
比如说有很多数据还有对数据进行操作的代码段
3
可以看到这边有个奇怪操作
4
点进去看可以看到类似flag的东西
5
当然运行完发现桌面也有了个flag

tu-ctf-2016 reverse-for-the-holy-grail-350

c艹逆向
对于c艹的逆向,我一般都是主看函数传参
如果传入的参数没有与输入相关的,直接忽视
或者说,输入传进去,出来后没变,直接忽视
还有就是配合一些黑盒猜测
这题的加密还是有点复杂的
6
整体逻辑就是输入三次
前俩次输入其实都没什么卵用
主要是和第三次输入相关
7
找到和第三次输入相关的主要验证段
第一个操作就是明文比较
出题人很友善,符号表没删,可以看到firstchar
其实就是每三个的第一个与这个数组比较
下一个check
8
可以看到在下一个check之前有一个整体xor操作
具体check是每个xor后的thirdchar的明文比较
解密很轻松,异或回来呗
secondchar的话我这边选择爆破

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
from z3 import *
flag = ''
a = [0]*18
dest1 = [0x41,0x69,0x6e,0x45,0x6f,0x61]
dest2 = [0x2ef,0x2c4,0x2dc,0x2c7,0x2de,0x2fc]
dest3 = [0x1d7,0xc,0x244,0x25e,0x93,0x6c]
b = [65, 0, 114, 105, 0, 97, 110, 0, 114, 69, 0, 114, 111, 0, 101, 97, 0, 63]
j = 0
v7 = [0]*18
for i in range(18):
if i == 0:
v7[i] = 666
continue
else:
v7[i] = v7[i-1] + v7[i-1]%5
for i in range(18):
if 3*int(i/3) == i:
a[i] = dest1[i/3]
for i in range(18):
j += 1
if j%3 == 0:
a[j-1] = dest2[(j-1)/3]^v7[j-1]
print a
for i in range(len(b)):
b[i] ^= v7[i]
print b
for j in range(6):
for i in range(128):
temp = i
if ((temp ^ v7[3 * j + 1]) * b[3 * j]) % b[3 * j + 2] == dest3[j]:
a[3 * j + 1] = i
print i
for i in range(len(a)):
if a[i]:
flag += chr(a[i])
else:
flag += '?'
print flag

这是当初写的草稿脚本
不是最终脚本
就这样吧
题目不错
另外,明天下午就要去x1c面试了
祝我能加入x1ct34m
希望吧。。。
听说驴师傅出的题很难。。。
唉。。。慌。。。

文章目录
  1. 1. fango
  2. 2. iscc re2
  3. 3. tank game
  4. 4. tu-ctf-2016 reverse-for-the-holy-grail-350
|