[BUUCTF刷题] Reverse解题方法总结(二)


知识点补充

- 知识点;
python中:
[m : ] 代表列表中的第m+1项到最后一项
[ : n] 代表列表中的第一项到第n项
- 汇编中的test
Test对两个参数(目标,源)执行AND逻辑操作,并根据结果设置标志寄存器,结果本身不会保存。
TEST AX,BX 与 AND AX,BX 命令有相同效果,只是Test指令不改变AX和BX的内容,而AND指令会把结果保存到AX中。
Test命令将两个操作数进行逻辑与运算,并根据运算结果设置相关的标志位。但是,Test命令的两个操作数不会被改变。运算结果在设置过相关标记位后会被丢弃。
test的一个非常普遍的用法是用来测试一方寄存器是否为空:test ecx, ecx 
jz somewhere,如果ecx为零,设置ZF零标志为1,jz跳转。

[FlareOn6]Overlong

修改IDA汇编指令数据

在这里插入图片描述
之后点击Apply patches to input file

  • 本题提示尽可能输入较多的数据,将0x1C改为0x48,重新运行即可
    在这里插入图片描述
    得到
    在这里插入图片描述
    flag{I_a_M_t_h_e_e_n_C_o_D_i_n_g@flare-on.com}

[FlareOn3]Challenge1

发现是base64加密,并且密码表被修改了,直接写脚本:

import base64

encoded_flag = "x2dtJEOmyjacxDemx2eczT5cVS9fVUGvWTuZWjuexjRqy24rV29q"

#ZYXABCDEFGHIJKLMNOPQRSTUVWzyxabcdefghijklmnopqrstuvw0123456789+/
#ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
_list = list("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/")

_flag = ""

for i in encoded_flag:
    if (ord(i) <= ord('W') and ord(i) >= ord('A')) or (ord(i) <= ord('w') and ord(i) >= ord('a')):
        _flag += chr(ord(i) + 3)
    elif i == 'X':
        _flag += 'C'
    elif i == 'Y':
        _flag += 'B'
    elif i == 'Z':
        _flag += 'A'
    elif i == 'x':
        _flag += 'c'
    elif i == 'y':
        _flag += 'b'
    elif i == 'z':
        _flag += 'a'
    else:
        _flag += i

print(_flag)

print(base64.b64decode(_flag).decode())

也可利用maketrans和tranlate改变映射关系

import base64
enc = 'x2dtJEOmyjacxDemx2eczT5cVS9fVUGvWTuZWjuexjRqy24rV29q'
intab = 'ZYXABCDEFGHIJKLMNOPQRSTUVWzyxabcdefghijklmnopqrstuvw0123456789+/'
outtab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
transtab = str.maketrans(intab,outtab)

enc = enc.translate(transtab)
print(base64.b64decode(enc).decode())

[Zer0pts2020]easy strcmp1

  • 知识点:binascii模块的使用
binascii模块主要用于二进制数据(byte类型数据)和ASCII的转换

在16进制和字符串的转换过程中,主要用到了以下几个函数:

a2b_hex():返回16进制的二进制数据表现形式

b2a_hex():返回二进制数据的16进制表现形式

hexlify():返回二进制数据的16进制表现形式

unhexlify():返回16进制的二进制数据表现形式

注意:不同进制之间的转换是以整形数据为基础的,如10进制转换为16进制:hex(int(data,10))
应用:

a = 'hello, world'
a = a.encode()  #将字符串变成二进制比特流形式
print(a)
b = binascii.b2a_hex(a)  #二进制形式转换成16进制比特流形式
print(b)
b = int(b, 16)  #16进制比特流变成整型数据
print(b)
b = hex(b)[2:]  #16进制的整型数据,[2:]是去除开始的0x
print(b)

参考文章

  • wp
    分析逻辑
    在这里插入图片描述
    i>>3即除以8,将a1进行8位一组划分,并与qword_201060数组相减,只需逆向加回来,注意hex存储的小端方式需要反过来
    在这里插入图片描述
    主函数:判断输入的a2[1]是否和zer0pts{********CENSORED********}相等
    在这里插入图片描述
m = [0x410A4335494A0942, 0x0B0EF2F50BE619F0, 0x4F0A3A064A35282B]
enc = "********CENSORED********"
import binascii

flag =b""
for i in range(3):
    p = enc[i*8:(i+1)*8] #8位一组
    a = binascii.b2a_hex(p.encode('ascii')[::-1]) #将每一位转换成ascii码并逆序
    b = binascii.a2b_hex(hex(int(a,16)+m[i])[2:])[::-1] #hex()后的数据为16进制,[2:]是去除开头的0x,[::-1]逆序
    flag+= b
print(flag)

异常处理机制

参考文章:windows的异常处理机制 , SEH
PS:
水一期(最近有点忙)
未解题: crackMe,[ACTF新生赛2020]Oruga(迷宫问题)

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C知道:ctfreverse题型是指需要逆向分析的CTF题目类型。解题思路可以分为以下几个步骤: 1. 静态分析:首先,将给定的进制文件进行静态分析,使用反编译工具(如IDA Pro)来查看代码的逻辑结构和函数调用关系。这可以帮助你理解程序的工作原理和逆向逻辑。 2. 动态调试:将程序加载到调试器(如GDB)中,以动态调试的方式执行程序。通过设置断点、查看寄存器和内存状态,以及跟踪程序执行流程,可以帮助你理解程序的运行过程和数据处理方式。 3. 逆向逻辑分析:根据程序的静态分析和动态调试结果,分析程序的逆向逻辑。这包括理解输入数据的处理方式、算法和加密机制等。你可以关注特定的代码块或函数,并尝试弄清楚它们的功能和目的。 4. 寻找漏洞或关键信息:在逆向逻辑分析的过程中,要留意可能存在的漏洞或关键信息。这可能是一些硬编码的密码、密钥或验证条件等。寻找这些信息有助于解决问题或绕过验证。 5. 反向运算或解密:根据逆向逻辑和找到的关键信息,尝试进行反向运算或解密。这可能涉及到逆向算法、还原加密操作或破解密码等。使用逆向工具或编写自定义脚本来实现这些操作。 总之,ctfreverse题型的解题思路是通过静态分析和动态调试来理解程序的逆向逻辑,寻找漏洞或关键信息,并进行反向运算或解密来获取答案或绕过验证。这需要一定的逆向工程技术和经验,因此平时的学习和实践是非常重要的。希望这个解题思路对你有所帮助!如果有其他问题,欢迎继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Y1seco

我们都在慢慢进步

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值