修改邻接变量的方法对代码环境限制比较多,更通用、更强大的方法是修改 EBP、返回地址等状态值。

为了方便调试,修改之前的代码如下:

 #include<stdio.h>
#include<stdlib.h>
#include<string.h> #define PASSWORD "1234567" int verify_password(char *password)
{
int authenticated=0x03050709;
char buffer[]; // add local buf to be overflowed
authenticated=strcmp(password,PASSWORD);
strcpy(buffer, password); // overflow here
return authenticated;
} int main()
{
int valid_flag=;
char password[];
if(!freopen("password.txt","r",stdin)) // 非打印字符不便于从console输入,故 redirect stdin
//FILE *fp;
//if(!(fp=fopen("password.txt","rw+")))
{
printf("file open error!\n");
exit();
}
scanf("%s",password);
//fscanf(fp,"%s",password);
printf("password input: %s\n",password);
valid_flag=verify_password(password);
if(valid_flag){
printf("Incorrect password!\n\n");
}
else
{
printf("Congratulation! You have passed the verification!\n\n");
}
//fclose(fp);
return ;
}

在 password.txt 中存储内容为 abcdefg 时,OD 调试 exp_me.exe,执行完第 12 行 strcpy 后的栈帧如下图所示:

如上图,此时栈帧中 authenticated 的值(0x0012FAE8)为 1,表示验证未通过。EBP : 0x0012FAEC,前栈帧 EBP : 0x0012FF48,返回地址 : 0x0040ECD8。

 0040ECCC  |. 8D95 FCFBFFFF     LEA EDX,DWORD PTR SS:[EBP-]
0040ECD2 |. PUSH EDX
0040ECD3 |. E8 2D23FFFF CALL exp_me.
0040ECD8 |. 83C4 ADD ESP,
0040ECDB |. FC MOV DWORD PTR SS:[EBP-],EAX
0040ECDE |. 837D FC CMP DWORD PTR SS:[EBP-],
0040ECE2 |. 0F JE SHORT exp_me.0040ECF3
0040ECE4 |. AC404200 PUSH OFFSET exp_me.??_C@_0BG@GFGB@Incorr>; /format = "Incorrect password! "
0040ECE9 |. E8 F225FFFF CALL exp_me.printf ; \printf
0040ECEE |. 83C4 04 ADD ESP,4
0040ECF1 |. EB 0D JMP SHORT exp_me.0040ED00
0040ECF3 |> 68 6C404200 PUSH OFFSET exp_me.??_C@_0DD@FPBB@Congra>; /format = "Congratulation! You have passed the verification! "
0040ECF8 |. E8 E325FFFF CALL exp_me.printf ; \printf
0040ECFD |. 83C4 04 ADD ESP,4
0040ED00 |> 33C0 XOR EAX,EAX
0040ED02 |. 5F POP EDI
0040ED03 |. 5E POP ESI

从上面的反汇编代码可以看到,0x0040ECD8 处的代码对应源码第 30 行后恢复栈帧处,如果能将此时的返回地址覆盖为 0x0040ECF3,就能跳过错误验证流程,直接执行源码中第 36 行的 else 分支,进入验证正确后的执行流程。

用 UltraEdit 将 password.txt 修改为如下内容:

注意,CPU 为 Little_Endian 模式,最后的四字节返回地址(0x0040ECF3)要反写成 E3 EC 40 00

在返回地址之前的前栈帧地址 0x0012FF48 不能写为 48 FF 12 00,因为这里的 00 会被 scanf 当作截断符中止读取,导致内容读取不够,覆盖返回地址失败(只能覆盖到 EBP)。

修改 password.txt 后,OD 调试结果如下:

紧接着出现如下错误,因为 EBP 覆盖成了错误的 0xAA12FF48 而不是 0x0012FF48,导致栈帧不平衡。

这个问题留着以后再学习吧,今天到此了,睡觉去(2014-3-31 23:31:55)。

