170707 逆向-南邮CTF逆向(WxyVM1)

来源:互联网 发布:c语言编程软件中文版 编辑:程序博客网 时间:2024/05/16 11:12

1625-5 王子昂 总结《2017年7月7日》 【连续第278天总结】
A. 南邮CTF逆向(4)
B. 4:
记事本打开发现文件头是ELF,拖入IDA进行反编译,发现只有几个函数
查看main函数,发现输入以后调用sub_4005B6()函数,然后判断长度是否为24和字符串0x601060比较
再进一步看4005B6,发现是按照0x6010C0的14997个字节来处理,每3个字节为一组,每组的第一个字节为处理方式,通过switch来判断,包括加减乘异或等;第二个字节指定处理第几个字节;第三个字节则为处理数
这里写图片描述
由于处理内容过于庞大,就想直接使用IDC脚本来逆处理目标字符串。加减乘异或的逆运算都很明显。
思路很清晰,然而在写脚本的时候出问题了:IDC脚本不接受数组和char类型的声明(或者是我不会(:з」∠)
无法新申请内存空间,就只好使用已有的内存空间了;然而*(0x601060)的使用方法也不承认,说好的IDC脚本和C++很像呢
想把这一段脚本Dump下来用py处理也是可以的,不过在找IDC的写入函数时找到了PatchByte(a,v)函数,可以将v写入a字节
那么直接对0x601060位置的24个字符串处理即可得到flag
IDC脚本如下:

auto i;for ( i = 14997; i >= 0; i = i - 3 )  {    auto v0 = Byte(0x6010C0+i);    auto v3 = Byte(0x6010C0+(i + 2));    auto result = v0;    if(v0==1){        result =Byte(0x6010C0+i + 1);        PatchByte(0x601060 + result*4,Byte(0x601060 + result*4)-v3);            }     if(v0==2){         result =Byte(0x6010C0+i + 1);       PatchByte(0x601060 + result*4,Byte(0x601060 + result*4)+v3);            }    if(v0==3){        result =Byte(0x6010C0+i + 1);        PatchByte(0x601060 + result*4,Byte(0x601060 + result*4)^v3);            }   if(v0==4){        result =Byte(0x6010C0+i + 1);        PatchByte(0x601060 + result*4,Byte(0x601060 + result*4)/v3);            }   if(v0==5){         result =Byte(0x6010C0+i + 1);    PatchByte(0x601060 + result*4,Byte(0x601060 + result*4)^Byte(0x601060+v3*4));            }    else        continue;  }for(i=0;i<24;i++)Message("%c",Byte(0x601060+i*4))

注意单位为字节,因此直接对地址运算时需要x4
C. 明日计划
南邮CTF逆向5、6