下载附件,附件为exe的可执行文件,第一步查壳。python
发现为nsPack壳,可采用脱壳机或者手动脱壳的方式进行脱壳。ide
在此采用手动脱壳的方式,增长本身对脱壳流程的理解,并熟练相关操做。学习
ESP定律脱壳this
将程序拖入ODspa
发现pushfd和pushad两句关键句。3d
F8单步执行到call语句,ESP变化,在ESP上右键,添加断点。code
F9执行程序blog
执行到popfd,且下一条命令为一个很长距离的跳转,根据北斗壳的特色,极可能跳转至OEP。字符串
F8单步执行到以下位置get
观察代码 00401336 为程序的OEP
利用PETools获取转存
利用 ImportREC 修复IAT
脱壳后的程序可以正确运行
对脱壳后的程序进行查壳
查询结果壳已经脱掉,脱壳操做完毕。
将程序拖入IDA分析
int __cdecl main(int argc, const char **argv, const char **envp) { int result; // eax int v4; // eax char Buf; // [esp+4h] [ebp-38h] char Dst; // [esp+5h] [ebp-37h] Buf = 0; memset(&Dst, 0, 0x31u); printf("Please Input Flag:"); gets_s(&Buf, 0x2Cu); if ( strlen(&Buf) == 42 ) { v4 = 0; while ( (*(&Buf + v4) ^ byte_402130[v4 % 16]) == dword_402150[v4] ) { if ( ++v4 >= 42 ) { printf("right!\n"); goto LABEL_8; } } printf("error!\n"); LABEL_8: result = 0; } else { printf("error!\n"); result = -1; } return result; }
在while语句中,对输入字符串进行异或运算,利用异或运算特殊的可逆性。将byte_402130与dword_402150进行异或,便可获得正确答案。
byte_402130处须要模16 循环取值。
编写python脚本
string_1 = "this_is_not_flag" string_2 = [0x12, 4, 8, 0x14, 0x24, 0x5c, 0x4a, 0x3d, 0x56, 0xa, 0x10, 0x67, 0, 0x41, 0, 1, 0x46, 0x5a, 0x44, 0x42, 0x6e, 0x0c, 0x44, 0x72, 0x0c, 0x0d, 0x40, 0x3e, 0x4b, 0x5f, 2, 1, 0x4c, 0x5e, 0x5b, 0x17, 0x6e, 0xc, 0x16, 0x68, 0x5b, 0x12, 0x48, 0x0e] flag = "" for i in range(42): flag += chr(string_2[i] ^ ord(string_1[i % 16])) print(flag)
输出:flag{59b8ed8f-af22-11e7-bb4a-3cf862d1ee75}
解题完毕!
收获:熟悉手动脱壳操做,解题完毕后,在网上查找资料学习各类壳的手动脱壳流程,对加壳脱壳有更加深刻的了解。
部分资料:ximo脱壳基础 连接: https://pan.baidu.com/s/1zkE0zMgsMFBA5RawEajjOQ 提取码: wf2y