XCTF-Windows_Reverse1

1、查壳

查出upx壳,老套路了,本想直接一波esp把壳子脱掉,结果出现内存访问失败的错误,呜呜,爬去upx -d

2、ida静态分析

在这里插入图片描述比较简洁,输入v6,调用函数sub_401000处理v6,最后判断v4的结果,芜湖,看似v4和v6毫无关系,其实细看调用401000函数前的汇编便能找到v4与v6间的联系
在这里插入图片描述
注意到初始时v4和v6在栈内的位置便可以知道,eax中存放的是v6,ecx中存放的是v4,借助寄存器来实现参数传递,ida就分析不出来v4和v6的联系了。
在这里插入图片描述进入401000函数,有些小细节 v4(临时变量),是地址v6和v4的差值 也就是400 ,分析可知:

v1[v4] == *(v1+v4) == *(ebp-804+400) == *(ebp-404)

出现了,也就是这也是在遍历v6数组,可知最后v1*即v4的值为一个字符串[v6的ascii码],所以只需拿到这个byte_402FF8字符串就ok了

3、提取索引字符串

1、提取的两种方式:一种在ida中巧妙分析
在这里插入图片描述
观察到改字符串从偏移量0x2FF80x3018到最后0,计算这两个地址的差值得到32,32我的天,一开是没想到,后来看师傅wp知道,前32的ASCII码对应的字符都是不可打印字符,而v6是我们的输入,所以根本不可能有前32位,而后面的字符串我们知道了,相当于字符串我们都知道了,写脚本就ok。

a='7E 7D 7C 7B 7A 79 78 77 76 75 74 73 72 71 70 6F 6E 6D 6C 6B 6A 69 68 67 66 65 64 63 62 61 60 5F 5E 5D 5C 5B 5A 59 58 57 56 55 54 53 52 51 50 4F 4E 4D 4C 4B 4A 49 48 47 46 45 44 43 42 41 40 3F 3E 3D 3C 3B 3A 39 38 37 36 35 34 33 32 31 30 2F 2E 2D 2C 2B 2A 29 28 27 26 25 24 23 22 21'
a=a.split(' ')
for i in range(len(a)):
    a[i]=int('0x'+a[i],16)
v4='DDCTF{reverseME}'
for i in v4:
    for j in range(len(a)):
        if a[j]==ord(i):
            print(chr(j+32),end='')#加32是因为前面32位虽然不可打印,但也在表中做下标
            break

2、OD动调找字符串,所有字符串都能提出来
虽然脱壳失败,但是我们用esp定律定位真正的程序还是挺简单的。

先单步,在esp数据窗口前四个字节下内存访问断点,之后运行,之后单步步入大跳,进入大跳内可以中文搜索引擎搜索一下,定位主要内容的位置。
在这里插入图片描述在这里插入图片描述通过第一张图的eax=0x31;dl串的地址为eax+0x122FF8,可知首地址为0x122FF8,而0x6D正好为第50个,即下标索引的49,其实eax为啥为0x31呢,因为在前面输入的时候输入123,而1的ASCII正好为49即0x31,这样也能看到是一个索引操作,索引后存到dl中之后dl赋值给ecx,即v4。我们已经知道最后变换过的v4了,而表也知道了,所以可以只需要逆向出v6就ok。

a='00 00 00 00 00 00 00 00 BC 7D 32 6D 43 82 CD 92 FF FF FF FF FF FF FF FF FE FF FF FF 01 00 00 00 7E 7D 7C 7B 7A 79 78 77 76 75 74 73 72 71 70 6F 6E 6D 6C 6B 6A 69 68 67 66 65 64 63 62 61 60 5F 5E 5D 5C 5B 5A 59 58 57 56 55 54 53 52 51 50 4F 4E 4D 4C 4B 4A 49 48 47 46 45 44 43 42 41 40 3F 3E 3D 3C 3B 3A 39 38 37 36 35 34 33 32 31 30 2F 2E 2D 2C 2B 2A 29 28 27 26 25 24 23 22 21 20 00 01 00 00 00 00 1B 08 01 60 26 08 01'
a=a.split(' ')
for i in range(len(a)):
    a[i]=int('0x'+a[i],16)
#print(a)
v4='DDCTF{reverseME}'
v=[]
for i in v4:
    for j in range(len(a)):
         if a[j]==ord(i) and j>32:
             print(chr(j),end='')  #这才是真正的flag

注意,如果是把所有表提出来,如过是在前32位内找到的不能要,因为v6是可打印的,必须ASCII码大于32!!!

对于脱壳后产生的问题,师傅们可以参考下这个师傅的链接:链接: 传送门


完结线:re弟弟的做题笔记,有时可能会带点稀奇古怪的思路,如有问题还望师傅们指正,专栏内容会随着比赛记录而不断更新哦。爬~

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值