首页
社区
课程
招聘
[原创]2020西湖论剑预选赛flow wp
发表于: 2020-10-10 21:41 8434

[原创]2020西湖论剑预选赛flow wp

2020-10-10 21:41
8434

memcpy后栈溢出了,retn后跳到了0x401152

sigreturn是Linux信号处理后恢复上下文的系统调用,寄存器的信息都存在上,信号处理完成后sigreturn后恢复.

题目使用sigreturn来修改控制流

代码分布是一块一块的,trace instruction发现不同代码块sigreturn后的地址不一定相等

观察发现,我们可以将每一个代码块看作一个函数,代码块中没有栈操作,所以只需将syscall patch成retn即可.

新建了一个段,然后按照调用顺序写入

此时以及可以看伪代码了

简单分析得知是一个虚拟机

使用idapython脚本输出对应虚拟机操作

查看输出返现了tea的特征值

得知key是这四个,4个输入使用ECB分组模式进行加密的(tea每次加密两个).

在此之前还进行了rc4,直接提取出异或值即可

后来使用tea标准解密算法发现解不出,分析虚拟机指令才知道,这是简单魔改的tea

解密:

 
 
 
 
 
 
 
 
 
 
 
 
 
print("rax:0x%x rdx:0x%x rcx:0x%x rbx:0x%x"%(GetRegValue('rax'),GetRegValue('rdx'),GetRegValue('rcx'),GetRegValue('rbx')))
 
AddBpt(0x4015F1)
AddBpt(0x401594)
AddBpt(0x401535)
AddBpt(0x401477)
AddBpt(0x4014D6)
AddBpt(0x4013FA)
AddBpt(0x40145E)
AddBpt(0x4012EA)
while True:
 
    RunTo(0x40115E)
    GetDebuggerEvent(WFNE_SUSP, -1)
 
    tmp=GetRegValue('rip')
    arg1=GetRegValue('rax')
    arg2=GetRegValue('rdx')
    arg3=GetRegValue('rcx')
    arg4=GetRegValue('rbx')
 
    if tmp==0x4015F1:
        if arg4!=0:
            print 'arg2[%d] = arg2[%d]'%(arg1,arg3),
        else:
            print 'arg2[%d] = 0x%x'%(arg1,arg3),
 
    elif tmp==0x401594:
        if arg4!=0:
            print 'arg3 = arg2[%d]'%arg3
            print 'arg2[%d] = arg2[%d] + arg3'%(arg1,arg1),
        else:
            print 'arg2[%d] = arg2[%d] + %d'%(arg1,arg1,arg3),
 
    elif tmp==0x401535:
        if arg4!=0:
            print 'arg2[%d] = arg2[%d] >> arg2[%d]'%(arg1,arg1,arg3),
        else:
            print 'arg2[%d] = arg2[%d] >> 0x%x'%(arg1,arg1,arg3),
 
    elif tmp==0x401477:
        if arg4!=0:
            print 'arg2[%d] = arg2[%d] ^ arg2[%d]'%(arg1,arg3,arg1),
        else:
            print 'arg2[%d] = arg2[%d] ^ 0x%x'%(arg1,arg1,arg3),
 
    elif tmp==0x4014D6:
        if arg4!=0:
            print 'arg2[%d] = arg2[%d] << arg2[%d]'%(arg1,arg1,arg3),
        else:
            print 'arg2[%d] = arg2[%d] << 0x%x'%(arg1,arg1,arg3),
 
    elif tmp==0x4013FA:
        if arg4!=0:
            print 'dword_40C0C0 = arg2[%d] != arg2[%d]'%(arg1,arg3),
        else:
            print 'dword_40C0C0 = arg2[%d] != 0x%x'%(arg1,arg3),
 
    elif tmp==0x40145E:
 
        print 'if dword_40C0C0 == 0  :  retn \nelse  mov     rsp, rax',
 
 
    print "rip = %x  rax = 0x%x  rdx = 0x%x  rcx = 0x%x  rbx = 0x%x"%(GetRegValue('rip'),GetRegValue('rax'),GetRegValue('rdx'),GetRegValue('rcx'),GetRegValue('rbx'))
print("rax:0x%x rdx:0x%x rcx:0x%x rbx:0x%x"%(GetRegValue('rax'),GetRegValue('rdx'),GetRegValue('rcx'),GetRegValue('rbx')))
 
AddBpt(0x4015F1)
AddBpt(0x401594)
AddBpt(0x401535)
AddBpt(0x401477)
AddBpt(0x4014D6)
AddBpt(0x4013FA)
AddBpt(0x40145E)
AddBpt(0x4012EA)
while True:
 
    RunTo(0x40115E)
    GetDebuggerEvent(WFNE_SUSP, -1)
 
    tmp=GetRegValue('rip')
    arg1=GetRegValue('rax')
    arg2=GetRegValue('rdx')
    arg3=GetRegValue('rcx')

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 1
支持
分享
打赏 + 5.00雪花
打赏次数 1 雪花 + 5.00
 
赞赏  小朋友呢   +5.00 2020/11/15 感谢分享~
最新回复 (5)
雪    币: 5496
活跃值: (2346)
能力值: ( LV7,RANK:108 )
在线值:
发帖
回帖
粉丝
2
mark
2020-11-15 11:22
0
雪    币: 19
活跃值: (272)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
感谢师傅分享,我自己调试后有几个疑惑
1. xxx=[0x60,0xcf,0xb4,0xe7,0x52,0x33,0x98,0xe6,0xc0,0xb5,0x1d,0x8,0x8a,0xe2,0x5e,0x86] 这个是内置的key吗,如果是是怎么找到的呢

2. 师傅是怎么根据汇编指令判断魔改XXTEA的地方的



2020-11-15 12:19
0
雪    币: 233
活跃值: (2971)
能力值: ( LV3,RANK:38 )
在线值:
发帖
回帖
粉丝
4


xxx=[0x60,0xcf,0xb4,0xe7,0x52,0x33,0x98,0xe6,0xc0,0xb5,0x1d,0x8,0x8a,0xe2,0x5e,0x86] 

是从rc4加密算法的异或点提取的数据



分析虚拟机指令

通过常数0x9e3779b9得知是tea系列算法,根据sum+=delta的位置确定是tea算法

一开始以为是标准tea算法,结果发现解密出的结果不对,根据虚拟机指令写出代码后对比才知道是修改过的

2020-11-15 17:20
0
雪    币: 19
活跃值: (272)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
125e591 xxx=[0x60,0xcf,0xb4,0xe7,0x52,0x33,0x98,0xe6,0xc0,0xb5,0x1d,0x8,0x8a,0xe2,0x5e,0x86]&nbsp;是从rc4加 ...
Nice师傅,疑惑已经解决,再次感谢师傅分享的idapython脚本,用这个方法分析其它程序也很有帮助
2020-11-15 21:54
0
雪    币: 44
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
冒昧问一下,这些题目在哪下载呀
2021-1-27 21:48
0
游客
登录 | 注册 方可回帖
返回
//