buuctf刷题记录21 [网鼎杯 2020 青龙组]jocker

今天挑战一下,结果最后还是看了别人的wp才写出来的

无壳,ida查看发现不能f5,原因堆栈不平衡

buuctf刷题记录21 [网鼎杯 2020 青龙组]jocker_第1张图片

进行栈指针修改

buuctf刷题记录21 [网鼎杯 2020 青龙组]jocker_第2张图片

buuctf刷题记录21 [网鼎杯 2020 青龙组]jocker_第3张图片

修改出错的地方的栈指针偏移,快捷键alt+k,值改为0

buuctf刷题记录21 [网鼎杯 2020 青龙组]jocker_第4张图片

buuctf刷题记录21 [网鼎杯 2020 青龙组]jocker_第5张图片

buuctf刷题记录21 [网鼎杯 2020 青龙组]jocker_第6张图片

然后就能f5了,

buuctf刷题记录21 [网鼎杯 2020 青龙组]jocker_第7张图片

逻辑也不难,首先输入长度是24位,然后有三个关键函数 wrong(),omg(),encrypt()

先看wrong和omg,wrong函数,对输入的前24个进行加密

buuctf刷题记录21 [网鼎杯 2020 青龙组]jocker_第8张图片

omg函数比较wrong加密结果和unk_4030C0地址的值是否相同

buuctf刷题记录21 [网鼎杯 2020 青龙组]jocker_第9张图片

把unk_4030C0地址的值考出来,写个脚本

s=[102, 107, 99, 100, 127, 97, 103, 100, 59, 86, 107, 97, 123, 38, 59, 80, 99, 95, 77, 90, 113, 12, 55, 102]
out=[]
for i in range(0,24):
    if i&1 :
        s[i]+=i
        out.append(s[i])
    else:
        s[i]^=i
        out.append(s[i])
for i in out:
    print(chr(i),end='')

得到 flag{fak3_alw35_sp_me!!},但这是个假的flag,头疼

继续看第三函数:encrypt,由于这里encrpty的参数是v5,与之前的两个函数无关,所以这里的v5就是最初输入

但是这里encrpy不能反编译,直接点进这个函数也是一堆乱码:

buuctf刷题记录21 [网鼎杯 2020 青龙组]jocker_第10张图片

buuctf刷题记录21 [网鼎杯 2020 青龙组]jocker_第11张图片

buuctf刷题记录21 [网鼎杯 2020 青龙组]jocker_第12张图片

好办,直接上od,在这个函数调用前的位置0x401833 下断点,然后执行到这:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OSASTWkj-1596278228427)(D:\markdown\文件\图片\7.14.11.png)]

f7步入,可以看到函数已经解密了

buuctf刷题记录21 [网鼎杯 2020 青龙组]jocker_第13张图片

啊然后olldump直接脱壳,保存到新的exe

buuctf刷题记录21 [网鼎杯 2020 青龙组]jocker_第14张图片

然后ida打开新的,找到这个函数

buuctf刷题记录21 [网鼎杯 2020 青龙组]jocker_第15张图片

逻辑是,对输入的内容和hahahaha_do_you_find_me?这个字符串进行异或,然后和一个全局变量进行比较,注意只异或了19个字节,然后写出脚本还原一下

ans=[]
v2=[14, 13, 9, 6, 19, 5, 88, 86, 62, 6, 12, 60, 31, 87, 20, 107, 87, 89, 13]
str1='hahahaha_do_you_find_me?'
for i in range(0,19):
    ans.append(ord(str1[i])^v2[i])
for i in ans:
    print(chr(i),end='')

得到:flag{d07abccf8a410c

但是还差几位,继续看(由于是脱壳后的新程序,所以里的函数名有些不同)

buuctf刷题记录21 [网鼎杯 2020 青龙组]jocker_第16张图片

最后有个函数,点进去

buuctf刷题记录21 [网鼎杯 2020 青龙组]jocker_第17张图片

后面的判断就是无厘头,每次都是随机的,感觉这个函数有问题

但是flag的最后一位是“}”,这是固定的

盲猜v7应该是与某个数异或得到“}”

58 ^ ‘}’=71

2v3-v6应该逐位这个数异或,所以得到了后面几位:b37a}

完整拼接后得到flag{d07abccf8a410cb37a}

什么脑洞啊这是!

你可能感兴趣的:(ctf,逆向)