Jche
qwqqqqqq

normal归纳

2021-12-10 归纳

starts

在写normal3和4的时候感受到自己看题太不仔细了,normal3在最后调试答案的时候加了头和尾,一直显示flag错误,想了一想才知道这个是因为没有看清最后题目的输出。还是要把每道题都理解透彻自己反复思考去看怎么做,哪里自己没有注意到,好好去归纳总结一下。

递归

在normal3的时候遇到了递归算法,其实一开始想的是一个replace,感觉像是给flag的值用一个str的下标来替换,调试的时候一直在很混乱的循环,也没有想到递归这层,还是平常的基础知识运用的不够熟悉,遇到这些常见的算法都反应不过来。其实按照题目的意思是一个递归的排序。

递归算法简单来说就是一种调用自身函数的算法,递归必须有明确的结束条件,不然就是无止境的循环消耗电脑内存,可以说是利弊共存。

就题目里来说递归就是这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
data = 0
arr = []
arr1 = []

def fun(a):
global data
global arr
global arr1
if(a < 64):
arr.append(data)
arr1.append(a)
data = data + 1
fun(2*a + 1)
fun(2*(a + 1))

调用自身来进行运算

hex与bytes

又到了这个话题,上次写过一个hexstring和bytes的转化,写了很久,在normal4里面又碰到了这个问题。

在汇编窗口里你会发现这样的东西。byte ptr。这道题我没有调试,我直接照着伪代码逆了,结果错了,也没有想明白到底是为什么list会越界,也没有仔细去看汇编。从头再分析过来发现伪代码里的变量是被拆分了的,因为这里是把hex的字符串转成byte,然后以每两位写入。

有时候会遇到变量很多很难看,这时候就要反应过来看汇编和调试汇编了(我就没这么做就寄了),因为多个变量很有可能是组成一个地址的值或者字符,从而来replace这样,直接逆搞了好久也没有逆出东西来,一直在提示我越界。这道题其实就是一个replace,str2的下标是flag[i]的值的ascii码,只要索引str[i] ^ 0x19在str2里下标就可以了。

网上搜了一下是2018年湖湘杯的一道题,我看了爆破的脚本严重怀疑越界的可能性但应该别人出的脚本没有问题,等到有空考证了就补充上去。

果然是没问题的,自己脚本越界是因为提取的时候没有按byte提。。。爆破也可以,128个可显示字符来爆破。

在ida里有个&的字符在input前面,在这个地方是明显的取址字符,碰到的时候要注意。在复习数组识别的时候也有相同的提示,例如a[a+i4],这里的a+i * 4是一个典型的整数数组的寻址,一个int为四个字节,是一个int指针,可以将类型修改成int

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
39
40
41
42
43
44
45
46
47
data1 = [0x32, 0x61, 0x34, 0x39, 0x66, 0x36, 0x39, 0x63, 0x33, 0x38, 0x33, 0x39, 0x35, 0x63, 0x64, 0x65, 0x39, 0x36, 0x64, 0x36, 0x64, 0x65, 0x39, 0x36, 0x64, 0x36, 0x66, 0x34, 0x65, 0x30, 0x32, 0x35, 0x34, 0x38, 0x34, 0x39, 0x35, 0x34, 0x64, 0x36, 0x31, 0x39, 0x35, 0x34, 0x34, 0x38, 0x64, 0x65, 0x66, 0x36, 0x65, 0x32, 0x64, 0x61, 0x64, 0x36, 0x37, 0x37, 0x38, 0x36, 0x65, 0x32, 0x31, 0x64, 0x35, 0x61, 0x64, 0x61, 0x65, 0x36, 0x00]
data = [0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67,
0x2B, 0xFE, 0xD7, 0xAB, 0x76, 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47,
0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0, 0xB7, 0xFD, 0x93,
0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31,
0x15, 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80,
0xE2, 0xEB, 0x27, 0xB2, 0x75, 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A,
0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, 0x53, 0xD1, 0x00,
0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58,
0xCF, 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02,
0x7F, 0x50, 0x3C, 0x9F, 0xA8, 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38,
0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, 0xCD, 0x0C, 0x13,
0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19,
0x73, 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8,
0x14, 0xDE, 0x5E, 0x0B, 0xDB, 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24,
0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79, 0xE7, 0xC8, 0x37,
0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE,
0x08, 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74,
0x1F, 0x4B, 0xBD, 0x8B, 0x8A, 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6,
0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, 0xE1, 0xF8, 0x98,
0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28,
0xDF, 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D,
0x0F, 0xB0, 0x54, 0xBB, 0x16]



def fun(i):
if(data1[i] < 48 | data1[i] > 57):
a = data1[i] - 87
else:
a = data1[i] - 48
a = a * 16
if(data1[i+1] < 48 | data1[i+1] > 57):
b = data1[i+1] - 87
else:
b = data1[i+1] - 48
return ((a + b) ^ 0x19)

for i in range(35):
z = i
for m in range(128):
a = (m >> 4) % 16
b = (16 * m >> 4) % 16
j = 16 * a + b
k = fun(i*2)
if(data[j] == k):
print(chr(m),end="")

END

多归纳,,,不然会忘掉,,,

Author: John Doe

Link: http://example.com/2021/12/10/induction-1/

Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.

< PreviousPost
符号位扩展
NextPost >
《逆向工程核心原理》-1
CATALOG
  1. 1. starts
  2. 2. 递归
  3. 3. hex与bytes
  4. 4. END