[网鼎杯 2020 青龙组]jocker

最后更新于 2024-07-18 421 字 预计阅读时间: 2 分钟


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}

此作者没有提供个人介绍。
最后更新于 2024-07-18