查壳
拖进ida静态分析、
看到函数经过第一把算出Test直接调用MessageBoxA弹出一些内容
弹出字符应该就是byte_402008中的28个字符
跟进该函数
发现该函数中并不只28个字符,后边没打印的就是flag
查看对应汇编指令
看到入栈数量为1C,只需要修改该处数量大小即可完整弹出字符
(经尝试直接在ida中修改后效果不佳,我们直接在010中修改)
这里插入一下RVA-FOA的转换
ImageBase: 模块基址.程序一开始的地址.
VA: 全名virtualAddress 虚拟地址. 就是内存中虚拟地址. 例如 0x00401000
RVA: RV 地址0x00401000的RVA就是 0x1000. RVA = 虚拟地址-ImageBase
FOA: 文件偏移. 就是文件中所在的地址.
RVA和FOA的转换
PE文件中的节等模块加载到内存时,节的数据布局和文件中的内存布局基本保持不变。所以可以根据这个数据位置相对不变的特点来由RVA正确换算出到数据相对文件的偏移。即,每个节(section)中的数据的起始位置相对节的起始位置是不变的,不管节是在文件中还是被加载到内存中。
1.判断指定的RVA在那个节中 2.求得该节的起始地址RVA 3.求出偏移量Offset=RVA-节起始RVA 4.FOA = Offset+该节在磁盘中的起始地址
步骤:我们知道该指令在ida中的地址为 0x4011C9(也就是在内存中的地址)首先找到RVA VA-imagbasw=11C9 然后再找RVA位于那个节区 且相对偏移量是多少,这里直接用工具
11c9位于test字段 减去该段VA 得到相对偏移量(1c9) 加上该节在硬盘中的位置0x400为0x5C9,在010找到相对位置
对应的6A 1C就是 push 1C
修改1C为B0即可
再次运行
得到flag{I_a_M_t_h_e_e_n_C_o_D_i_n_g@flare-on.com}