171227 逆向-JarvisOJ(Shell)

本文详细记录了一次逆向分析64位UPX壳保护的Golang程序过程,涉及ida、调试器的使用。在分析过程中,发现了程序对输入的长度校验、异或变换以及自校验机制。通过动态调试找出关键函数,成功解密得到了password。还探讨了Golang程序的特性,如函数间的0xCC填充导致IDA识别困难,并给出了如何帮助IDA识别函数的方法。
摘要由CSDN通过智能技术生成

1625-5 王子昂 总结《2017年12月27日》 【连续第453天总结】
A. JarvisOJ-Shell
B.
这个64位的upx+golang真是够折腾人的..

首先查壳,发现PEiD直接罢工了,我还纳闷儿,明明都能运行了咋还不是有效的PE文件捏
然后ExeInfoPE才告诉我这货是64位文件

拖入IDA发现什么都没识别出来
但是通过区段名能看出来是UPX壳

然而掏UPX程序出来却报checksum error
还好UPX手脱难度不大

按照ESP定律轻松找到OEP
接下来就只能一个函数一个函数日了
找到输入函数sub_4643F0,但是一次只能接受8个字符,好像还有一些缓冲区什么的
来回断点调试,发现封装函数sub_464D00,它出来以后内存中就有完整的输入字符串了
这里写图片描述

对首字符下内存断点,跑起来~

然后就结束了(:з」∠)

难道是之间听说过的Ring0级的内核调用API,所以Ring3的调试器断不到嘛?
不能这么轻易放弃,再思考一下

除了直接校验input内容以外,还有可能进行先行其他校验
比如首尾字符、哈希、长度校验等等

考虑到读取断点没有断到,猜测是长度校验
于是在函数外单步运行调试,观察寄存器中出现的跟测试字符串长度相等的值,注意它被保存到内存的哪里去了

反复改变长度调试以后,最终确定了这里
这里写图片描述
上面的CreateFileW、GetFileType和ReadFile有点让人在意呢~
WriteConsoleW很明显就是在向控制台输出内容的API了
所以说没事翻翻内存的上下文也挺有好处的233毕竟堆都在一起

言归正传,找到长度以后࿰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值