题目:编写一个程序(比如kernel module),使附件2.c中的程序跳出死循环。2.c中的代码如下:
#include 
int main(int argc, char *argv[])
{
int n = 1;
printf(“Address of n :%x\n”,&n);
printf(“My pid is: %d.\n”, getpid());
while(1){
sleep(3); /* sleep for 3 secs */
}
printf(“I break out\n”);
return 0;
}
说明:
此题只需上交实现文档、源码。源码中请以注释注明平台、系统。比如32位linux 3.2。
将上述代码编译好(不能修改),运行,想办法令其跳出循环,打印出”I break out\n”。
你的代码不能调用任何其他软件,比如od之类。
如果你知道内核栈、pt_regs结构体、函数栈桢,那么你很有可能成功。
成功打印出”I break out\n”但同时引发段错误得2/3分。

屌丝不会linux,所以只能windows

思路:debug编译出上面代码可以看到while(1)的反汇编代码为mov ecx,1,只需用WriteProcessMemory将1修改为0即可跳出死循环

反汇编:

 0040D470 >                push ebp
0040D471 8BEC mov ebp,esp
0040D473 83EC sub esp,
0040D476 push ebx
0040D477 push esi
0040D478 push edi
0040D479 8D7D BC lea edi,dword ptr ss:[ebp-]
0040D47C B9 mov ecx,
0040D481 B8 CCCCCCCC mov eax,CCCCCCCC
0040D486 F3:AB rep stos dword ptr es:[edi]
0040D488 C745 FC >mov dword ptr ss:[ebp-],
0040D48F 8D45 FC lea eax,dword ptr ss:[ebp-]
0040D492 push eax
0040D493 942F4200 push xd_code2.00422F94 ; ASCII "Address of n :%x
"
0040D498 E8 call xd_code2.printf
0040D49D 83C4 add esp,
0040D4A0 E8 4B000000 call xd_code2._getpid
0040D4A5 push eax
0040D4A6 842F4200 push xd_code2.00422F84 ; ASCII "My pid is: %d.
"
0040D4AB E8 call xd_code2.printf
0040D4B0 83C4 add esp,
0040D4B3 B9 mov ecx, ; while()
0040D4B8 85C9 test ecx,ecx
0040D4BA je short xd_code2.0040D4CF
0040D4BC 8BF4 mov esi,esp
0040D4BE 6A push
0040D4C0 FF15 18A24200 call dword ptr ds:[<&KERNEL32.Sleep>] ; kernel32.Sleep
0040D4C6 3BF4 cmp esi,esp
0040D4C8 E8 C33BFFFF call xd_code2.
0040D4CD ^ EB E4 jmp short xd_code2.0040D4B3
0040D4CF 1C204200 push xd_code2.0042201C ; ASCII "I break out
"
0040D4D4 E8 call xd_code2.printf
0040D4D9 83C4 add esp,
0040D4DC 33C0 xor eax,eax
0040D4DE 5F pop edi
0040D4DF 5E pop esi
0040D4E0 5B pop ebx
0040D4E1 83C4 add esp,
0040D4E4 3BEC cmp ebp,esp
0040D4E6 E8 A53BFFFF call xd_code2.
0040D4EB 8BE5 mov esp,ebp
0040D4ED 5D pop ebp
0040D4EE C3 retn

代码:

 #include "stdafx.h"
#include <windows.h>
#include <TlHelp32.h>
#define PID 2200 //每次运行手动修改
BYTE* GetBase(int Pid); int _tmain(int argc, _TCHAR* argv[])
{
BYTE *base = GetBase(PID); //printf_s("%x", base);
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);
byte NewCode = ; //测试发现地址不会变,都为0x40D4B4,故GetBase函数都不需要
if (WriteProcessMemory(hProcess, base + 0xD4B4, &NewCode, , NULL))
{
printf_s("Write Success!\n");
} getchar();
return ;
} BYTE* GetBase(int Pid)
{
BYTE *result = NULL;
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, Pid);
if (hSnap == INVALID_HANDLE_VALUE)
{
printf_s("CreateToolhelp32Snapshot failed\n");
} MODULEENTRY32 Me32;
Me32.dwSize = sizeof(MODULEENTRY32); BOOL bRet = Module32First(hSnap, &Me32);
while(bRet)
{
if (Me32.th32ProcessID == Pid)
{
printf_s("Have Found!\n");
result = Me32.modBaseAddr; //返回主模块的基地址
break;
}
bRet = Module32Next(hSnap, &Me32);
} CloseHandle(hSnap);
return result;
}

运行效果:

跳出成功

总结:

while(1)在debug编译下为mov ecx,1  test ecx, ecx, jz XXXXXXXX ,根据这个就可以写入数据了。

最新文章

  1. MongoDB安装使用
  2. 功能实现:PLC对LPC的音量控制
  3. Android—自定义Dialog
  4. RadioGroup、RadioButton、CheckBox、Toast用法
  5. TFS 升级错误一则 TF400654
  6. windows服务器的DDOS防御,
  7. css+html 关于文本的总结(整理中)
  8. bootstrap学习总结-06 按钮
  9. 从Unity学UE(一)之蓝图类的使用----制作一个可控灯光
  10. sqlserver on linux
  11. jQuery ajax的traditional参数的作用
  12. Linux下C/C++程序开发管理(makefile)
  13. Spring+MyBatis实践—MyBatis数据库访问
  14. 关于 mysql.test 数据库
  15. (转)linux下导入、导出mysql数据库命令
  16. pyenv简介——Debian/Ubuntu中管理多版本Python
  17. Linux下PHP连接MS SQLServer的办法
  18. linux高级编程
  19. 由“如何取得CPU的温度与型号”学到的知识延伸WQL
  20. dup()&dup2()

热门文章

  1. android控制文件:ViewPager+Fragment+GridView使用(与AndroidQuery框架结合)
  2. POJ 2586 Y2K Accounting Bug(枚举洪水问题)
  3. 通俗易懂的语言描述JavaScript原型
  4. MVC Bootstrap Helpers
  5. webBrowser.execWB的完整说明
  6. sql server drop talbe 自动删除关联的外键 ,权限体系(一)
  7. linq 分组求和
  8. c#之函数创建和闭包
  9. 快速构建Windows 8风格应用19-基础控件II
  10. 工欲善其事:编辑器之神Vim(一)