主函数中接收输入后,调用sub_401000后进行判断,即sub_401000执行了关键逻辑,根据用户输入生成待判断的字符串。调用时分别使用堆栈和寄存器传入了两个main函数堆栈的地址,分别是输入字符串地址(堆栈)和执行sub_401000后生成的字符串的保存地址(寄存器ecx)。
生成的字符串来自template_string,并以某种方式按照用户输入进行索引生成,其中template_string如下
生成字符串的索引为
template_string[ptr_output[v4]]
v4=raw_input-ptr_output
等价于
template_string[ptr_output+v4]
template_string[ptr_output+raw_input-ptr_output]
template_string[raw_input]
即以用户输入的字符的ASCII码为索引在template_string中索引生成了字符串,并在主函数中与字符串DDCTF{reverseMe}对比。由于ASCII码中可打印字符在32之后,实际参与字符串生成的模板字符串指针和template_string指针的偏移恰为32。
脚本如下
target_string = 'DDCTF{reverseME}'
template = [0x7E, 0x7D,