PE32位程序,ida打开进行审计发现栈指针出现错误

显示栈指针发现在调用函数时栈指针出现错误

这是由于encrypt函数处于加密状态尚未解密,而ida静态分析进入encrypt函数处理其ret使得sp指针+4904,返回main函数后导致sp指针异常,下面的finally函数也是如此,我们调整sp指针,alt+k将其上下两sp指针的差值改为0恢复正常



f5分析源码

输入24位flag,将输入的flag复制给Destination后将flag进入wrong和omg函数,执行后发现是假的flag,继续往下,执行encrypt的smc在执行finally函数,手动smc
#include <idc.idc>
static xor_setp2(){
auto addr = 0x00401500;
auto i = 0;
for(i=0;addr+i<0x00401500+186;i++)
{
PatchByte(addr+i,Byte(addr+i)^0x41);
}
}
static main()
{
xor_setp2();
}
ida分析错误,将函数全部代码按u取消定义后对函数按p将作为函数得到正确代码

简单的异或操作,得出不完整的flag,进入finally函数
v5=[0x0E, 0x0D, 0x9, 0x6, 0x13, 0x5, 0x58, 0x56, 0x3E, 0x6, 0x0C, 0x3C, 0xF, 0x57, 0x14, 0x6B, 0x57, 0x59, 0x0D]
key="hahahaha_do_you_find_me?"
for x in range(len(v5)):
print(chr(v5[x]^ord(key[x])),end="")
#flag{d07abccv8a410c
也是将函数全部代码按u取消定义后对函数按p将作为函数得到正确代码

看不懂,但是flag{d07abccv8a410c是19位,输入24位,正好v3有5位应该是对v3进行解密操作,已知flag最后一位是},我们可以反向解密
v3 = [37, 116, 112, 38, 58]
key = ord('}') ^ 58
for i in range(5):
print(chr(v3[i] ^ key),end="")
得到flag{d07abccv8a410cb37a}
Comments NOTHING