serial-150

Posted by Humb1e on 2023-05-25
Estimated Reading Time 2 Minutes
Words 579 In Total
Viewed Times

serial-150

一题经典的花指令题,但是与之前遇到简单的仅仅插入0xE8影响ida分析的指令不同

这里的花指令拥有更长的字节数,重复多次出现,并且和正常的call等指令混在一起

这时候手动修就会很麻烦,需要一个自动patch花指令的脚本

题目:SUCTF-serial-150

一用ida打开就发现一片飘红,并且有大量字节未被ida反汇编

image-20230525211256926

这里非常明显的有call了一个不存在的地址

于是我的第一反应就是直接nop掉0xE8

但是发现有一堆类似的跳转,并且全都patch完之后ida还是无法反汇编

其实仔细看这个花指令就会发现,他并不是单纯的加入0xE8影响反汇编那么简单

他用xor eax,eax和jz short near ptr addr实现了一个永真跳转(并且这里的mov ax,5EBh不觉得很怪吗?)

image-20230525212141223

并且能够看到在一堆花指令中有对真实存在地址的call的,所以对于0xE8的改变更需要考虑

image-20230525212307439

再往后看就比较明显了,花指令其实就是

1
2
3
4
mov ax,5EBh
xor eax,eax
jz short near ptr [addr+x]
0xE8

所以可以写出对应的idapython脚本来自动nop

1
2
3
4
5
6
7
import idc
addr=0x40099c
for i in range(0x400cac-0x40099c):
if idc.get_wide_dword(addr+i)==0x05ebb866: //注意大端序和小端序的区别,这里从左往右对应ida视图里从下往上
if idc.get_wide_dword(addr+i+4)==0xfa74c031:
for a in range(9): //注意判断了8个但是Nop了9个,别忘了nop 0xe8
patch_byte(addr+i+a,0x90)

然后就能反编译了(×F5了

image-20230525212755637

好了,和void爷交流了之后揭秘一下上面讲的

mov ax,5EBh的疑点

首先mov ax寄存器这种操作我好像从来没见过,甚至不太知道ax寄存器是什么(AX 寄存器可以分为两个独立的 8 位的 AH 和 AL,那么就是寄存器的低16位咯

再者,如果不makecode前面的mov ax指令,即把后面的5EBh当作指令而不是当作数据处理

就会发现,其实这就是一个跳转指令(EB 05)

image-20230525213720650

所以这个花指令还是可以看出来的

flag就是main里面的判断,可以说非常的easy

EZ9dmq4c8g9G7bAV


如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !