XCTF-Reverse-ExerciseArea-003-writeup

0x00 介绍

本题是xctf攻防世界中Reverse的新手第三题。

对给定的helloctf.exe进行逆向分析,找到serial。

实验环境:IDA Pro 7.0

0x01 解题过程

1.1 前期的分析

运行helloctf.exe,可以看到需要输入serial,如果输错的话会进入下一次循环判断

XCTF-Reverse-ExerciseArea-003-writeup_第1张图片

我们还是从字符串please input your serial:入手。用IDA打开helloctf.exe,Shift+F12,显示在该二进制文件中的所有字符串。在顶部导航栏中:Search → Search,输入字符串please input your serial:,然后双击跳转

XCTF-Reverse-ExerciseArea-003-writeup_第2张图片

再双击,跳到引用该字符串的地方。

XCTF-Reverse-ExerciseArea-003-writeup_第3张图片

可以看到是在main中引用的

XCTF-Reverse-ExerciseArea-003-writeup_第4张图片

并且可以看到,在main函数的开始,将字符串437261636b4d654a757374466f7246756e赋值给了寄存器esi

1.2 具体基本块的分析

用Ollydbg来运行helloctf.exe。可以看到,地址0x40101A–0x401057是读取用户的输入,并对输入字符串的长度进行限制。

XCTF-Reverse-ExerciseArea-003-writeup_第5张图片

地址0x40105F将用户输入字符串的第一个字符赋值给了寄存器al,也就是寄存器eax的低八位。接下来,如果al保存的值为0则直接跳到与字符串437261636b4d654a757374466f7246756e比较的基本块。显然不符合要求,因此第一个字符不能为0

XCTF-Reverse-ExerciseArea-003-writeup_第6张图片

然后是最主要的部分,地址0x401067开始,对于用户输入的字符串,在循环中,将每个字符对应的十六进制数拼接到寄存器edx中保存,比如我输入的是hzylll,那么得到的结果是687a796c6c6c

XCTF-Reverse-ExerciseArea-003-writeup_第7张图片

从地址0x4010B0开始,让上面循环中得到的十六进制字符串跟一开始的字符串437261636b4d654a757374466f7246756e进行比较,二者一致才输出success的字样

XCTF-Reverse-ExerciseArea-003-writeup_第8张图片

XCTF-Reverse-ExerciseArea-003-writeup_第9张图片

结论:分析到这里,题目的意图很明显了,给定一个字符串437261636b4d654a757374466f7246756e,你的输入转成16进制字符串以后必须跟它一样。只要把代码中给的字符串转成ASCII码形式即可

解密脚本:

# -*- coding:utf-8 -*-

import binascii


src_str = '437261636b4d654a757374466f7246756e'
res = binascii.a2b_hex(src_str)

print(res)

脚本运行结果为:CrackMeJustForFun

1.3 结果

输出success!信息,说明拿到了flag

XCTF-Reverse-ExerciseArea-003-writeup_第10张图片

你可能感兴趣的:(ctf)