c嵌入汇编指令与strcpy缓冲区溢出测试怎么弄?

AeNet 2016-02-15 10:51:46
#include <stdio.h>
#include <string>
char name[] = "abcdefg12345678"; //大于8位 字符串
void a(char* name)
{
char output[8];
strcpy(output, name);
printf("%s\n", output);
}
void main()
{
a(name);
_asm
{
mov eax,0xCC
mov byte ptr ds:[00401A2C],eax
call 00401A2C
}
}
C中插入汇编代码,mov byte ptr ds:[00401A2C],eax 总出错
1.嵌入汇编中 如何操作内存?这个内存地址 是我随机选的 用来保存一个断点指令CC,然后代替getchar()/system("pause")带暂停下控制台.不知道我的这种想法能否实现
2.此程序 我是模仿<挖0day>想用来测试 strcpy函数缓冲区溢出攻击的,但VS立即弹出了栈溢出。而且我VS写的程序 拖到虚拟机XP上 直接弹出无效win32程序。不知道该怎么做这个缓冲区攻击实验? 《挖0day》书上是用vc++6.0写的
求各位大神指点迷津~!!!
...全文
197 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-02-17
  • 打赏
  • 举报
回复
《The Intel 64 and IA-32 Architectures Software Developer's Manual》
paschen 版主 2016-02-17
  • 打赏
  • 举报
回复
1、 jmp没这种用法 2、 检查是否可读:IsBadReadPtr 检查是否可写:IsBadWritePtr 检测是否代码段:IsBadCodePtr
paschen 版主 2016-02-17
  • 打赏
  • 举报
回复
引用 8 楼 u013315260 的回复:
[quote=引用 6 楼 paschen 的回复:]

	_asm
	{
		mov al,0xCC;
		mov byte ptr ds:[00401A2Ch],al;
		mov eax, [00401A2Ch];
		call eax;
	}
而且 我在汇编指令末尾 加了;号,不知道汇编指令需不需要加这个?[/quote] 汇编十六进制后面要加h , 我已经帮你加上了,你图片里没有!
赵4老师 2016-02-17
  • 打赏
  • 举报
回复
只要你确定一定以及肯定00401A2Ch这个地址处的指令是位于你的进程中且jmp过去后不会在未来发生堆栈不平衡问题,你完全可以 用__asm _emit 0xXX __asm _emit 0xXX __asm _emit 0xXX __asm _emit 0xXX __asm _emit 0xXX实现和JMP 00401A2Ch 一样的功能,这样编译器就不会提示“不合适的操作数类型 improper operand type”了。 建议楼主通读MSDN中“Assembler (Inline) Topics”相关章节。
赵4老师 2016-02-17
  • 打赏
  • 举报
回复
Jumping to Labels in Inline Assembly Home | Overview | How Do I Like an ordinary C or C++ label, a label in an __asm block has scope throughout the function in which it is defined (not only in the block). Both assembly instructions and goto statements can jump to labels inside or outside the __asm block. Labels defined in __asm blocks are not case sensitive; both goto statements and assembly instructions can refer to those labels without regard to case. C and C++ labels are case sensitive only when used by goto statements. Assembly instructions can jump to a C or C++ label without regard to case. The following code shows all the permutations: void func( void ) { goto C_Dest; /* Legal: correct case */ goto c_dest; /* Error: incorrect case */ goto A_Dest; /* Legal: correct case */ goto a_dest; /* Legal: incorrect case */ __asm { jmp C_Dest ; Legal: correct case jmp c_dest ; Legal: incorrect case jmp A_Dest ; Legal: correct case jmp a_dest ; Legal: incorrect case a_dest: ; __asm label } C_Dest: /* C label */ return; } Don’t use C library function names as labels in __asm blocks. For instance, you might be tempted to use exit as a label, as follows: ; BAD TECHNIQUE: using library function name as label jne exit . . . exit: ; More __asm code follows Because exit is the name of a C library function, this code might cause a jump to the exit function instead of to the desired location. As in MASM programs, the dollar symbol ($) serves as the current location counter. It is a label for the instruction currently being assembled. In __asm blocks, its main use is to make long conditional jumps: jne $+5 ; next instruction is 5 bytes long jmp farlabel ; $+5 . . . farlabel:
AeNet 2016-02-17
  • 打赏
  • 举报
