这道题有壳,strings搜索是upx3.91。但是不能用upx -d。只好手动脱壳了。
难点在于本题目有反调试,有些函数不能步过。
首先研究壳。
第一句call必须步入。
Sub_44f1c5必须步入。
Sub_44F1C5中,
0x44f214的rep指令把0x400000到0x44f248复制到0x800000位置。
0x44f22c处,rbp是0x84efb5。这句话是start处的第二条指令。这里不必步入。如果步入,
在44EFCB处的call sub_44F020,再步过就会卡死(不知道为什么,奇怪!如果卡死,按ctrl+c可以只是终止而不退出gdb);步入之后可以使用finish命令运行到函数外,即0x44F22E处pop rcx。
在0x44f22f retn之后,到达0x84f248: call 0x84f2ac。
0x84f2ac是一开始没有复制的地址,可以考虑是0x84efb5的代码形成的新代码。此处内存开辟是在系统调用mmap处,刚开辟后此处全为0.
此时可以dump出来0x800000处的内存,见dump2.(我修改了ep,va,filesize)
接着运行到0x84f31c: call 0x84f782,可以步过。
在0x84f339: jmp QWORD PTR [r15],跳转到0x40000c
此时可以dump处0x400000处的内存,见文件bindump.so。这就是脱壳后的文件了,但是不能运行,不清楚原因。可以看到ep是0x400890。
0x40000c: syscall(调用号11,sys_mun