【pbctf】cosmo

 

该程序会根据输入flag是否正确返回结果

 

搜索文本give定位到sub_403066函数

 

往下拉会发现改函数会循环判断输出no或correct,该函数可能为主函数

 

调用字符串no后有两个函数,动态调试后发现一个是print一个是exit

 

修改函数名后反汇编,可以看到函数调用的参数不够直观

 

 

 

根据调用函数之前入栈的寄存器对函数的格式进行更改

 

流程:先判断argc是否为2,判断字符串长度,然后进行循环,每次取两个字符,encode之后的结果与qword_40C000进行对比,

每次都相等后正确

 

 

根据汇编代码可知encode中有三个参数,rsi是输入的值,edx固定为2,最后调用之后的结果传回到rdi中作为下一次的输入

 

encode函数更改格式

 

先看encode函数里主要的循环,常量2赋给v4,64行的if,75行的if均会被跳过

 

high和low分别是取flag的高位和低位

 

75行的if不成立后直接到159行的else,v4是常量2,循环两次,第一次循环中,低位加第一个字符,高位加低位,第二次循环中,低位加第二个字符,高位加低位,然后拼接起来返回,而且整个过程是在mod 0xfff1的情况下运行的

 

最后wp

off_40C000 = [0x14400D3,

              0x42401AA,

              0x8BF028B,

              0x0EFA034F,

              0x16A1040D,

              0x200004EA,

              0x2AE20597,

              0x3721065C,

              0x4507072B,

              0x542F07CD,

              0x651208A2,

              0x77860970,

              0x8B8F0A34,

              0xA0D50ADF,

              0xB75C0B75,

              0xCFA40C5E,

              0xE9440D01,

              0x4520DB2,

              0x20B10E6E]

 

high_old = 0

low_old = 1

flag = ""

 

for i in range(len(off_40C000)):

    low = (off_40C000[i] & 0x0000ffff) >> 16

    high = off_40C000[i] & 0xffff0000

    high = (off_40C000[i] & 0xffff0000) >> 16

    low = (off_40C000[i] & 0x0000ffff)

 

    c1 = (high - high_old - low_old - low) % 0xfff1

    flag += chr(c1)

    c2 = (low - low_old - c1) % 0xfff1

    flag += chr(c2)

 

    high_old = high

    low_old = low

 

print(flag)

 

上一篇:MySQL select into临时表


下一篇:2021-09-27