Reverser题目
小白最近做了一些Reverse题目,整理整理
Python-trade
下载文件,发现是pyc文件
用pyc在线反编译网站进行反编译得到py文件
import base64
def encode(message):
s = ''
for i in message:
x = ord(i) ^ 32
x = x + 16
s += chr(x)
return base64.b64encode(s)
correct = 'XlNkVmtUI1MgXWBZXCFeKY+AaXNt'
flag = ''
print 'Input flag:'
flag = raw_input()
if encode(flag) == correct:
print 'correct'
else:
print 'wrong'
- 编码函数主要实现的是对flag的每个字符都先与32异或,然后加16,最后用Base64编码
- 我们可以很容易写出解码函数
import base64
correct = 'XlNkVmtUI1MgXWBZXCFeKY+AaXNt'
s=''
correct_d=base64.b64decode(correct)
for i in correct_d:
x=ord(i)-16
x=x^32
s+=chr(x)
print s
运行程序就可得到flag
Hello,CTF
- 将程序拖入ida,将main函数进行F5,查看伪代码
- 首先,可以看到先是将字符串复制到v13的位置,
- 然后,后面对输入进行了判断,输入的字符串不能大于17
- 接着,将字符串以十六进制输出,然后,再将得到的十六进制字符添加到v10
将v10与v13进行比较,两者相同则输出Success
所以v10=v13
Flag=v13
将v13转为字符串就得到flag
simple-unpack
下载文件,用winhex打开发现是elf文件
根据提示是加壳的文件
使用命令脱壳
用ida打开脱壳之后的程序,直接发现flag
logmein
在ida中打开程序,将main函数f5查看伪代码 sub_4007c0()函数为失败
根据代码知道输入的password长度应该大于18,即v3>strlen(s)
根据这个知道s应该是v7与v8的异或
对于v7,LL是长长整型,v7要转换为16进制然后在转换为字符串,而且字符是小端序,所以把得到的字符翻转然后和v8的每一位进行异或
- 编写代码得到flag
v8=":\"AL_RT^L*.?+6/46"
v6=7
v7='harambe'
s=''
for i in range(len(v8)):
s+=chr(ord(v7[i%v6])^ord(v8[i]))
print s
Open-source
下载文件发现是c语言
发现关键hash计算涉及到first,second,和argv[3]
根据下述判断语句,知道first=0xcafe
根据下述判断语句,知道second % 5 != 3 || second % 17 = 8
而argv[3]是用了strcmp语句来比较,所以argv[3]=“h4cky0u”
根据上述关键条件,写出求hash的代码
first= 0xcafe
third="h4cky0u"
hash = first * 31337 + 8 * 11 + len(third) - 1615810207;
print hex(hash)
Getit
下载文件用winhex分析,发现是elf文件
用ida打开,将F5查看伪代码
MK_FP是一个宏。功能是做段基址加上偏移地址的运算,也就是取实际地址。
简单分析程序知道while循环计算的应该就是flag,查看t的值
说明t存放的应该就是flag
我们用python代码编写循环过程,输出得到flag
s='c61b68366edeb7bdce3c6820314b7498'
v6=0
v3=0
t='SharifCTF{????????????????????????????????}'
t=list(t) //在python中,数字,字符串和元组都是不可变对象。列表是可变对象
while v6<len(s):
if(v6&1):
v3=1
else:
v3=-1
t[v6+10]=chr(ord(s[v6])+v3)
v6 +=1
t="".join(t)
print t