码迷,mamicode.com
首页 > 其他好文 > 详细

【强网杯2018】逆向hide

时间:2018-04-07 01:13:03      阅读:876      评论:0      收藏:0      [点我收藏+]

标签:修改   tde   class   rev   rip   order   XA   from   而且   

这是事后才做出来的,网上没有找到现成的writeup,所以在这里记录一下

 

UPX加壳,而且linux下upx -d无法解,也无法gdb/ida attach

技术分享图片

技术分享图片

因为是64位,所以没有pushad,只能挨个函数进入,退出,看看程序是否恢复。

当运行到一0x400dd0,发现此时已经可以看见字符串了

技术分享图片

技术分享图片

用dumphex的脚本来dump出内存,见hide_dump

static main(void)

{

auto fp, begin, end, dexbyte;

fp = fopen("C:\\dump.dex", "wb");

begin = 0x400000;

end = 0xADC000;

for ( dexbyte = begin; dexbyte < end; dexbyte ++ )

fputc(Byte(dexbyte), fp);

}

此时dump出的内容已经有程序运行的字符串了,通过字符串反查,这里

0x400890才是真正的启动地址

技术分享图片

以后运行程序,在ida里面输入一下内容,即可直接运行到0x4009ef

from idaapi import *

from idc import *

run_to(0x4009ef)

技术分享图片

qwb{this_is_wrong_flag}

check到一个假flag,如果此时绕过ptrace且用ctrl+d作为结束,可以输出right。

但是输入到正常程序是报wrong的,说明还有地方反调试以及修改了逻辑

根据ptrace.h,ptrace这里是PTRACE_TRACEME,自我调试

技术分享图片

突然发现“Enter the flag:”字符串有2处引用

技术分享图片

技术分享图片

在4C8EA0也有类似的输出,怀疑正式运行时是这里。恢复函数失败,只能动态调试

技术分享图片

上面这里判断是不是qwb{}格式,构造payload

技术分享图片

然后调用3次以下2个函数,输入内容为qwb{0123456789abcdef}中间部分的0123456789abcdef

sub_4C8CC0(__int64 a1)

技术分享图片

技术分享图片

技术分享图片

这部分算法恢复见test2.py中的loop_j

技术分享图片

sub_4C8E50——按位异或

技术分享图片

目标:rdi(qwb{}中间内容经过上面的多次变换后) == rsi(如下),

技术分享图片

经过test2.py的逆向,得到一个有意义的输入串f1Nd_TH3HldeC0dE

技术分享图片

所以认为flag是qwb{f1Nd_TH3HldeC0dE}

实际运行,输入完qwb{f1Nd_TH3HldeC0dE}后,用ctrl+d可以看到成功(回车不行,因为用sys_read会连回车也认为是字符?)

技术分享图片

但是实际为何会运行到hide脚本,就没有分析了,因为ptrace自己后发生什么事情,很难搞。

以下是通过IDA运行并跳过反调试的脚本

from idaapi import *

from idc import *

run_to(0x4009ef)

GetDebuggerEvent(WFNE_SUSP, -1)

SetRegValue(0x4C8EA0,"RIP")

GetDebuggerEvent(WFNE_SUSP, -1)

run_to(0x4C8EB3)

GetDebuggerEvent(WFNE_SUSP, -1)

SetRegValue(0,"RAX")

run_to(0x4C8CC0)

脚本含义

技术分享图片

【强网杯2018】逆向hide

标签:修改   tde   class   rev   rip   order   XA   from   而且   

原文地址:https://www.cnblogs.com/anic/p/8729329.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!