来源:https://buuoj.cn/
内容:
附件:https://pan.baidu.com/s/1CL9SAiLOT6Y1aPuVq1tYOw?pwd=hsd5 提取码:hsd5
答案:watevr{esrever_reversed_youtube.com/watch?v=I8ijb4Zee5E}
总体思路详细步骤用ida打开发现默认是按com加载,但该文件是elf文件,故选按elf加载
发现大量函数,但是都不涉及input,暂时忽略
找到判断flag的地方,发现是逐个判断数值是否相等,导出栈中所有的值得到结果
导出寄存器中的值,与上一步结果拼接
-
查看文件内容
- 使用ida64打开,按elf加载
-
发现几个函数,逐个点进去查看
-
这些函数的计算都比较简单,但是都和v_input没有关系,关注到输入和判断的地方。
-
发现是通过
f_encode
函数判断以后就直接输出了 -
进入
f_encode
发现有个f_check
函数,此时v_input作为最后一个参数传入,继续跟进。 -
这里直接对v_input与每个参数进行值判断,则我们在这里下一个断点。
-
其运行到断点出以后栈中是各个参数的值,寄存器中是前几个参数,分别是
rdi
、rsi
、rdx
、rcx
、r8
、r9
-
这里是因为在x64汇编架构中
-
X64汇编
64位CPU有16个通用寄存器,寄存器存放8个字节数据,它们名称分别为:
rax,rbx,rcx,rdx,rsi,rdi,rsp,rbp
r8,r9,r10,r11,r12,r13,r14,r15
32位使用栈帧来作为传递的参数的保存位置,而64位使用寄存器,分别用rdi,rsi,rdx,rcx,r8,r9作为第1-6个参数。rax作为返回值。
64位没有栈帧的指针,32位用ebp作为栈帧指针,64位取消了这个设定,rbp作为通用寄存器使用。
rax 作为函数返回值使用。
rsp 栈指针寄存器,指向栈顶
rdi,rsi,rdx,rcx,r8,r9 用作函数参数,依次对应第1参数,第2参数。。。
rbx,rbp,r12,r13,r14,r15 用作数据存储,遵循被调用者使用规则,简单说就是随便用,调用子函数之前要备份它,以防他被修改。
r10,r11 用作数据存储,遵循调用者使用规则,简单说就是使用之前要先保存原值。
-
-
我们复制栈顶的值
07FFDEB2D83F8
并在汇编窗口中按g键跳转到这个地方,按*键将此处前足够多个(比如500个)转换为数组,得到栈的值- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xY2p0amv-1651905271987)(http://www.kaotop.com/file/tupian/20220508/image-20220507142527231.png)]
-
按shift+e导出这些值,使用python进行处理
-
data = '7B0000000000000065000000000000007300000000000000720000000000000065000000000000007600000000000000650000000000000072000000000000005F00000000000000720000000000000065000000000000007600000000000000650000000000000072000000000000007300000000000000650000000000000064000000000000005F0000000000000079000000000000006F00000000000000750000000000000074000000000000007500000000000000620000000000000065000000000000002E0000000000000063000000000000006F000000000000006D000000000000002F00000000000000770000000000000061000000000000007400000000000000630000000000000068000000000000003F0000000000000076000000000000003D000000000000004900000000000000380000000000000069000000000000006A00000000000000620000000000000034000000000000005A0000000000000065000000000000006500000000000000350000000000000045000000000000007D00000000000000A0872DEBFD7F0000C291139AFFFFFFFFD5B3BF5C000000002D68F2C7FFFFFFFFC20000000000000016867D4200000000A0872DEBFD7F0000160000000000000005AF41000000000077000000000000006100000000000000740000000000000065000000' data = bytearray.fromhex(data) data = data.replace(b','b'')print ()data// bytearray (b'{esrever_reversed_youtube.com/watch?v=I8ijb4Zee5E}\xa0\x87-\xeb\xfd\x7f\xc2\x91\x13\x9a\xff\xff\xff\xff\xd5\xb3\xbf\-h\xf2\xc7\xff\xff\xff\xff\xc2\x16\x86}B\xa0\x87-\xeb\xfd\x7f\x16\x05\xafAwate')
{esrever_reversed_youtube.com/watch?v=I8ijb4Zee5E}
-
复制中其中的
- CTF逆向-常用的逆向工具 提取码:pnbt 作为flag后部分
-
-
再拼接寄存器中的值 di si dx cx r8 r9 ,77 61 74 65 76 72 = ‘watevr’
故最后答案为 watevr{esrever_reversed_youtube.com/watch?v=I8ijb4Zee5E}
- 中国某省队CTF集训(逆向工程部分)(已授权)(一)
- B站教程中国某省队CTF集训(逆向工程部分)
- 基础加密方式例如
Base64
、Z3
换表 - Python库
约束求解
方程式、不定式等的 - 基础的假跳转花指令(脏字节)
XXTEA
- 基础加密方式例如
- 扁平化程序控制流
- 非自然程序流程
- OLLVM程序流程(虚拟机壳) 很难一般不考
- ida里面按
Ty
键跟踪,寻找所有w
为 - 中国某省队CTF集训(逆向工程部分)(已授权)(二) 的引用(即类型是写入的),通常就是关键位置
X
- 逐条去解析用py字典手动实现的指令调用
- C++编译的程序的逆向
- 简单模运算加密
- base58 寻找一下特别大的数,这种数通常是算法的标识,或者ida7.7版本以上自带的
ctrl+alt+f
插件 - 常见的关键位置是有新的内存分配的地方通常是关键地方,或者函数中间突然return的地方也是
find crypt
int 3
- 注意观察会执行的反调试分支,例如出现
- 大小端序 ,需要跳过去
- Python反汇编方法 Python的pyc字节码反编译反汇编相关知识
更多CTF逆向题通用性做法和常用工具下载参考该博文内容:CTF逆向Reverse题的玩法
相关逆向CTF题-
Python
- [CTF逆向-羊城杯 2020]Bytecode-WP-Python字节码反编译
- CTF逆向-[watevrCTF 2019]Timeout-WP-远程调试和修改程序当前运行位置RIP
-
远程调试汇编
- CTF逆向-Dig the way Interesting Pointer-通过栈溢出方式覆盖变量以达到修改执行流程的目的
-
流程控制
- [CTF逆向-NPUCTF2020]Baby Obfuscation-逆向思维编写脚本以及函数含义的逻辑理解
-
逆向思维
- [CTF逆向-MRCTF2020]EasyCpp - C++类型的逆向通用 *** 作方法
- [CTF逆向-SUCTF2018]babyre-WP-cpp简单迭代并按表输出值的爆破
- [CTF逆向-网鼎杯 2020 青龙组]bang-安卓脱壳逆向:frida-dexdump导出得到源码
-
安卓
- [CTF逆向-GWCTF 2019]babyvm-WP-虚机模拟流程反向编码和z3约束求解器解方程工具的使用
-
虚拟机
- [CTF逆向-WMCTF2020]easy_re-WP_虚机-perl加载器截取
- [CTF逆向-SCTF2019]creakme-WP-基于AES加密算法下的保护:反调试及except_handler和SMC
-
反调试和SMC
- CTF逆向-[FlareOn1]Shellolololol-栈上执行,多层smc的动调得到最终结果
- Python 基于pycryptodome,实现对AES、DES、3DES、RSA等常用加密算法的使用,文末附各种加密的源码示例
-
加密
- [CTF逆向-FlareOn2]very_success-WP_rol循环位移加密
- [CTF逆向-CISCN2018]2ex-WP_mips-32架构以及base64换表
- base64换表
- [CTF逆向-De1CTF2019]Re_Sign-简单脱壳和base64换表编码的深度算法跟踪
- [CTF逆向-SCTF2019]babyre-WP_简单去花指令和流程识别
-
花指令
- CTF逆向-[MRCTF2020]VirtualTree-恒成立的jz花指令去除及smc变换原执行流程在二叉树上的应用,通过逆向思维编写脚本以解决
-
流程混淆的扁平化处理
-
[CTF逆向-RoarCTF2019]polyre-WP_控制流扁平化去混淆idcpy去指令
-
CTF逆向-[SUCTF2019]hardcpp-使用优化过的deflat.py处理混淆的控制流并将cpp的lambda解析得到实际处理逻辑
-
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)