你想有多pwn

发布时间 2023-12-07 18:04:45作者: xmh666

第一章

1.1 认识程序

file、ldd

1.2 gdb调试

一、指令
    1、start、run
    
    2、断点
        设置断点 b mian、b *0x123456
        查看断点 info b、i b
        让断点失效 disable b 序号
        恢复断点 enable b 序号
        删除断点 d 序号
        步过、步进、步出 n、s、finish

    3、info r查看寄存器
        · RIP存放当前执行的指令地址
        · RBP存放当前栈帧的栈底地址
        · RSP存放当前栈帧的栈顶地址
        · RAX通用寄存器,存放函数返回值

    4、打印(可做加减)
        · print、p $rbp-0x10

    5、查看内存、设置内存(重要!!!)
        · x/20gx 0x123456 
            · 查看内存: g查看8字节、w查看4字节、b查看2字节
            · x显示16进制、d显示10进制               
        · x/20s 以字符串的形式显示            
        · x/20i $rip 从rip开始编译20行的汇编代码
            · disassemble $rip           
        · x/20b $rbp-0x10 逐字节查看值

        · set *0x123456 = 0x61
        · set *((unsigned int)$ebp) = 0x62

第二章

2.1 ret2csu_x1

一、原理(看汇编语言)
    满足 rbp = rbx + 1 则不会跳转,程序会继续往下到retn        
    · 要能够控制rbp和rbx
    · rbx要等于0,且要能够控制r15(call [r15+rbx*8])
    · r15控制func
    · 三个参数(r12控制rdi、r13控制rsi、r14控制rdx)

二、步骤
    1、先跳转到pop pop pop处
    2、然后ret到上面mov mov mov处
    3、参数设置完之后,控制到call函数
    4、控制程序不跳转继续往下执行add pop pop pop
1、先控制程序到pop_rbx_addr然后
2、rbx=0、rbp=1、r12=arg1、r13=arg2、r14=arg3、r15=call func(GOT表地址)
3、然后,ret到mov_rdx_r14_addr
4、加上7*p64(0xdeadbeef),最后在加上一个返回地址
5、!!!注意 !!!
    · 由于是直接call,所以函数地址r12必须是got表地址,不能是plt或栈上地址
    · 所以有必要调用一次read_got,把泄露的system和/bin/sh\00写到bss段
    · 最后再(注意sleep(1))

2.2 总结+杂项

一、防护(NX、Canary、PIE、RELRO)
二、栈迁移(自学)

栈迁移(自学)

    · 用法:栈溢出空间不足以布置栈
    · 步骤:
        1、动态调式泄露s的真实地址
            · 把s字段数据填满,由于没有\00截断符,所以print会打印ebp
            · 再通过动态调试用ebp-0x38得到s_addr起始地址
        2、接下来通过第二个read,在s的内存中布置payload
            · bin_sh_addr = s_addr + 16(system_addr+12)
            · fake_ebp = s_addr - 4
        3、