BUUCTF[ACTF新生赛2020]easyre
[ACTF新生赛2020]easyre
一、查壳
有壳,脱壳得:
二、IDA分析
1.main
2.分析
综合看,可以得:flag=v6+v5+v10
16-17行:v6=' ACTF{ ' v10=' } '
所以重点在v5,关键语句是23-24行
要成功必须:v4[i] == byte_402000[*((char *)v5 + i) - 1]
v4=" *F'"N,"(I?+@ "(13行)
因为((char *)v5 + i)=v5[i]
所以byte_402000[*((char * )v5 + i) - 1] =byte_402000[i - 1]
byte_402000=' ~}|{zyxwvutsrqponmlkjihgfedcba`_^][ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$# !" '(通过Hex View表获取更方便)
所以要v5要使byte_402000.find(i) + 1
3.写脚本(里面的 ' 要写成 \ ')
n="*F'\"N,\"(I?+@"
m='~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)(\'&%$# !"'
flag=''
for i in n:
flag+=chr(m.find(i)+1)
print(flag)
---------------------------------------------------------
U9X_1S_W6@T?
三、答案
flag为ACTF{U9X_1S_W6@T?}
因为我做的是BUUCTF上面的所以要写成flag{U9X_1S_W6@T?}
知识
1.python的find()语法
定义和用法
find() 方法查找指定值的首次出现。
如果找不到该值,则 find() 方法返回 -1。
find() 方法与 index() 方法几乎相同,唯一的区别是,如果找不到该值,index() 方法将引发异常。
语法
string.find(value, start, end)
参数值
参数 | 描述 |
---|---|
value | 必需。要检索的值。 |
start | 可选。开始检索的位置。默认是 0。 |
end | 可选。结束检索的位置。默认是字符串的结尾。 |
实例
单词 "welcome" 在文本中的什么位置?
txt = "Hello, welcome to my world."
x = txt.find("welcome")
print(x)
-----------------------------
1
字母 "e" 在文本总首次出现的位置:
txt = "Hello, welcome to my world."
x = txt.find("e")
print(x)
---------------------------------
1
如果只搜索位置 5 到 10 时,字母 "e" 在文本总首次出现的位置:
txt = "Hello, welcome to my world."
x = txt.find("e", 5, 10)
print(x)
------------------------------------
8
2.for i in n:
和 `for i in range(n)
是两种不同的循环结构,它们在处理字符串时的行为不同。
for i in n:
-
这种循环结构用于遍历字符串
n
中的每个字符。 -
在每次迭代中,变量
i
会被赋值为字符串n
中的一个字符。 -
例如,如果
n = "*F'\"N,\"(I?+@"
,那么i
会依次取值*
、F
、'
、"
、N
等。
for i in range(n):
-
这种循环结构用于遍历从 0 到
n-1
的整数序列。 -
range(n)
生成一个从 0 到n-1
的整数序列。 -
但是,如果
n
是一个字符串,range(n)
会引发错误,因为range()
函数的参数必须是整数。 -
例如,
range(5)
会生成序列[0, 1, 2, 3, 4]
,但range("hello")
会引发TypeError
。
正确的使用方式
-
如果你想遍历字符串
n
中的每个字符,应该使用for i in n:
。 -
如果你想遍历一个整数序列,可以使用
for i in range(len(n)):
,其中len(n)
是字符串n
的长度,这样i
将从 0 到len(n)-1