初音ミクの消失

ShinyShot!

字数统计: 519阅读时长: 2 min
2019/03/22 Share

utf-8’ ‘ShinyShot!

这个程序主要是利用了smc(动态代码修改技术)

首先我们向程序里面输入一个数,然后这个程序利用这个数去修改了一些程序的代码

然后输入一个字符串,将字符串base64加密后得到的密文与程序尾所保存的字符串进行比较,如果相同,则flag正确

程序在我们输入了一个数字之后

执行了

*((_BYTE *)TopLevelExceptionFilter + (cout >> 3)) ^= 1 << (cout & 7);

这个指令,TopLevelExceptionFilter的意义暂时不明白,大概就是一个指向某个内存的指针,简记为T, 值为0x401000

程序把*(p + (cout >> 3)) 处的数据异或了一个1 << (cout & 7)

其实1 << (cout & 7)就是将1左移了几位

我们看到后面的

.text:004018DE EB 15             jmp     short loc_4018F5
.text:004018E0                  ; ---------------------------------------------------------------------------
.text:004018E0
.text:004018E0                   loc_4018E0:                  ; CODE XREF: sub_4017AA+126↑j
.text:004018E0 E8 A7 FE FF FF    call    sub_40178C
.text:004018E5                  ; ---------------------------------------------------------------------------
.text:004018E5
.text:004018E5                   loc_4018E5:
.text:004018E5 8D 85 40 FF FF FF lea     eax, [ebp-0C0h]
.text:004018EB 89 44 24 04       mov     [esp+414h+var_410], eax ; char *
.text:004018EF 8D 45 A4          lea     eax, [ebp+Buf]
.text:004018F2 89 04 24          mov     [esp+414h+var_414], eax ; char *
.text:004018F5
.text:004018F5                   loc_4018F5:                  ; CODE XREF: sub_4017AA+134↑j
.text:004018F5 E8 00 FC FF FF    call    sub_4014FA

0x 004018DE jmp 15 的意义是,除开jmp 15,往后数0x15个字节,将程序运行指针设置到此处。

而sub_4014FA是一个需要两个参数的函数,没有参数的传入,函数一定不会有正确答案。

所以我们应当将 jmp 15改为jmp到传入参数的位置

经过计算jmp 5 即可,现在我们的工作是要把0x004018DF处的15修改为5

0x15 = ‭00010101‬

0x5 = 00000101

也就是把第五位的1抹掉就行了,之前那个不明意义的内存修改就是这个用处了。

num = (0x8df<<3) + 0x4 = 18172

后面是一个base64加密,但闲鱼本人并不是密码学选手,太菜了,所以暂时跳过。。

最后将改版的base64加密后的字符串与程序内的进行比较,得到flag

原文作者:mrh929

原文链接:https://mrh1s.top/posts/ab82ece6/

发表日期:March 22nd 2019, 11:00:30 am

更新日期:May 8th 2019, 12:55:52 pm

版权声明:本文采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可

CATALOG