XDCTF 2013 code2 跳出死循环
题目:编写一个程序(比如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 ,根据这个就可以写入数据了。
XDCTF 2013 code2 跳出死循环的更多相关文章
- while循环条件不成立却无法跳出死循环的问题
在进入循环的时候,实际上是将A从内存加载到寄存器里面运行的,在整个循环中,A这个变量都只是在读取寄存器里面的值. 而当进入中断的时候,中断里面会从内存加载A到寄存器,修改完之后又存到内存里,然后退出中 ...
- Java Socket 死循环while如何判断客户端断开
多线程的服务器程序 线程中等待客户端的消息 我的代码能实现服务器与客户端的通信 问题是: 当客户端中断或退出 以上代码却不能判断Socket中断 跳不出while的无限循环 解决方法: ...
- 关于死循环while(true){}或for(;;){}的总结
关于死循环while(true){}或for(;;){}的总结 1.基本用法: while(true){ 语句体; } for(;;){ 语句体; } 以上情况,语句体会一直执行. 2 ...
- python之最强王者(3)——变量,条件、循环语句
1.Python 变量类型 变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 因此,变量可以指定不同的 ...
- Java Concurrent之 AbstractQueuedSynchronizer
ReentrantLock/CountDownLatch/Semaphore/FutureTask/ThreadPoolExecutor的源码中都会包含一个静态的内部类Sync,它继承了Abstrac ...
- Unsafe的应用
要想把java并发包学好,并明白其底层的设计原理,Unsafe类你不能不去研究一下.下面介绍一下Unsafe类的功能以及它在JDK中的应用. 一.分配内存和释放内存 功能:类中提供的3个本地方法all ...
- Java并发编程:Timer和TimerTask(转载)
Java并发编程:Timer和TimerTask(转载) 下面内容转载自: http://blog.csdn.net/xieyuooo/article/details/8607220 其实就Timer ...
- 20 BasicTaskScheduler0 基本任务调度类基类(二)——Live555源码阅读(一)任务调度相关类
这是Live555源码阅读的第二部分,包括了任务调度相关的三个类.任务调度是Live555源码中很重要的部分. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/ol ...
- Timer与TimerTask的真正原理&使用介绍
转载: Timer与TimerTask的真正原理&使用介绍 其实就Timer来讲就是一个调度器,而TimerTask呢只是一个实现了run方法的一个类,而具体的TimerTask需要由你自己来 ...
随机推荐
- Hard Parse&Soft Parse
DDL每次运行将必须是难以解决. SQL 解析过程 Oracle对此SQL将进行几个步骤的处理过程: 1.语法检查(syntax check): 检查此sql的拼写是否语法. 2.语义检查(seman ...
- iOS8开发~UI布局(二)storyboard中autolayout和size class的使用具体解释
一.概要:前一篇初步的描写叙述了size class的概念,那么实际中怎样使用呢,以下两个问题是我们一定会遇到的: 1.Xcode6中添加了size class,在storyboard中怎样使用? 2 ...
- Hibernate_10_继承的例子_单表
只是建一个表,所有属性都包括在此表.使用discriminator 到父和子类之间的区别. 1)父类(Article): public class Article { private Integer ...
- 【百度地图API】如何利用自己的数据制作社交地图?只显示可视区域内的标注
原文:[百度地图API]如何利用自己的数据制作社交地图?只显示可视区域内的标注 摘要:如果你自己的数据已经超过1万个,如何进行合理的显示?除了聚合marker外,还有一个办法.那就是,只显示可视区域内 ...
- PHP移动互联网的发展票据(6)——MySQL召回数据库基础架构[1]
原文地址 :http://www.php100.com/html/php/api/2014/0326/6707.html 一.数据类型 1.整型 数据类型 存储空间 说明 取值范围 TINYINT 1 ...
- Python学习笔记16:标准库多线程(threading包裹)
Python主要是通过标准库threading包来实现多线程. 今天,互联网时代,所有的server您将收到大量请求. server要利用多线程的方式的优势来处理这些请求,为了改善网络port读写效率 ...
- js checkbox多选值采集
var objs = document.getElementsByTagName("input"); for (var i = 0; i < objs.length; i++ ...
- WebBrowser编程简述
原文:WebBrowser编程简述 1.初始化和终止化(Initialization & Finalization) 大家在执行TWebBrowser的某个方法以进行期望的操作,如ExecWB ...
- MySql绿色版配置及使用详解
原文:MySql绿色版配置及使用详解 最近在做项目开发时用到了MySql数据库,在看了一些有关MySql的文章后,很快就上手使用了.在使用的过程中还是出现了一些问题,因为使用的是绿色免安装版的MySq ...
- The Swift Programming Language-官方教程精译Swift(2)基础知识
Swift 的类型是在 C 和 Objective-C 的基础上提出的,Int是整型:Double和Float是浮点型:Bool是布尔型:String是字符串.Swift 还有两个有用的集合类型,Ar ...