首页
论坛
课程
招聘
[原创]看雪.TSRC 2017CTF秋季赛第二题WP
2017-10-27 13:30 1136

[原创]看雪.TSRC 2017CTF秋季赛第二题WP

2017-10-27 13:30
1136

看雪.TSRC 2017CTF秋季赛第二题WP

入坑

IDA一加载就看到main函数了,流程也很简单,先是打印信息,再要求输入key,后面有两个检验函数,都通过则打印成功信息。
检验算法整理如下,v0v1分别为输入的第一、第二个双字。:

5 * (v1 - v0) + v1 == 0x8F503A42 
13 * (v1 - v0) + v0 == 0xEF503A42
17 * (v1 - v0) + v1 == 0xF3A94883 
7 * (v1 - v0) + v0 == 0x33A94883

这也太简单了,可能有问题。先不管,直接z3求解,秒出无解结果。
后来仔细看了下前后两对式子后面的常数,在字母数字组合中基本是无解的,更不用说同时满足两组。

溢出尝试

在输入函数里,并未对输入长度作限制,可导致栈溢出。

.text:00401050 sub_401050      proc near 
.text:00401050
.text:00401050 var_C           = dword ptr -0Ch  
.text:00401050   
.text:00401050                 sub     esp, 0Ch
.text:00401053                 push    offset aCodedByFpc_ ; " Coded by Fpc.\n\n"
.text:00401058                 call    print_413D42
.text:0040105D                 add     esp, 4
.text:00401060                 push    offset aPleaseInputYou ; " Please input your code: "
.text:00401065                 call    print_413D42
.text:0040106A                 add     esp, 4
.text:0040106D                 lea     eax, [esp+0Ch+var_C]
.text:00401071                 push    eax
.text:00401072                 push    offset aS       ; "%s"
.text:00401077                 call    _scanf
.text:0040107C                 lea     eax, [esp+14h+var_C]
.text:00401080                 add     esp, 14h
.text:00401083                 retn

输入与返回地址之间偏移0x0c字节。key输入12字节后就会覆盖返回地址。询问了组织方,输入不能有不可见或其它特殊字符,而且由于输入格式是%s,所以输入字符会附加一个字节的\x00,所以不能直接返回到正确的消息打印流程。
又尝试搜索代码区,希望能找到可以利用的gadget,结果是让人失望的。

顺藤摸瓜

现在情况是明显的流程是错误的,题目可能又对出现多解的ROP作了防范。那程序本身肯定有一处是正确流程的开始,而且其地址的低三字节应该都是数字或字母(因为地址0x0040xxxx没有符合条件的,所以返回地址的低三字节全要改写,高字节原是\x00,覆写为附加的\x00,保持不变)。

 

此时,要简单分析下代码区的函数分布。sub_4010e0sub_413d42之间,有大段的00填充及非正常代码。

.text:0040112A sub_4010E0      endp
.text:0040112A
.text:0040112A ; ---------------------------------------------------------------------------
.text:0040112B                 db 5 dup(90h)
.text:00401130                 dd 4800h dup(0)
.text:00413130                 db 0C3h ; 
.text:00413131 ; ---------------------------------------------------------------------------
.text:00413131                 add     esp, 0FFFFFFF0h
.text:00413134                 jo      short loc_413160
.text:00413136                 jno     short loc_413158

sub_4010e0函数到40112A结束。后面是5个90及0x4800个00填充。接一个'C3 ret',后面一条指令实际上就是sub esp,10,再后面两条条件跳转jo jno这是花指令常用的方式了,静态向后看了看,非常大片的花指令,每过一段跳转之后会接一条正常的指令,能看出在取输入。果断停止静态分析。看了下分析过的花指令,感觉ida不太好去除。

 

直接上OD,输入9876543210ab11A,在00413131下断,单步跟踪,跳转直接略过(关键的比较跳转除外),很快就能把关键算法的指令弄出来。

sub esp,10
xor eax,eax
mov dword_41B034, eax
pop eax
mov ecx,eax
pop eax
mov ebx,eax
pop eax
mov edx,eax

;校验1
mov eax,ecx
sub eax,ebx
shl eax,2
add eax,ecx
add eax,edx
sub eax, 0EAF917E2

;校验2
add eax,ecx
sub eax,ebx
mov ebx,eax
shl eax,1
add eax,ebx
add eax,ecx
mov ecx, eax
add eax,edx
sub eax,0xE8F508C8

;校验3
mov eax,ecx
sub eax,edx
sub  eax, C0A3C68

整理成公式就是:

4*(v0-v1)+v0+v2 == 0xEAF917E2
3*(v0-v1)+v0+v2 == 0xE8F508C8
3*(v0-v1)+v0-v2 == 0xC0A3C68

同样z3求解(后来发现直接计算器就能算出来,2333),代码如下:

# -*- coding:utf-8 -*-
#Anthor: poyoten @ Chamd5

from z3 import *

def codesovle():
    print '[*]Computing key...' 
    v0 = BitVec('v0',32)
    v1 = BitVec('v1',32)
    v2 = BitVec('v2',32)    

    s = Solver()    

    s.add( 4*(v0-v1)+v0+v2 == 0xEAF917E2,ULE(v0,0x7f000000),ULE(v1,0x7f000000),ULE(v2,0x7f000000))
    s.add( 3*(v0-v1)+v0+v2 == 0xE8F508C8,UGE(v0,0x20000000),UGE(v0,0x20000000),UGE(v0,0x20000000))
    s.add( 3*(v0-v1)+v0-v2 == 0xC0A3C68)
    if s.check() == sat:

        a = s.model()
        c = hex(a[v0].as_long()).replace('0x','').replace('L','').rjust(8,'0').decode('hex')[::-1]      
        c += hex(a[v1].as_long()).replace('0x','').replace('L','').rjust(8,'0').decode('hex')[::-1]
        c += hex(a[v2].as_long()).replace('0x','').replace('L','').rjust(8,'0').decode('hex')[::-1]     

        print '[*]key compute result:'
        print c
        return
    print '[*]No result,end.'   

if __name__ == '__main__':
    codesovle()

出我结果是Just0for0fun,加上覆写返回地址的输入,最终key为Just0for0fun11A


[培训]12月3日2020京麒网络安全大会《物联网安全攻防实战》训练营,正在火热报名中!地点:北京 · 新云南皇冠假日酒店

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回