该程序会根据输入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)