pwn学习(一)

已经大二上了,一直在划水,要重新开始学习了
我要做到不打比赛时看书,打比赛写wp,太懒了
32位传参,返回地址,另一个返回地址,参数,压栈
64位传参,gcc 寄存器 rdi rsi dx rcx r8 r9(参数),返回地址(压栈)
(1)栈溢出
basic_rop
1.ret2text
这个比较弱智,自带system(’/bin/sh’),只要改一下返回地址就行
2,ret2shellcode
这种的话用pwntool自带的shellcraft,sh()构造放在bss段或者栈上就行了,比较简单
3.ret2syscall
这个不是用传统的system(’/bin/sh’),而是使用systemcall,系统调用号,32位 0xb
64位 59 有时得自己构造gadgets,但有时可以用one_gadget 主要看题目
4.ret2libc
泄露 __libc_start_main 地址(可以是别的)
获取 libc 版本
获取 system 地址与 /bin/sh 的地址
再次执行源程序
触发栈溢出执行 system(‘/bin/sh’)
关键要泄露地址
中级rop
就看了一个
1.csu
主要它可以改寄存器rbx=0,rbp=1,
我们可以将 r13 赋给 rdx,将 r14 赋给 rsi,将 r15d 赋给 edi(需要注意的是,虽然这里赋给的是 edi,但其实此时 rdi 的高 32 位寄存器值为 0(自行调试),所以其实我们可以控制 rdi 寄存器的值,只不过只能控制低 32 位),而这三个寄存器,也是 x64 函数调用中传递的前三个寄存器。此外,如果我们可以合理地控制 r12 与 rbx,那么我们就可以调用我们想要调用的函数。比如说我们可以控制 rbx 为 0,r12 为存储我们想要调用的函数的地址
通用exp

def csu(rbx, rbp, r12, r13, r14, r15, last):
    # pop rbx,rbp,r12,r13,r14,r15
    # rbx should be 0,
    # rbp should be 1,enable not to jump
    # r12 should be the function we want to call
    # rdi=edi=r15d
    # rsi=r14
    # rdx=r13
    payload = 'a' * 0x80 + fakeebp
    payload += p64(csu_end_addr) + p64(rbx) + p64(rbp) + p64(r12) + p64(
        r13) + p64(r14) + p64(r15)
    payload += p64(csu_front_addr)
    payload += 'a' * 0x38
    payload += p64(last)
    sh.send(payload)
    sleep(1)

其他花里胡哨的
栈迁移
关键是两个leave_ret跳转到ebp-4,同时修改栈的地址,我也不是很懂,等再研究研究

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值