攻防世界-逆向-新手上篇(1 to 8)


  • game
  • open-source
  • simple-unpack
  • logmein
  • insanity
  • python-trade
  • re1
  • Hello,CTF

game

定位到出flag条件的地方
game-1.png

直接看最后的异或操作
game-2.png

写脚本异或
v2和v3和v5就是反汇编出来的v2和v3还有v5,这边存成txt批量处理比较方便

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
import re
v2=[]
v5=[]
v3=[]
str1="`S,yhn _uec{"
str2="u~"
flag=""
with open("v2.txt","r") as f:
for line in f:
r=re.findall('=(.*?);', line)
tmp="".join(r)
v2.append(int(tmp))
for i in str1:
v2.append(ord(i))
with open("v3.txt","r") as f:
for line in f:
r=re.findall('=(.*?);', line)
tmp="".join(r)
v2.append(int(tmp))
for i in str2:
v2.append(ord(i))
with open("v5.txt","r") as f:
for line in f:
r=re.findall('=(.*?);', line)
tmp="".join(r)
v5.append(int(tmp))
for i in range(56):
v2[i] ^= 0x13
v2[i] ^= v5[i]
flag+=chr(v2[i])
print(flag)
# zsctf{T9is_tOpic_1s_v5ry_int7resting_b6t_others_are_n0t}

找到输出开始的位置,替换为跳转到输出flag的位置
jmp 00a8e968
game-3.png

直接改完后也可以出flag
game-4.png


open-source

看脚本的最后和之前的三个参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
看三个逻辑体就是不能让他退出
那第一个不等于0xcafe,就是要让他等于才可以
第二个因为是或,所以要满足两边都是00才可以,可以写脚本爆破一下数字
第三个就是比较h4cky0u和第三个参数,如果相等返回0就不退出了

if (first != 0xcafe) {
printf("you are wrong, sorry.\n");
exit(2);
}


if (second % 5 == 3 || second % 17 != 8) {
printf("ha, you won't get it!\n");
exit(3);
}


if (strcmp("h4cky0u", argv[3])) {
printf("so close, dude!\n");
exit(4);
}

open-source-1.png

1
2
3
4
5
6
7
8
9
10
11
12
13
import z3
# second % 5 == 3 || second % 17 != 8
first=51966
# second=25
three="h4cky0u"
for i in range(100):
if(i % 17 == 8):
if(i % 5 !=3):
print(i)
break
tmp=first * 31337 + (i % 17) * 11 + len(three) - 1615810207
print(hex(tmp))

open-source-2.png

c0ffee


simple-unpack

upx -d直接脱壳

strings 文件名 | grep flag


logmein

logmein-1.png

1
2
3
sub_4007C0就是给出了错误的提示 “Incorrect password”
然后就是满足strlen(v8)的位数要求和满足输出的每一位要==(char)(*((_BYTE *)&v7 + i % v6) ^ v8[i])
上面的v7因为是小端序, 所以要逆序
1
2
3
4
5
6
7
8
9
10
11
12
# v8=":\\\"AL_RT^L*.?+6/46"
v8 = ':\"AL_RT^L*.?+6/46'
print(len(v8))
# v7="ebmarah"
# print(v7[::-1])
v7="harambe"
v6=7
flag=""
for i in range(len(v8)):
flag+=chr(ord(v7[i%v6]) ^ ord(v8[i]))
print(flag)
# RC3-2016-XORISGUD

RC3-2016-XORISGUD


instanity

ida主函数打开直接往里跟就能看到flag

9447{This_is_a_flag}


python-trade

python-trade-1.png

直接逆就好了
base64decode-16 ^ 32

1
2
3
4
5
6
7
8
9
import base64
a="XlNkVmtUI1MgXWBZXCFeKY+AaXNt"
flag=""
tmp=base64.b64decode(a)
print(tmp)
for i in tmp:
flag+=chr((i-16) ^ 32)
print(flag)
# nctf{d3c0mpil1n9_PyC}

nctf{d3c0mpil1n9_PyC}


re1

od直接智能搜索文本或者strings 文件名 | grep CTF


Hello,CTF

这里其实只用注意比较的是字符串常量就可以了。在比较的时候会把v10和v13转成字符串

所以把v13转成字符串输入就可以了
限制了输入的长度,应该是17,然后在把输入的每一位转成16进制然后拼接起来
strcat就是字符串拼接。
%x就是格式化输出(十六进制小写)
![Hello, CTF-1.png](Hello, CTF-1.png)

![Hello, CTF-2.png](Hello, CTF-2.png)

CrackMeJustForFun