首页
社区
课程
招聘
[原创]看雪.京东 2018CTF 第四题 WP
发表于: 2018-6-24 09:10 5074

[原创]看雪.京东 2018CTF 第四题 WP

2018-6-24 09:10
5074

本题考点:代码层面是花指令和进程枚举反调试;算法层面是运用miracl大数库的RSA加密算法和AES加密算法。

这部分直接上代码看,静态分析。

startmain中间有个main的stub。

这本来应该是真正的main函数,但这却又是一个跳转,而且跳往的目标代码不正常,有花指令,应该是后来加上的。继续往下看。

里面有些花指令,手动调整了下,还并未作任何patch。
其实这里面的指令等价于:

再看这个跳转目标loc_403136:

这里是截取了一部分代码,这段代码除了有些花指令,反调试代码,其它都正常,加上后面代码的功能,猜测应该是真正的main函数部分代码。
再看,403136紧临403130,上面就说403130处的跳转不正常。事出反常必有妖。所以403130确实是main函数的入口,只不过被改了指令。先还原这部分指令,去年跳转。

403156处也有花指令,而且发现不止一处。模式为:

直接上脚本patch成nop

顺便把rdtsc的代码也patch掉。

main函数patch后的伪代码如下:

rdtsc反调试只有一处。patch花指令时同时处理了。
剩下的还有sub_40100A函数,这里能不能算是反调试,我说不清楚。我也没明白这里设置的作用。主要代码功能就是进程检查,如果父进程是explorer.exe,则创建新进程并结束当前进程。因为这里影响AES密钥。我的做法是不用管,事实上对OD没什么作用(其实是如果不patch则后面的调试不了,如果patch注意此对AES的密钥影响),也没有影响AES加密结果。如果直接patch掉,就会影响AES密钥。

main函数中的主要流程是:

check1算法用了miracl大数库。
基本过程是:

很明显这是一个RSA算法计算过程。正好n可以在factordb上直接查到。

现在还差前面的3字节数字了

这部分算法是AES(有改动)。输入数据的前三字节作为了key的前三字节(第3字节与反调试代码有关系)。
AES密钥再引入输入前是0001314000000000。用输入的前三字节替换密钥的相应位置,并将第三字节加上495728处的数值(在sub_40100A`函数中设置),其实就是1。

所以密钥也不用枚举了,大家应该都能猜出来5211314000000000,输入是前三字节520
AES加密:

明文pediy 后面补00
密钥 5211314000000000
加密结果:912CA2036A9A0656D17B6B552F157F8E (16进制)

所以最终flag为:520iamahandsomeguyhaha1

 
 
 
 
.text:0040126C _main           proc near               ; CODE XREF: start+E4↓p
.text:0040126C                 jmp     _main_0
.text:0040126C _main           endp

[注意]APP应用上架合规检测服务,协助应用顺利上架!

收藏
免费 1
支持
分享
最新回复 (12)
雪    币: 16532
活跃值: (6589)
能力值: ( LV13,RANK:923 )
在线值:
发帖
回帖
粉丝
2
2018-6-24 13:57
0
雪    币: 2
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
为什么我的ida没有text:0045C11F这一行,是因为没装什么插件吗
2018-6-25 00:49
0
雪    币: 13713
活跃值: (2851)
能力值: ( LV15,RANK:2663 )
在线值:
发帖
回帖
粉丝
4
leaffish 为什么我的ida没有text:0045C11F这一行,是因为没装什么插件吗
这是手动调整了下。
2018-6-25 02:40
0
雪    币: 4836
活跃值: (61)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
5
请问能放一下,去花指令的脚本吗
2018-6-25 09:51
0
雪    币: 13713
活跃值: (2851)
能力值: ( LV15,RANK:2663 )
在线值:
发帖
回帖
粉丝
6
只是idc.FindBinary和PatchByte之类的简单组合,没有判断指令,只是字节数据搜索加修改。
2018-6-28 10:01
0
雪    币: 13713
活跃值: (2851)
能力值: ( LV15,RANK:2663 )
在线值:
发帖
回帖
粉丝
7
HeyLXF 请问能放一下,去花指令的脚本吗
只是idc.FindBinary和PatchByte之类的简单组合,没有判断指令,只是字节数据搜索加修改。
2018-6-28 10:02
0
雪    币: 4
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
请问楼主可以把去花指令的脚本发出来学习一下吗,因为刚入门,所以想有个脚本对照着学习更容易理解
2018-6-30 23:53
0
雪    币: 13713
活跃值: (2851)
能力值: ( LV15,RANK:2663 )
在线值:
发帖
回帖
粉丝
9
def scan(patt,start=0,end=0):
  pattern = patt
  if start:
        addr = start
  else:
        addr = MinEA()
  if end:
        addr1 = end
  else:
        addr1 = MaxEA()
  l = []
#    for i in range(addr,MaxEA()):
  for i in range(addr,addr1):
        addr = idc.FindBinary(addr, SEARCH_DOWN|SEARCH_NEXT, pattern)
        if addr != idc.BADADDR:
            l.append(addr)
  return l


def patch_nop(l,pos,count):    
    for addr in l:        
        for n in xrange(count/2):
            PatchWord(addr+pos+2*n,0x9090)
        if count/2:
            PatchByte(addr+pos+count-1,0x90)

def search_junk(s,pos,length,name,start=MinEA(),end=MaxEA()):
    l = scan(s)
    c = len(l)
#    length = len(s.replace(' ',''))/2
    while c:        
        patch_nop(l,pos,length)        
        print "[*]Find %s %d places,and patched."%(name,c)
        l = scan(s)
        c = len(l)

使用就是search_junk('0F 84 07 00 00 00 0F 85 01 00 00 00',0,13,'jzjnz')此类,并不针对此题。这个只能搜索固定的指令数据,patch成nop。其它需求可自行修改。

最后于 2018-7-1 00:13 被poyoten编辑 ,原因:
2018-7-1 00:12
0
雪    币: 1470
活跃值: (74)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
10
楼主师傅功力深厚,膜拜
2018-7-23 21:48
0
雪    币: 714
活跃值: (82)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
11
请教一下:如何手动patch,让IDA能F5我不太明白?(IDA玩的不是6)
是要把有花指令的地方都NOP掉,然后把有用的代码拼接到开头吗?为什么会一直弹出来这个?
另外是不是还要编辑_main_0函数的开头和结尾?而且我看到一篇writeup中.idb的_main_0函数还有很多变量是怎么来的?
上传的附件:
2018-7-30 18:09
0
雪    币: 13713
活跃值: (2851)
能力值: ( LV15,RANK:2663 )
在线值:
发帖
回帖
粉丝
12

如果f5出错,当然是哪有错改哪。放上idb文件。可以自行参照。

最后于 2018-8-5 18:49 被poyoten编辑 ,原因:
上传的附件:
2018-8-5 18:48
0
雪    币: 13713
活跃值: (2851)
能力值: ( LV15,RANK:2663 )
在线值:
发帖
回帖
粉丝
13
xyy吸氧羊 请教一下:如何手动patch,让IDA能F5我不太明白?(IDA玩的不是6)是要把有花指令的地方都NOP掉,然后把有用的代码拼接到开头吗?为什么会一直弹出来这个?另外是不是还要编辑_main_0函数的 ...

有些事情,自己花时间弄明白与别人直接告诉你答案的效果是完全不同的。

2018-8-5 18:53
0
游客
登录 | 注册 方可回帖
返回
//