171201 逆向-JarvisOJ(软件密码破解-2)

本文详细解析了JarvisOJ-Re-软件密码破解挑战题的解决过程,包括使用IDA反编译、调试技巧及如何利用进程间通信机制破解程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1625-5 王子昂 总结《2017年12月1日》 【连续第427天总结】
A. JarvisOJ-Re-软件密码破解-2
B.
这题挺有意思的,确实从JarvisOJ上学到了不少啊

运行发现是个CUI程序,随便输入会进入死循环

拖入IDA反编译,主函数结构很简单:
这里写图片描述

很简单的接收,于是跟入查看关键函数check:
这里写图片描述

进行了一大堆进程操作,总结下来就是将输入的内容作为参数重新开启了一个子进程,然后等待它返回

由于调试事件会被最上层的调试器拦截掉,所以父进程是不可能接收到事件的消息了……从这个角度上来看,动态调试就很困难了

于是重新开启一个进程,加入参数进行调试
发现它在main的时候有一个判断,当有参数的时候就跳到另一个流程了
单步跟发现在这里有一个INT3会断下来交给父进程
这里写图片描述
那么很明显,父进程的WriteProcess就是在这里起作用的

将父进程的v22-v25写入003E1145,注意小端序哦
这里写图片描述

跟下来可以发现它与“elcome to EEF test!”进行逐字符异或,然后再将结果全部+1
最后通过OutputDebugString将结果传回父进程

然后父进程通过ReadProcessMemory接收,与硬编码进行比较

算法还是比较简单的,这个传递消息机制很有意思

s = 0x2B5C5C25.to_bytes(4, "little") + 0x36195D2F.to_bytes(4, "little") + 0x7672642C.to_bytes(4, "little") + 0x524E6680.to_bytes(4, "little")
p = b"elcome to CFF test!"
for i in range(16):
    print(chr((s[i]-1)^p[i]), end='')

解出flag

C. 明日计划
JarvisOJ

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值