加载中…
个人资料
elecs
elecs
  • 博客等级:
  • 博客积分:0
  • 博客访问:53,406
  • 关注人气:1
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
正文 字体大小:

看雪2017秋季赛第2题ctf2017_Fpc解题过程

(2018-11-07 10:31:11)
标签:

溢出

分类: 信息安全

首先运行

看雪2017秋季赛第2题ctf2017_Fpc解题过程

通过查找字符串,很快找到核心算法部分。

看雪2017秋季赛第2题ctf2017_Fpc解题过程

sub_401050:获取输入SN。 

如果SN长度超过8个,字符会被替换。如果输入比较长且带有字母会出错,此时应该想到溢出,但我都给忽略了。

竟然以为SN长度为8。

假设SN=12345678, 则v1=5678,v0=1234

sub_401090, sub_4010E0分别对输入进行校验,要求v1和v0满足4个条件。如果都满足,则最终[41B034]=0。可以返回正确结果。

看雪2017秋季赛第2题ctf2017_Fpc解题过程

看雪2017秋季赛第2题ctf2017_Fpc解题过程

相当于拿到二元一次方程,用sympy库求解,发现无解 

>>> from sympy import *

>>> x=Symbol('x')

>>> y=Symbol('y')

>>> print (solve([17*(y-x)+y-0xF3A94883,7*(y-x)+x-0x33A94883,5*(y-x)+y-0x8F503A42,13*(y-x)+x-0xEF503A42],[x,y]))

[] 

思考方向不对,只得另想办法。此时,我们分析下sub_401050获取输入时发生的堆栈溢出情况。输入SN存放在12FF74,12FF80存放返回地址。因此,只要输入超过12字节,就能改变返回地址。假设SN=123456789067aaaa,返回地址由40101C改成61616161,详情见下面几个图。

看雪2017秋季赛第2题ctf2017_Fpc解题过程

看雪2017秋季赛第2题ctf2017_Fpc解题过程

看雪2017秋季赛第2题ctf2017_Fpc解题过程

要获得正确输入有2个方法:

(1)通过改变返回地址,让EIP直接执行到输出“You get it!”。

(2)通过改变返回地址,跳到另一个校验程序处,对输入内容进行校验。

综合分析,(2)种方法比较靠谱。 

用IDA仔细翻阅代码,发现如下一段未被分析,很可能加密或加壳了

看雪2017秋季赛第2题ctf2017_Fpc解题过程

而地址413131刚好都能表示为可输入字符,即为’A11’ 

任意输入12个字符+’11A’ Little-Endian),即可进入413131处的验证程序。 

跟踪进去发现绕来绕去,加了若干花指令,下面为整理出来的验证代码

 

00413131    83C4 F0         add     esp, -0x10

00413150    33C0            xor     eax, eax

00413184    A3 34B04100     mov     dword ptr [0x41B034], eax

004131BA    58              pop     eax

004131EB    8BC8            mov     ecx, eax

0041321F    58              pop     eax

00413254    8BD8            mov     ebx, eax

00413289    58              pop     eax

004132B5    8BD0            mov     edx, eax

004132AD    8BD0            mov     edx, eax

004132E2    8BC1            mov     eax, ecx

00413316    2BC3            sub     eax, ebx

00413349    C1E0 02         shl     eax, 0x2

00413380    03C1            add     eax, ecx

004133B5    03C2            add     eax, edx

004133E9    2D E217F9EA     sub     eax, 0xEAF917E2

 

je:

00413455    03C1            add     eax, ecx

004134F3    D1E0            shl     eax, 1

00413525    03C3            add     eax, ebx

00413559    03C1            add     eax, ecx

0041358F    8BC8            mov     ecx, eax

004135C3    03C2            add     eax, edx

004135F7    2D C808F5E8     sub     eax, 0xE8F508C8

 

00413665    8BC1            mov     eax, ecx

0041365D    8BC1            mov     eax, ecx

004136A7    2BC2            sub     eax, edx

004136D8    2D 683C0A0C     sub     eax, 0xC0A3C68

 

00413747    58              pop     eax             ; ctf2017_.00413131

00413777    35 01810000     xor     eax, 0x8101    //eax=410b030

004137A9    8BF8            mov     edi, eax        ; ctf2017_.0041B030

004137E2    33C0            xor     eax, eax        ; ctf2017_.0041B030

00413817    AB              stos    dword ptr es:[edi]     //[410b030]=0

00413830    E8 0C000000     call    00413841

{

0041385C    58              pop     eax    //eax=00413835

0041388E    50              push    eax

004138BA    8BF8            mov     edi, eax       ; ctf2017_.00413835

004138B2    8BF8            mov     edi, eax       ; ctf2017_.00413835

004138E6    68 6909004E     push    0x4E000969

0041391F    58              pop     eax              //eax=0x4E000969

00413950    33C2            xor     eax, edx      //edx=sn[9-12]  eax=0x4E000969

00413983    AB              stos    dword ptr es:[edi]   //[00413835]=0x4E000969 xor sn[9-12]

004139B5    35 3E0A0100     xor     eax, 0x10A3E

004139EB    AB              stos    dword ptr es:[edi]   //[00413839]=eax xor 10A3E

00413A1C    33C3            xor     eax, ebx    //ebx=sn[1-4]-sn[5-8]

00413A4D    35 141E5122     xor     eax, 0x22511E14

00413A82    AB              stos    dword ptr es:[edi]   //[0041383D]=eax

00413AB6    35 2D646100     xor     eax, 0x61642D

00413B83    3305 34B04100   xor     eax, dword ptr [0x41B034]   //[0041B034]=00000000

00413BBB  - FFE0            jmp     eax

}

 

校验逻辑整理出来为331次方程:

(x-y)<<2+x+z      =0xEAF917E2

(x-y)<<1+(x-y)+x+z=0xE8F508C8

(x-y)<<1+(x-y)+x-z=0xC0A3C68 

 

用z3计算

看雪2017秋季赛第2题ctf2017_Fpc解题过程

x1 = 1953723722.0000    7473754A

x2 = 1919903280.0000    726F6630

x3 = 1853187632.0000    6E756630

 

如果输入正确,00413BBB处的jmp eax将跳转到401044,输出栈顶所指的内容,此时栈顶所指为413835。[413835]、[413839]、[41383D]的数值依据sn[9-12]、sn[1-4]-sn[5-8]、0x4E00096910A3E、0x22511E14、0x61642D等常数异或计算而来。

 

下面为EAX的计算过程:

EAX= 6E756630 xor 0x4E000969=20756F59 = [413835]

20756F59 xor 10A3E = 20746567 = [413839]

20746567 xor (7473754A-726F6630) = 20746567 xor 2040F1A = 22706A7D

22706A7D xor 0x22511E14 = 217469 = [41383D]

217469 xor 0x61642D = 401044

看雪2017秋季赛第2题ctf2017_Fpc解题过程

 

根据

x1 = 1953723722.0000    7473754A  à tsuJ

x2 = 1919903280.0000    726F6630  à rof0

x3 = 1853187632.0000    6E756630  à nuf0

 

Just0for0fun

 

SN=Just0for0fun11A

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有