回复
引用 6 楼 paschen 的回复:

	_asm
	{
		mov al,0xCC;
		mov byte ptr ds:[00401A2Ch],al;
		mov eax, [00401A2Ch];
		call eax;
	}
而且 我在汇编指令末尾 加了;号,不知道汇编指令需不需要加这个?
AeNet 2016-02-17
  • 打赏
  • 举报
回复
引用 6 楼 paschen 的回复:

_asm
{
mov al,0xCC;
mov byte ptr ds:[00401A2Ch],al;
mov eax, [00401A2Ch];
call eax;
}


总是出这个错误呀 版主
AeNet 2016-02-17
  • 打赏
  • 举报
回复
引用 9 楼 paschen 的回复:
[quote=引用 8 楼 u013315260 的回复:] [quote=引用 6 楼 paschen 的回复:]

	_asm
	{
		mov al,0xCC;
		mov byte ptr ds:[00401A2Ch],al;
		mov eax, [00401A2Ch];
		call eax;
	}
而且 我在汇编指令末尾 加了;号,不知道汇编指令需不需要加这个?[/quote] 汇编十六进制后面要加h , 我已经帮你加上了,你图片里没有![/quote] 还有两个问题 1. JMP 00401A2Ch 直接跳到一个地址 为什么提示不合适的操作数类型 improper operand type? 2. 提示我 那个内存空间 写操作拒绝访问了,如何知道哪个段可写呀? PE结构不是 00401000以上左右的地方都是 数据段吗?
AeNet 2016-02-17
  • 打赏
  • 举报
回复
引用 9 楼 paschen 的回复:
[quote=引用 8 楼 u013315260 的回复:] [quote=引用 6 楼 paschen 的回复:]

	_asm
	{
		mov al,0xCC;
		mov byte ptr ds:[00401A2Ch],al;
		mov eax, [00401A2Ch];
		call eax;
	}
而且 我在汇编指令末尾 加了;号,不知道汇编指令需不需要加这个?[/quote] 汇编十六进制后面要加h , 我已经帮你加上了,你图片里没有![/quote]
引用 9 楼 paschen 的回复:
[quote=引用 8 楼 u013315260 的回复:] [quote=引用 6 楼 paschen 的回复:]

	_asm
	{
		mov al,0xCC;
		mov byte ptr ds:[00401A2Ch],al;
		mov eax, [00401A2Ch];
		call eax;
	}
而且 我在汇编指令末尾 加了;号,不知道汇编指令需不需要加这个?[/quote] 汇编十六进制后面要加h , 我已经帮你加上了,你图片里没有![/quote] 原来出在这里呀 多谢版主呀
paschen 版主 2016-02-16
  • 打赏
  • 举报
回复

_asm
{
mov al,0xCC;
mov byte ptr ds:[00401A2Ch],al;
mov eax, [00401A2Ch];
call eax;
}
AeNet 2016-02-16
  • 打赏
  • 举报
回复
引用 1 楼 paschen 的回复:
项目属性有一个 缓冲区安全检查 (/GS) 设置为否
谢谢 版主 mov byte ptr ds:[00401A2C],eax 这条指令该怎么写呀? 能不能自定义一个内存地址 然后覆盖它? 作为执行断点CC / int3 然而这个问题该怎么解呀 版主
赵4老师 2016-02-16
  • 打赏
  • 举报
回复
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程! 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步Debug版对应汇编一行! 单步Debug版对应汇编千行不如单步Release版对应汇编一行! 不会单步Release版对应汇编?在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有,然后在IDE中运行。(一般人我不告诉他!) VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
AeNet 2016-02-16
  • 打赏
  • 举报
回复
引用 2 楼 lianshaohua 的回复:
按楼上大神的方法试试应该能解决,另外可以试试release编译模式
release编译模式不检查 栈溢出吗? mov byte ptr ds:[00401A2C],eax 这条指令该怎么写呀? 能不能自定义一个内存地址 然后覆盖它? 作为执行断点
ztenv 版主 2016-02-16
  • 打赏
  • 举报
回复
按楼上大神的方法试试应该能解决,另外可以试试release编译模式
paschen 版主 2016-02-15
  • 打赏
  • 举报
回复
项目属性有一个 缓冲区安全检查 (/GS) 设置为否

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