攻防世界Reverse题目writeup

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,查看伪代码
    攻防世界Reverse题目writeup_第1张图片
  • 首先,可以看到先是将字符串复制到v13的位置,
  • 然后,后面对输入进行了判断,输入的字符串不能大于17
  • 接着,将字符串以十六进制输出,然后,再将得到的十六进制字符添加到v10
    关键判断
    将v10与v13进行比较,两者相同则输出Success
    所以v10=v13
    Flag=v13
    将v13转为字符串就得到flag

simple-unpack

下载文件,用winhex打开发现是elf文件
根据提示是加壳的文件
使用命令脱壳
攻防世界Reverse题目writeup_第2张图片
用ida打开脱壳之后的程序,直接发现flag
攻防世界Reverse题目writeup_第3张图片

logmein

在ida中打开程序,将main函数f5查看伪代码 sub_4007c0()函数为失败
攻防世界Reverse题目writeup_第4张图片
根据代码知道输入的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语言
攻防世界Reverse题目writeup_第5张图片
发现关键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查看伪代码

攻防世界Reverse题目writeup_第6张图片
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

你可能感兴趣的:(逆向题目)