OD: Exploit Me - Overwrite Return Address的更多相关文章

  1. OD: Exploit Me - Overwrite Nearby Varible

    实验代码: #include<stdio.h> #include<string.h> #define PASSWORD "1234567" int veri ...

  2. Multi-tasking RTOS for microprocessors with limited memory by saving only a single return address per task during context switching

    A real-time operating system (RTOS) for use with minimal-memory controllers has a kernel for managin ...

  3. 栈帧的内部结构--动态返回地址(Return Address)

    每个栈帧中包含: 局部变量表(Local Variables) 操作数栈(Opreand Stack) 或表达式栈 动态链接 (Dynamic Linking) (或指向运行时常量的方法引用) 动态返 ...

  4. OD: Exploit Me - Inject Instruction

    修改之前的代码: #include<stdio.h> #include<stdlib.h> #include<string.h> #include<windo ...

  5. OD: Shellcode / Exploit & DLL Trampolining

    看到第五章了. 标题中 Dll Tramplining(跳板)名字是从如下地址找到的,写的很好: http://en.wikipedia.org/wiki/Buffer_overflow#The_ju ...

  6. BUFFER OVERFLOW 10 Vulnerability & Exploit Example

    SRC= http://www.tenouk.com/Bufferoverflowc/Bufferoverflow6.html THE VULNERABLE AND THE EXPLOIT     W ...

  7. OD: ASLR

    ASLR,Address Space Layout Randomization,通过加载程序的时候不再使用固定的基址,从而干扰 shellcode 定位的一种保护机制,包括映像随机化.堆栈随机化.PE ...

  8. Detecting a return-oriented programming exploit

    A method and apparatus for detecting a Return-Oriented Programming exploitation. At a computer devic ...

  9. OD: DEP - Ret2Libc via VirtualProtect() & VirtualAlloc()

    一,通过 VirutalProtect() 修改内存属性绕过 DEP DEP 的四种工作模式中,OptOut 和 AlwaysOn 下所有进程默认都开启 DEP 保护,这里如果一个程序自身需要从堆栈中 ...

随机推荐

  1. 【转】深入理解Java内存模型(二)——重排序

    数据依赖性 如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性.数据依赖分下列三种类型: 名称 代码示例 说明 写后读 a = 1;b = a; 写一个变量之 ...

  2. 微信 回复多图文 借助php框架

    private function replyMostPhoto($data,$arr){$this->logger("已经到达回复多图文!".$arr[0]['Title'] ...

  3. UIScrollView 滚动停止的时候一次调用此方法

    //拖动返回选中的索引 当滚动视图停止时的时候 - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{ CGFloat wid ...

  4. 19个非常有用的 jQuery 图片滑动插件和教程

    jQuery 是一个非常优秀的 Javascript 框架,使用简单灵活,同时还有许多成熟的插件可供选择.其中,最令人印象深刻的应用之一就是对图片的处理,它可以让帮助你在你的项目中加入精美的效果.今天 ...

  5. C#中HashTable和快速排序的用法

    题目主要是写一个程序,分析一个文本文件(英文文章)中各个词出现的频率,并且把频率最高的10个词打印出来.   自从周四拿到题目以后,发现又要用到万恶的数据结构了,不得不说这是我的短板,所有上周20号到 ...

  6. Python学习之--异常处理

    Python中的Exceptions是所有异常的基类,内置的异常类都放在了exceptions模块中,通过dir()函数可以看到这些内置的类 通过raise 语句触发异常,如 >>> ...

  7. 【学习笔记】【Foundation】集合Set

    不可变集合 NSSet :集合元素无顺序,没有索引号,元素不可重复. NSSet在功能上可看做是NSArray的父集,它是一个更通用的类. NSSet包含如下常用方法: setByAddingObje ...

  8. myEclipse8.* 手动安装ADT插件[转]

    Myeclipse8.6手动添加插件: 自动在线安装完ADT插件会导致myeclipse8.6中无法创建web项目以及其他项.解决方法是手动安装步骤如下: 首先安装好 MyEclipse 8.6. 1 ...

  9. hosting company 的 mail , localhost send 不到

    不是每一家 hosting 的 mail 都运行你在本地连接发email的. 或许是因为安全的顾虑吧. 总之下次如果发现在本地发不出email,可以试试看 upload to server. 过往经验 ...

  10. SmartBusinessDevFramework架构设计-1:结构简介

    SmartBusinessDevFramework 简介 基于.net 4.0 开发的企业级系统框架 功能 1 自定义ORM.如果客官喜欢NHibernate EntityFramework ,并对其 ...