我按照网上教程能找到oep了
但是不会修复函数,能不能具体讲一下步骤和工具呢?
就是到了下面的教程就卡住不会了:
二、函数修复
用ImprotREC 只能修复一个无效指针,需要跟踪原程序,重新载入,10次Shift+F9后,到了右下角堆栈窗口看到:
0012FFA4 /0012FFB8 指针到下一个 SEH 记录
0012FFA8 |0037382B SE 句柄
0012FFAC |00830000
0012FFB0 |0022D000
0012FFB4 |00004000
0012FFB8 ]0012FFE0 指针到下一个 SEH 记录
直接ctrl+f10到373879,然后F2下断,Shift+F9到达后,在Dump区,Ctrl +G到402000,选中从402000到402030处下内存访问断点,F9,寄存器窗口依次可见每个待处理的函数,顺序是从402030开始的。根据寄存器窗口看到的函数名称,依次修复函数如下:
FThunk: 00002000 NbFunc: 00000003
1 00002000 advapi32.dll 01EC RegQueryValueExA
1 00002004 advapi32.dll 01C9 RegCloseKey
1 00002008 advapi32.dll 01E2 RegOpenKeyExA
FThunk: 00002010 NbFunc: 00000007
1 00002010 kernel32.dll 00E6 FreeLibrary
1 00002014 kernel32.dll 038F lstrcat
1 00002018 kernel32.dll 0166 GetModuleFileNameA
1 0000201C kernel32.dll 00AC ExitProcess
1 00002020 kernel32.dll 022F LoadLibraryA
1 00002024 kernel32.dll 018A GetProcAddress
1 00002028 kernel32.dll 039E lstrlen
FThunk: 00002030 NbFunc: 00000001
1 00002030 user32.dll 01DD MessageBoxA
三、SDK修复
函数修复完之后,还无法运行,有SDK,我们来逐一修复。运行脱壳文件,提示“3C00AD处不易读取”,OK,搜索常数“3C00AD”,找到如下地址
004011D3 - E9 D5EEFBFF JMP 003C00AD ; SDK
跟踪原程序,发现壳中只是简单的JMP 4011D8而已,所以这里NOP即可,保存修改,重新运行,提示“3C0095处不易读取”,找到如下地址。
004011C4 - E9 CCEEFBFF JMP 003C0095
跟踪原程序,发现最终进入函数
77E54155 > 6A 08 PUSH 8
77E54157 68 4019E677 PUSH kernel32.77E61940
77E5415C E8 80330000 CALL kernel32.77E574E1 ; 返回到这里
拿出API地址专家(感谢kongfoo为我们提供这么好的工具),输入77E54155,找API名,结果
77E54155 lstrcat 所在库:kernel32.dll
根据我们修复的IAT,lstrcat对应的是00002014,所以我们把 JMP 003C0095 修改成 JMP DWORD PTR DS:[402014]即可,保存修改,重新运行,提示“3C0089处不易读取”,OK,搜索常数“3C0089”,找到如下地址
004011BE $- E9 C6EEFBFF JMP 003C0089
F8一下,看到
003C0089 - FF25 20204000 JMP DWORD PTR DS:[402020] ; 哈哈,这不就是
LoadLibraryA吗,OK,不用跟了,直接修改,把 JMP 003C0089 修改成 JMP DWORD PTR DS:[402020]即可,保存修改,重新运行,到这里出错
00401152 - E9 D6EEFBFF JMP 003C002D
跟踪原程序,壳中代码是
003C002D 68 2A104000 PUSH 40102A ; Stolen Code,补上
003C0032 - E9 20110400 JMP Doctor.00401157
把 JMP 003C002D 修改为 PUSH 40102A,即可,保存修改,重新运行,这里出错
00401158 . E8 5B000000 CALL 1_.004011B8
F7进入后,发现SDK
004011B8 $- E9 C0EEFBFF JMP 003C007D
跟踪原程序,代码如下
003C007D - FF25 24204000 JMP DWORD PTR DS:[402024]
同上,把 JMP 003C007D 改成 JMP DWORD PTR DS:[402024]即可,保存修改,重新运行,这里出错
00401161 - E9 D2EEFBFF JMP 003C0038
跟踪原程序,代码如下
003C0038 68 E8030000 PUSH 3E8 ; Stolen Code,补上
003C003D - E9 24110400 JMP Doctor.00401166
把 JMP 003C0038 修改为 PUSH 3E8,即可,保存修改,重新运行,OK,修复完毕。
当然,现在程序中还有一下地方有类似 JMP 003CXXXX 的代码,不过不影响程序的运行和功能,就懒得去修复了:)
以上是教程的内容,找oep那段我会了
麻烦教一下修复函数
[课程]Linux pwn 探索篇!