serial150-wp

0x00

​ exeinfope看无壳且为64位,用ida看发现不能正常反编译成代码,仔细看标红的地方一开始是错误,反编译将花指令0xe8 nop掉之后,还有很多自循环,还有很多db占位的,全都nop掉。

image-20221114201807277

​ 最后得到:

image-20221114213335546

​ 太费劲了,我觉得最好是用idapython脚本写,但是我不知道咋写,只能手动nop了。

​ 写脚本:

1
2
3
ss = [69, 90, 57, 100, 109, 113, 52, 99, 56, 103, 57, 71, 55, 98, 65, 86]
for s in ss:
print(chr(s), end = "")

得到flag为EZ9dmq4c8g9G7bAV

0x01

​ 见师傅https://blog.csdn.net/xiao__1bai/article/details/120197579

​ 里面用的脚本去花指令,详细看看。

0x02

​ 其余的师傅用的动调,不多说了,感觉这道题其实考的是用脚本去掉花指令。

​ 主要的冗余有:0xe8花指令,一些循环垃圾代码,一些db垃圾代码。

​ 最后的idapython脚本:(重点

1
2
3
4
5
6
7
8
from idc_bc695 import * #不加的话patchbytes报错
addr=0x40099c #main函数开始
for i in range(0x400cac-0x40099c):
if Dword(addr+i)==0x05ebb866: #0x05ebb866是垃圾代码中mov ax, 5EBh的机器指令
if Dword(addr+i+4)==0xfa74c031: #xor eax, eax机器指令是0xfa74c031
for a in range(9): #后面还有个e8
PatchByte(addr+i+a,0x90) #将addr+i+a位置改为0x90
print('Done')

知识点1:汇编

1
2
3
4
5
jz XXX // 跳转条件为ZF=1
cmp target, src // 见下图
CLI // 禁止中断发生
STI // 允许中断发生。这两个指令只能在内核模式下执行,不可以在用户模式下执行;而且在内核模式下执行时,应该尽可能快的恢复中断,因为CLI会禁用硬件中断,若长时间禁止中断会影响其他动作的执行(如移动鼠标等等),系统就会变得不稳定。在标志寄存器中中断标志清零的情况下,可以以“int ××”的形式调用软中断。
DB // 作为汇编语言中的伪操作命令,它用来定义操作数占用的字节数。

image-20221114202828615

知识点2:short 与 near ptr。

  1. jmp short 标号(转到标号处执行命令)
    这种格式的jmp指令实现的是上述的段内短转移,修改范围为-128~127

  2. jmp near ptr 标号(转到标号处执行命令)
    这种格式的jmp指令实现的是上述的段内近转移,在跳转范围大于-128~127时使用jmp short会编译失败。

知识点3:nop (No Operation) 指令作用。

  1. 通过 nop 指令的填充(nop指令长度从一个字节到九个字节,用于对齐),使指令对齐,从而减少取指令时的内存访问次数。一般用来内存地址偶数对齐,比如有一条指令占 3 字节,这时使用 nop 指令(原来几字节,nop后就几字节),CPU 就可以从第四个字节处读取指令。

  2. 清除由上一个算术逻辑指令设置的 flag 位。

    1. 破解:对于原程序中验证部分使用 nop 来填充,使验证失效。

留言

2022-11-14

© 2024 wd-z711

⬆︎TOP