核心思想:objdump -d 找到關鍵匯編代碼,然後用ghex2 打開可執行程序,修改和匯編對應的機器碼,當然前提是對匯編足夠了解。
下面講一個簡單在linux上的例子:
1. 先建立一個簡單的程序,
[cpp]
#include <iostream>
using namespace std;
bool abc(){
return false;
}
int main(int argc, char *argv[])
{
if(abc()){
cout << "hacked" << endl;
}else{
cout << "not hacked" << endl;
}
return 0;
}
#include <iostream>
using namespace std;
bool abc(){
return false;
}
int main(int argc, char *argv[])
{
if(abc()){
cout << "hacked" << endl;
}else{
cout << "not hacked" << endl;
}
return 0;
}
2. 用g++ main.cpp編譯成可執行程序a.out,
3. 運行./a.out 輸出:
not hacked
4. 調用 objdump -d a.out > simple.txt
5. 在simple.txt中搜索abc,找到如下代碼
[cpp]
080486f4 <_Z3abcv>:
80486f4: 55 push %ebp
80486f5: 89 e5 mov %esp,%ebp
80486f7: b8 00 00 00 00 mov $0x0,%eax
80486fc: 5d pop %ebp
80486fd: c3 ret
080486f4 <_Z3abcv>:
80486f4: 55 push %ebp
80486f5: 89 e5 mov %esp,%ebp
80486f7: b8 00 00 00 00 mov $0x0,%eax
80486fc: 5d pop %ebp
80486fd: c3 ret 6. 然後用ghex2打開a.out, 搜 55 89 e5 b8 00 00 00 00, 找到這段匯編對應的機器碼的位置,
7. 最後到了關鍵一步, 把上面的一段機器碼改成 55 89 e5 b8 01 00 00 00, 其實只改了一個字,意思是把返回false改成返回true。
8. 再次運行./a.out 輸出: hacked。大功告成。