题目
是某ctf题
首先使用IDA打开:
函数极少,有壳。
查看函数
这个跳转比较可疑
下面进行IDA动态调试
进入loc_52D516
再进入
直到找到jmp r13
运行到这里,F8跳转
直接retn下断点F9,直接retn下断点F9重复,
直到遇到一个大跳转
单步,然后return
来到了程序入口
下面dump脱壳(转储的意思)。
dump要使用脚本,因为我是个菜鸡,直接在网上找的脚本,通用的。
idc脚本下载
可以存放在ida里面有个脚本的文件夹idc,源码后面会附上
首先
在D盘下创建一个dumpfile无后缀文件,不然要提示错误
当然也可以改文件目录和地址,见源文件
运行到程序入口点。
使用alt+F7载入脚本,选择dump_elf64
等待
加载
成功以后,刚刚创建的dumpfile就是脱壳后的文件了。
源码:
#include <idc.idc>
#define PT_LOAD 1
#define PT_DYNAMIC 2
static main(void)
{auto ImageBase,StartImg,EndImg;auto e_phoff;auto e_phnum,p_offset;auto i,dumpfile;ImageBase=0x400000;StartImg=0x400000;EndImg=0x0;if (Dword(ImageBase)==0x7f454c46 || Dword(ImageBase)==0x464c457f ){if(dumpfile=fopen("D:\\dumpfile","wb"))//这路可以更改路径{e_phoff=ImageBase+Qword(ImageBase+0x20);Message("e_phoff = 0x%x\n", e_phoff);e_phnum=Word(ImageBase+0x38);Message("e_phnum = 0x%x\n", e_phnum);for(i=0;i<e_phnum;i++){if (Dword(e_phoff)==PT_LOAD || Dword(e_phoff)==PT_DYNAMIC){ p_offset=Qword(e_phoff+0x8);StartImg=Qword(e_phoff+0x10);EndImg=StartImg+Qword(e_phoff+0x28);Message("start = 0x%x, end = 0x%x, offset = 0x%x\n", StartImg, EndImg, p_offset);dump(dumpfile,StartImg,EndImg,p_offset);Message("dump segment %d ok.\n",i);} e_phoff=e_phoff+0x38;}fseek(dumpfile,0x3c,0);fputc(0x00,dumpfile);fputc(0x00,dumpfile);fputc(0x00,dumpfile);fputc(0x00,dumpfile);fseek(dumpfile,0x28,0);fputc(0x00,dumpfile);fputc(0x00,dumpfile);fputc(0x00,dumpfile);fputc(0x00,dumpfile);fputc(0x00,dumpfile);fputc(0x00,dumpfile);fputc(0x00,dumpfile);fputc(0x00,dumpfile);fclose(dumpfile);}else Message("dump err.");}
}
static dump(dumpfile,startimg,endimg,offset)
{auto i;auto size;size=endimg-startimg;fseek(dumpfile,offset,0);for ( i=0; i < size; i=i+1 ) {fputc(Byte(startimg+i),dumpfile);}
}
这个题脱壳后就全是地址了,用了很多方法,没找着主函数,我太菜了